xref: /aosp_15_r20/external/libwebsockets/lib/roles/h2/minihuf.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * minilex.c
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * High efficiency lexical state parser
5*1c60b9acSAndroid Build Coastguard Worker  *
6*1c60b9acSAndroid Build Coastguard Worker  * Copyright (C)2011-2014 Andy Green <[email protected]>
7*1c60b9acSAndroid Build Coastguard Worker  *
8*1c60b9acSAndroid Build Coastguard Worker  * Licensed under MIT
9*1c60b9acSAndroid Build Coastguard Worker  *
10*1c60b9acSAndroid Build Coastguard Worker  * Usage: gcc minihuf.c -o minihuf && ./minihuf > huftable.h
11*1c60b9acSAndroid Build Coastguard Worker  *
12*1c60b9acSAndroid Build Coastguard Worker  * Run it twice to test parsing on the generated table on stderr
13*1c60b9acSAndroid Build Coastguard Worker  */
14*1c60b9acSAndroid Build Coastguard Worker 
15*1c60b9acSAndroid Build Coastguard Worker #include <stdio.h>
16*1c60b9acSAndroid Build Coastguard Worker #include <stdlib.h>
17*1c60b9acSAndroid Build Coastguard Worker #include <string.h>
18*1c60b9acSAndroid Build Coastguard Worker 
19*1c60b9acSAndroid Build Coastguard Worker #define LWS_ARRAY_SIZE(n) (sizeof(n) / sizeof(n[0]))
20*1c60b9acSAndroid Build Coastguard Worker 
21*1c60b9acSAndroid Build Coastguard Worker struct huf {
22*1c60b9acSAndroid Build Coastguard Worker 	unsigned int code;
23*1c60b9acSAndroid Build Coastguard Worker 	unsigned char len;
24*1c60b9acSAndroid Build Coastguard Worker };
25*1c60b9acSAndroid Build Coastguard Worker 
26*1c60b9acSAndroid Build Coastguard Worker static struct huf huf_literal[] = {
27*1c60b9acSAndroid Build Coastguard Worker 	/* 0x00 */ { 0x1ff8, 13 },
28*1c60b9acSAndroid Build Coastguard Worker 	/* 0x01 */ { 0x7fffd8, 23 },
29*1c60b9acSAndroid Build Coastguard Worker 	/* 0x02 */ { 0xfffffe2, 28 },
30*1c60b9acSAndroid Build Coastguard Worker 	/* 0x03 */ { 0xfffffe3, 28 },
31*1c60b9acSAndroid Build Coastguard Worker 	/* 0x04 */ { 0xfffffe4, 28 },
32*1c60b9acSAndroid Build Coastguard Worker 	/* 0x05 */ { 0xfffffe5, 28 },
33*1c60b9acSAndroid Build Coastguard Worker 	/* 0x06 */ { 0xfffffe6, 28 },
34*1c60b9acSAndroid Build Coastguard Worker 	/* 0x07 */ { 0xfffffe7, 28 },
35*1c60b9acSAndroid Build Coastguard Worker 	/* 0x08 */ { 0xfffffe8, 28 },
36*1c60b9acSAndroid Build Coastguard Worker 	/* 0x09 */ { 0xffffea, 24 },
37*1c60b9acSAndroid Build Coastguard Worker 	/* 0x0a */ { 0x3ffffffc, 30 },
38*1c60b9acSAndroid Build Coastguard Worker 	/* 0x0b */ { 0xfffffe9, 28 },
39*1c60b9acSAndroid Build Coastguard Worker 
40*1c60b9acSAndroid Build Coastguard Worker 	/* 0x0c */ { 0xfffffea, 28 },
41*1c60b9acSAndroid Build Coastguard Worker 	/* 0x0d */ { 0x3ffffffd, 30 },
42*1c60b9acSAndroid Build Coastguard Worker 	/* 0x0e */ { 0xfffffeb, 28 },
43*1c60b9acSAndroid Build Coastguard Worker 	/* 0x0f */ { 0xfffffec, 28 },
44*1c60b9acSAndroid Build Coastguard Worker 	/* 0x10 */ { 0xfffffed, 28 },
45*1c60b9acSAndroid Build Coastguard Worker 	/* 0x11 */ { 0xfffffee, 28 },
46*1c60b9acSAndroid Build Coastguard Worker 	/* 0x12 */ { 0xfffffef, 28 },
47*1c60b9acSAndroid Build Coastguard Worker 	/* 0x13 */ { 0xffffff0, 28 },
48*1c60b9acSAndroid Build Coastguard Worker 	/* 0x14 */ { 0xffffff1, 28 },
49*1c60b9acSAndroid Build Coastguard Worker 	/* 0x15 */ { 0xffffff2, 28 },
50*1c60b9acSAndroid Build Coastguard Worker 	/* 0x16 */ { 0x3ffffffe, 30 },
51*1c60b9acSAndroid Build Coastguard Worker 	/* 0x17 */ { 0xffffff3, 28 },
52*1c60b9acSAndroid Build Coastguard Worker 	/* 0x18 */ { 0xffffff4, 28 },
53*1c60b9acSAndroid Build Coastguard Worker 	/* 0x19 */ { 0xffffff5, 28 },
54*1c60b9acSAndroid Build Coastguard Worker 	/* 0x1a */ { 0xffffff6, 28 },
55*1c60b9acSAndroid Build Coastguard Worker 	/* 0x1b */ { 0xffffff7, 28 },
56*1c60b9acSAndroid Build Coastguard Worker 	/* 0x1c */ { 0xffffff8, 28 },
57*1c60b9acSAndroid Build Coastguard Worker 	/* 0x1d */ { 0xffffff9, 28 },
58*1c60b9acSAndroid Build Coastguard Worker 	/* 0x1e */ { 0xffffffa, 28 },
59*1c60b9acSAndroid Build Coastguard Worker 	/* 0x1f */ { 0xffffffb, 28 },
60*1c60b9acSAndroid Build Coastguard Worker 	/* 0x20 */ { 0x14, 6 },
61*1c60b9acSAndroid Build Coastguard Worker 	/* 0x21 */ { 0x3f8, 10 },
62*1c60b9acSAndroid Build Coastguard Worker 	/* 0x22 */ { 0x3f9, 10 },
63*1c60b9acSAndroid Build Coastguard Worker 	/* 0x23 */ { 0xffa, 12 },
64*1c60b9acSAndroid Build Coastguard Worker 	/* 0x24 */ { 0x1ff9, 13 },
65*1c60b9acSAndroid Build Coastguard Worker 	/* 0x25 */ { 0x15, 6 },
66*1c60b9acSAndroid Build Coastguard Worker 	/* 0x26 */ { 0xf8, 8 },
67*1c60b9acSAndroid Build Coastguard Worker 	/* 0x27 */ { 0x7fa, 11 },
68*1c60b9acSAndroid Build Coastguard Worker 	/* 0x28 */ { 0x3fa, 10 },
69*1c60b9acSAndroid Build Coastguard Worker 	/* 0x29 */ { 0x3fb, 10 },
70*1c60b9acSAndroid Build Coastguard Worker 	/* 0x2a */ { 0xf9, 8 },
71*1c60b9acSAndroid Build Coastguard Worker 	/* 0x2b */ { 0x7fb, 11 },
72*1c60b9acSAndroid Build Coastguard Worker 	/* 0x2c */ { 0xfa, 8 },
73*1c60b9acSAndroid Build Coastguard Worker 	/* 0x2d */ { 0x16, 6 },
74*1c60b9acSAndroid Build Coastguard Worker 	/* 0x2e */ { 0x17, 6 },
75*1c60b9acSAndroid Build Coastguard Worker 	/* 0x2f */ { 0x18, 6 },
76*1c60b9acSAndroid Build Coastguard Worker 	/* 0x30 */ { 0x0, 5 },
77*1c60b9acSAndroid Build Coastguard Worker 	/* 0x31 */ { 0x1, 5 },
78*1c60b9acSAndroid Build Coastguard Worker 	/* 0x32 */ { 0x2, 5 },
79*1c60b9acSAndroid Build Coastguard Worker 	/* 0x33 */ { 0x19, 6 },
80*1c60b9acSAndroid Build Coastguard Worker 	/* 0x34 */ { 0x1a, 6 },
81*1c60b9acSAndroid Build Coastguard Worker 	/* 0x35 */ { 0x1b, 6 },
82*1c60b9acSAndroid Build Coastguard Worker 	/* 0x36 */ { 0x1c, 6 },
83*1c60b9acSAndroid Build Coastguard Worker 	/* 0x37 */ { 0x1d, 6 },
84*1c60b9acSAndroid Build Coastguard Worker 	/* 0x38 */ { 0x1e, 6 },
85*1c60b9acSAndroid Build Coastguard Worker 	/* 0x39 */ { 0x1f, 6 },
86*1c60b9acSAndroid Build Coastguard Worker 	/* 0x3a */ { 0x5c, 7 },
87*1c60b9acSAndroid Build Coastguard Worker 	/* 0x3b */ { 0xfb, 8 },
88*1c60b9acSAndroid Build Coastguard Worker 
89*1c60b9acSAndroid Build Coastguard Worker 	/* 0x3c */ { 0x7ffc, 15 },
90*1c60b9acSAndroid Build Coastguard Worker 	/* 0x3d */ { 0x20, 6 },
91*1c60b9acSAndroid Build Coastguard Worker 	/* 0x3e */ { 0xffb, 12 },
92*1c60b9acSAndroid Build Coastguard Worker 	/* 0x3f */ { 0x3fc, 10 },
93*1c60b9acSAndroid Build Coastguard Worker 	/* 0x40 */ { 0x1ffa, 13 },
94*1c60b9acSAndroid Build Coastguard Worker 	/* 0x41 */ { 0x21, 6 },
95*1c60b9acSAndroid Build Coastguard Worker 	/* 0x42 */ { 0x5d, 7 },
96*1c60b9acSAndroid Build Coastguard Worker 	/* 0x43 */ { 0x5e, 7 },
97*1c60b9acSAndroid Build Coastguard Worker 	/* 0x44 */ { 0x5f, 7 },
98*1c60b9acSAndroid Build Coastguard Worker 	/* 0x45 */ { 0x60, 7 },
99*1c60b9acSAndroid Build Coastguard Worker 	/* 0x46 */ { 0x61, 7 },
100*1c60b9acSAndroid Build Coastguard Worker 	/* 0x47 */ { 0x62, 7 },
101*1c60b9acSAndroid Build Coastguard Worker 	/* 0x48 */ { 0x63, 7 },
102*1c60b9acSAndroid Build Coastguard Worker 	/* 0x49 */ { 0x64, 7 },
103*1c60b9acSAndroid Build Coastguard Worker 	/* 0x4a */ { 0x65, 7 },
104*1c60b9acSAndroid Build Coastguard Worker 	/* 0x4b */ { 0x66, 7 },
105*1c60b9acSAndroid Build Coastguard Worker 	/* 0x4c */ { 0x67, 7 },
106*1c60b9acSAndroid Build Coastguard Worker 	/* 0x4d */ { 0x68, 7 },
107*1c60b9acSAndroid Build Coastguard Worker 	/* 0x4e */ { 0x69, 7 },
108*1c60b9acSAndroid Build Coastguard Worker 	/* 0x4f */ { 0x6a, 7 },
109*1c60b9acSAndroid Build Coastguard Worker 	/* 0x50 */ { 0x6b, 7 },
110*1c60b9acSAndroid Build Coastguard Worker 	/* 0x51 */ { 0x6c, 7 },
111*1c60b9acSAndroid Build Coastguard Worker 	/* 0x52 */ { 0x6d, 7 },
112*1c60b9acSAndroid Build Coastguard Worker 	/* 0x53 */ { 0x6e, 7 },
113*1c60b9acSAndroid Build Coastguard Worker 	/* 0x54 */ { 0x6f, 7 },
114*1c60b9acSAndroid Build Coastguard Worker 	/* 0x55 */ { 0x70, 7 },
115*1c60b9acSAndroid Build Coastguard Worker 	/* 0x56 */ { 0x71, 7 },
116*1c60b9acSAndroid Build Coastguard Worker 	/* 0x57 */ { 0x72, 7 },
117*1c60b9acSAndroid Build Coastguard Worker 	/* 0x58 */ { 0xfc, 8 },
118*1c60b9acSAndroid Build Coastguard Worker 	/* 0x59 */ { 0x73, 7 },
119*1c60b9acSAndroid Build Coastguard Worker 	/* 0x5a */ { 0xfd, 8 },
120*1c60b9acSAndroid Build Coastguard Worker 	/* 0x5b */ { 0x1ffb, 13 },
121*1c60b9acSAndroid Build Coastguard Worker 	/* 0x5c */ { 0x7fff0, 19 },
122*1c60b9acSAndroid Build Coastguard Worker 	/* 0x5d */ { 0x1ffc, 13 },
123*1c60b9acSAndroid Build Coastguard Worker 	/* 0x5e */ { 0x3ffc, 14 },
124*1c60b9acSAndroid Build Coastguard Worker 	/* 0x5f */ { 0x22, 6 },
125*1c60b9acSAndroid Build Coastguard Worker 	/* 0x60 */ { 0x7ffd, 15 },
126*1c60b9acSAndroid Build Coastguard Worker 	/* 0x61 */ { 0x3, 5 },
127*1c60b9acSAndroid Build Coastguard Worker 	/* 0x62 */ { 0x23, 6 },
128*1c60b9acSAndroid Build Coastguard Worker 	/* 0x63 */ { 0x4, 5 },
129*1c60b9acSAndroid Build Coastguard Worker 	/* 0x64 */ { 0x24, 6 },
130*1c60b9acSAndroid Build Coastguard Worker 	/* 0x65 */ { 0x5, 5 },
131*1c60b9acSAndroid Build Coastguard Worker 	/* 0x66 */ { 0x25, 6 },
132*1c60b9acSAndroid Build Coastguard Worker 	/* 0x67 */ { 0x26, 6 },
133*1c60b9acSAndroid Build Coastguard Worker 	/* 0x68 */ { 0x27, 6 },
134*1c60b9acSAndroid Build Coastguard Worker 	/* 0x69 */ { 0x6, 5 },
135*1c60b9acSAndroid Build Coastguard Worker 	/* 0x6a */ { 0x74, 7 },
136*1c60b9acSAndroid Build Coastguard Worker 	/* 0x6b */ { 0x75, 7 },
137*1c60b9acSAndroid Build Coastguard Worker 
138*1c60b9acSAndroid Build Coastguard Worker 
139*1c60b9acSAndroid Build Coastguard Worker 	/* 0x6c */ { 0x28, 6 },
140*1c60b9acSAndroid Build Coastguard Worker 	/* 0x6d */ { 0x29, 6 },
141*1c60b9acSAndroid Build Coastguard Worker 	/* 0x6e */ { 0x2a, 6 },
142*1c60b9acSAndroid Build Coastguard Worker 	/* 0x6f */ { 0x7, 5 },
143*1c60b9acSAndroid Build Coastguard Worker 	/* 0x70 */ { 0x2b, 6 },
144*1c60b9acSAndroid Build Coastguard Worker 	/* 0x71 */ { 0x76, 7 },
145*1c60b9acSAndroid Build Coastguard Worker 	/* 0x72 */ { 0x2c, 6 },
146*1c60b9acSAndroid Build Coastguard Worker 	/* 0x73 */ { 0x8, 5 },
147*1c60b9acSAndroid Build Coastguard Worker 	/* 0x74 */ { 0x9, 5 },
148*1c60b9acSAndroid Build Coastguard Worker 	/* 0x75 */ { 0x2d, 6 },
149*1c60b9acSAndroid Build Coastguard Worker 	/* 0x76 */ { 0x77, 7 },
150*1c60b9acSAndroid Build Coastguard Worker 	/* 0x77 */ { 0x78, 7 },
151*1c60b9acSAndroid Build Coastguard Worker 	/* 0x78 */ { 0x79, 7 },
152*1c60b9acSAndroid Build Coastguard Worker 	/* 0x79 */ { 0x7a, 7 },
153*1c60b9acSAndroid Build Coastguard Worker 	/* 0x7a */ { 0x7b, 7 },
154*1c60b9acSAndroid Build Coastguard Worker 	/* 0x7b */ { 0x7ffe, 15 },
155*1c60b9acSAndroid Build Coastguard Worker 	/* 0x7c */ { 0x7fc, 11 },
156*1c60b9acSAndroid Build Coastguard Worker 	/* 0x7d */ { 0x3ffd, 14 },
157*1c60b9acSAndroid Build Coastguard Worker 	/* 0x7e */ { 0x1ffd, 13 },
158*1c60b9acSAndroid Build Coastguard Worker 	/* 0x7f */ { 0xffffffc, 28 },
159*1c60b9acSAndroid Build Coastguard Worker 	/* 0x80 */ { 0xfffe6, 20 },
160*1c60b9acSAndroid Build Coastguard Worker 	/* 0x81 */ { 0x3fffd2, 22 },
161*1c60b9acSAndroid Build Coastguard Worker 	/* 0x82 */ { 0xfffe7, 20 },
162*1c60b9acSAndroid Build Coastguard Worker 	/* 0x83 */ { 0xfffe8, 20 },
163*1c60b9acSAndroid Build Coastguard Worker 	/* 0x84 */ { 0x3fffd3, 22 },
164*1c60b9acSAndroid Build Coastguard Worker 	/* 0x85 */ { 0x3fffd4, 22 },
165*1c60b9acSAndroid Build Coastguard Worker 	/* 0x86 */ { 0x3fffd5, 22 },
166*1c60b9acSAndroid Build Coastguard Worker 	/* 0x87 */ { 0x7fffd9, 23 },
167*1c60b9acSAndroid Build Coastguard Worker 	/* 0x88 */ { 0x3fffd6, 22 },
168*1c60b9acSAndroid Build Coastguard Worker 	/* 0x89 */ { 0x7fffda, 23 },
169*1c60b9acSAndroid Build Coastguard Worker 	/* 0x8a */ { 0x7fffdb, 23 },
170*1c60b9acSAndroid Build Coastguard Worker 	/* 0x8b */ { 0x7fffdc, 23 },
171*1c60b9acSAndroid Build Coastguard Worker 	/* 0x8c */ { 0x7fffdd, 23 },
172*1c60b9acSAndroid Build Coastguard Worker 	/* 0x8d */ { 0x7fffde, 23 },
173*1c60b9acSAndroid Build Coastguard Worker 	/* 0x8e */ { 0xffffeb, 24 },
174*1c60b9acSAndroid Build Coastguard Worker 	/* 0x8f */ { 0x7fffdf, 23 },
175*1c60b9acSAndroid Build Coastguard Worker 	/* 0x90 */ { 0xffffec, 24 },
176*1c60b9acSAndroid Build Coastguard Worker 	/* 0x91 */ { 0xffffed, 24 },
177*1c60b9acSAndroid Build Coastguard Worker 	/* 0x92 */ { 0x3fffd7, 22 },
178*1c60b9acSAndroid Build Coastguard Worker 	/* 0x93 */ { 0x7fffe0, 23 },
179*1c60b9acSAndroid Build Coastguard Worker 	/* 0x94 */ { 0xffffee, 24 },
180*1c60b9acSAndroid Build Coastguard Worker 	/* 0x95 */ { 0x7fffe1, 23 },
181*1c60b9acSAndroid Build Coastguard Worker 	/* 0x96 */ { 0x7fffe2, 23 },
182*1c60b9acSAndroid Build Coastguard Worker 	/* 0x97 */ { 0x7fffe3, 23 },
183*1c60b9acSAndroid Build Coastguard Worker 	/* 0x98 */ { 0x7fffe4, 23 },
184*1c60b9acSAndroid Build Coastguard Worker 	/* 0x99 */ { 0x1fffdc, 21 },
185*1c60b9acSAndroid Build Coastguard Worker 	/* 0x9a */ { 0x3fffd8, 22 },
186*1c60b9acSAndroid Build Coastguard Worker 	/* 0x9b */ { 0x7fffe5, 23 },
187*1c60b9acSAndroid Build Coastguard Worker 
188*1c60b9acSAndroid Build Coastguard Worker 	/* 0x9c */ { 0x3fffd9, 22 },
189*1c60b9acSAndroid Build Coastguard Worker 	/* 0x9d */ { 0x7fffe6, 23 },
190*1c60b9acSAndroid Build Coastguard Worker 	/* 0x9e */ { 0x7fffe7, 23 },
191*1c60b9acSAndroid Build Coastguard Worker 	/* 0x9f */ { 0xffffef, 24 },
192*1c60b9acSAndroid Build Coastguard Worker 	/* 0xa0 */ { 0x3fffda, 22 },
193*1c60b9acSAndroid Build Coastguard Worker 	/* 0xa1 */ { 0x1fffdd, 21 },
194*1c60b9acSAndroid Build Coastguard Worker 	/* 0xa2 */ { 0xfffe9, 20 },
195*1c60b9acSAndroid Build Coastguard Worker 	/* 0xa3 */ { 0x3fffdb, 22 },
196*1c60b9acSAndroid Build Coastguard Worker 	/* 0xa4 */ { 0x3fffdc, 22 },
197*1c60b9acSAndroid Build Coastguard Worker 	/* 0xa5 */ { 0x7fffe8, 23 },
198*1c60b9acSAndroid Build Coastguard Worker 	/* 0xa6 */ { 0x7fffe9, 23 },
199*1c60b9acSAndroid Build Coastguard Worker 	/* 0xa7 */ { 0x1fffde, 21 },
200*1c60b9acSAndroid Build Coastguard Worker 	/* 0xa8 */ { 0x7fffea, 23 },
201*1c60b9acSAndroid Build Coastguard Worker 	/* 0xa9 */ { 0x3fffdd, 22 },
202*1c60b9acSAndroid Build Coastguard Worker 	/* 0xaa */ { 0x3fffde, 22 },
203*1c60b9acSAndroid Build Coastguard Worker 	/* 0xab */ { 0xfffff0, 24 },
204*1c60b9acSAndroid Build Coastguard Worker 	/* 0xac */ { 0x1fffdf, 21 },
205*1c60b9acSAndroid Build Coastguard Worker 	/* 0xad */ { 0x3fffdf, 22 },
206*1c60b9acSAndroid Build Coastguard Worker 	/* 0xae */ { 0x7fffeb, 23 },
207*1c60b9acSAndroid Build Coastguard Worker 	/* 0xaf */ { 0x7fffec, 23 },
208*1c60b9acSAndroid Build Coastguard Worker 	/* 0xb0 */ { 0x1fffe0, 21 },
209*1c60b9acSAndroid Build Coastguard Worker 	/* 0xb1 */ { 0x1fffe1, 21 },
210*1c60b9acSAndroid Build Coastguard Worker 	/* 0xb2 */ { 0x3fffe0, 22 },
211*1c60b9acSAndroid Build Coastguard Worker 	/* 0xb3 */ { 0x1fffe2, 21 },
212*1c60b9acSAndroid Build Coastguard Worker 	/* 0xb4 */ { 0x7fffed, 23 },
213*1c60b9acSAndroid Build Coastguard Worker 	/* 0xb5 */ { 0x3fffe1, 22 },
214*1c60b9acSAndroid Build Coastguard Worker 	/* 0xb6 */ { 0x7fffee, 23 },
215*1c60b9acSAndroid Build Coastguard Worker 	/* 0xb7 */ { 0x7fffef, 23 },
216*1c60b9acSAndroid Build Coastguard Worker 	/* 0xb8 */ { 0xfffea, 20 },
217*1c60b9acSAndroid Build Coastguard Worker 	/* 0xb9 */ { 0x3fffe2, 22 },
218*1c60b9acSAndroid Build Coastguard Worker 	/* 0xba */ { 0x3fffe3, 22 },
219*1c60b9acSAndroid Build Coastguard Worker 	/* 0xbb */ { 0x3fffe4, 22 },
220*1c60b9acSAndroid Build Coastguard Worker 	/* 0xbc */ { 0x7ffff0, 23 },
221*1c60b9acSAndroid Build Coastguard Worker 	/* 0xbd */ { 0x3fffe5, 22 },
222*1c60b9acSAndroid Build Coastguard Worker 	/* 0xbe */ { 0x3fffe6, 22 },
223*1c60b9acSAndroid Build Coastguard Worker 	/* 0xbf */ { 0x7ffff1, 23 },
224*1c60b9acSAndroid Build Coastguard Worker 	/* 0xc0 */ { 0x3ffffe0, 26 },
225*1c60b9acSAndroid Build Coastguard Worker 	/* 0xc1 */ { 0x3ffffe1, 26 },
226*1c60b9acSAndroid Build Coastguard Worker 	/* 0xc2 */ { 0xfffeb, 20 },
227*1c60b9acSAndroid Build Coastguard Worker 	/* 0xc3 */ { 0x7fff1, 19 },
228*1c60b9acSAndroid Build Coastguard Worker 	/* 0xc4 */ { 0x3fffe7, 22 },
229*1c60b9acSAndroid Build Coastguard Worker 	/* 0xc5 */ { 0x7ffff2, 23 },
230*1c60b9acSAndroid Build Coastguard Worker 	/* 0xc6 */ { 0x3fffe8, 22 },
231*1c60b9acSAndroid Build Coastguard Worker 	/* 0xc7 */ { 0x1ffffec, 25 },
232*1c60b9acSAndroid Build Coastguard Worker 	/* 0xc8 */ { 0x3ffffe2, 26 },
233*1c60b9acSAndroid Build Coastguard Worker 	/* 0xc9 */ { 0x3ffffe3, 26 },
234*1c60b9acSAndroid Build Coastguard Worker 	/* 0xca */ { 0x3ffffe4, 26 },
235*1c60b9acSAndroid Build Coastguard Worker 	/* 0xcb */ { 0x7ffffde, 27 },
236*1c60b9acSAndroid Build Coastguard Worker 
237*1c60b9acSAndroid Build Coastguard Worker 	/* 0xcc */ { 0x7ffffdf, 27 },
238*1c60b9acSAndroid Build Coastguard Worker 	/* 0xcd */ { 0x3ffffe5, 26 },
239*1c60b9acSAndroid Build Coastguard Worker 	/* 0xce */ { 0xfffff1, 24 },
240*1c60b9acSAndroid Build Coastguard Worker 	/* 0xcf */ { 0x1ffffed, 25 },
241*1c60b9acSAndroid Build Coastguard Worker 	/* 0xd0 */ { 0x7fff2, 19 },
242*1c60b9acSAndroid Build Coastguard Worker 	/* 0xd1 */ { 0x1fffe3, 21 },
243*1c60b9acSAndroid Build Coastguard Worker 	/* 0xd2 */ { 0x3ffffe6, 26 },
244*1c60b9acSAndroid Build Coastguard Worker 	/* 0xd3 */ { 0x7ffffe0, 27 },
245*1c60b9acSAndroid Build Coastguard Worker 	/* 0xd4 */ { 0x7ffffe1, 27 },
246*1c60b9acSAndroid Build Coastguard Worker 	/* 0xd5 */ { 0x3ffffe7, 26 },
247*1c60b9acSAndroid Build Coastguard Worker 	/* 0xd6 */ { 0x7ffffe2, 27 },
248*1c60b9acSAndroid Build Coastguard Worker 	/* 0xd7 */ { 0xfffff2, 24 },
249*1c60b9acSAndroid Build Coastguard Worker 	/* 0xd8 */ { 0x1fffe4, 21 },
250*1c60b9acSAndroid Build Coastguard Worker 	/* 0xd9 */ { 0x1fffe5, 21 },
251*1c60b9acSAndroid Build Coastguard Worker 	/* 0xda */ { 0x3ffffe8, 26 },
252*1c60b9acSAndroid Build Coastguard Worker 	/* 0xdb */ { 0x3ffffe9, 26 },
253*1c60b9acSAndroid Build Coastguard Worker 	/* 0xdc */ { 0xffffffd, 28 },
254*1c60b9acSAndroid Build Coastguard Worker 	/* 0xdd */ { 0x7ffffe3, 27 },
255*1c60b9acSAndroid Build Coastguard Worker 	/* 0xde */ { 0x7ffffe4, 27 },
256*1c60b9acSAndroid Build Coastguard Worker 	/* 0xdf */ { 0x7ffffe5, 27 },
257*1c60b9acSAndroid Build Coastguard Worker 	/* 0xe0 */ { 0xfffec, 20 },
258*1c60b9acSAndroid Build Coastguard Worker 	/* 0xe1 */ { 0xfffff3, 24 },
259*1c60b9acSAndroid Build Coastguard Worker 	/* 0xe2 */ { 0xfffed, 20 },
260*1c60b9acSAndroid Build Coastguard Worker 	/* 0xe3 */ { 0x1fffe6, 21 },
261*1c60b9acSAndroid Build Coastguard Worker 	/* 0xe4 */ { 0x3fffe9, 22 },
262*1c60b9acSAndroid Build Coastguard Worker 	/* 0xe5 */ { 0x1fffe7, 21 },
263*1c60b9acSAndroid Build Coastguard Worker 	/* 0xe6 */ { 0x1fffe8, 21 },
264*1c60b9acSAndroid Build Coastguard Worker 	/* 0xe7 */ { 0x7ffff3, 23 },
265*1c60b9acSAndroid Build Coastguard Worker 	/* 0xe8 */ { 0x3fffea, 22 },
266*1c60b9acSAndroid Build Coastguard Worker 	/* 0xe9 */ { 0x3fffeb, 22 },
267*1c60b9acSAndroid Build Coastguard Worker 	/* 0xea */ { 0x1ffffee, 25 },
268*1c60b9acSAndroid Build Coastguard Worker 	/* 0xeb */ { 0x1ffffef, 25 },
269*1c60b9acSAndroid Build Coastguard Worker 	/* 0xec */ { 0xfffff4, 24 },
270*1c60b9acSAndroid Build Coastguard Worker 	/* 0xed */ { 0xfffff5, 24 },
271*1c60b9acSAndroid Build Coastguard Worker 	/* 0xee */ { 0x3ffffea, 26 },
272*1c60b9acSAndroid Build Coastguard Worker 	/* 0xef */ { 0x7ffff4, 23 },
273*1c60b9acSAndroid Build Coastguard Worker 	/* 0xf0 */ { 0x3ffffeb, 26 },
274*1c60b9acSAndroid Build Coastguard Worker 	/* 0xf1 */ { 0x7ffffe6, 27 },
275*1c60b9acSAndroid Build Coastguard Worker 	/* 0xf2 */ { 0x3ffffec, 26 },
276*1c60b9acSAndroid Build Coastguard Worker 	/* 0xf3 */ { 0x3ffffed, 26 },
277*1c60b9acSAndroid Build Coastguard Worker 	/* 0xf4 */ { 0x7ffffe7, 27 },
278*1c60b9acSAndroid Build Coastguard Worker 	/* 0xf5 */ { 0x7ffffe8, 27 },
279*1c60b9acSAndroid Build Coastguard Worker 	/* 0xf6 */ { 0x7ffffe9, 27 },
280*1c60b9acSAndroid Build Coastguard Worker 	/* 0xf7 */ { 0x7ffffea, 27 },
281*1c60b9acSAndroid Build Coastguard Worker 	/* 0xf8 */ { 0x7ffffeb, 27 },
282*1c60b9acSAndroid Build Coastguard Worker 	/* 0xf9 */ { 0xffffffe, 28 },
283*1c60b9acSAndroid Build Coastguard Worker 	/* 0xfa */ { 0x7ffffec, 27 },
284*1c60b9acSAndroid Build Coastguard Worker 	/* 0xfb */ { 0x7ffffed, 27 },
285*1c60b9acSAndroid Build Coastguard Worker 
286*1c60b9acSAndroid Build Coastguard Worker 	/* 0xfc */ { 0x7ffffee, 27 },
287*1c60b9acSAndroid Build Coastguard Worker 	/* 0xfd */ { 0x7ffffef, 27 },
288*1c60b9acSAndroid Build Coastguard Worker 	/* 0xfe */ { 0x7fffff0, 27 },
289*1c60b9acSAndroid Build Coastguard Worker 	/* 0xff */ { 0x3ffffee, 26 },
290*1c60b9acSAndroid Build Coastguard Worker 	/* 0x100 */ { 0x3fffffff, 30 },
291*1c60b9acSAndroid Build Coastguard Worker };
292*1c60b9acSAndroid Build Coastguard Worker 
code_bit(int idx,int bit)293*1c60b9acSAndroid Build Coastguard Worker int code_bit(int idx, int bit)
294*1c60b9acSAndroid Build Coastguard Worker {
295*1c60b9acSAndroid Build Coastguard Worker 	if (bit < huf_literal[idx].len)
296*1c60b9acSAndroid Build Coastguard Worker 		return !!(huf_literal[idx].code & (1 << (huf_literal[idx].len - 1 - bit)));
297*1c60b9acSAndroid Build Coastguard Worker 
298*1c60b9acSAndroid Build Coastguard Worker 	return -1;
299*1c60b9acSAndroid Build Coastguard Worker }
300*1c60b9acSAndroid Build Coastguard Worker 
301*1c60b9acSAndroid Build Coastguard Worker #include "huftable.h"
302*1c60b9acSAndroid Build Coastguard Worker 
303*1c60b9acSAndroid Build Coastguard Worker #define PARALLEL 2
304*1c60b9acSAndroid Build Coastguard Worker 
305*1c60b9acSAndroid Build Coastguard Worker struct state {
306*1c60b9acSAndroid Build Coastguard Worker 	int terminal;
307*1c60b9acSAndroid Build Coastguard Worker 	int state[PARALLEL];
308*1c60b9acSAndroid Build Coastguard Worker 	int bytepos;
309*1c60b9acSAndroid Build Coastguard Worker 
310*1c60b9acSAndroid Build Coastguard Worker 	int real_pos;
311*1c60b9acSAndroid Build Coastguard Worker };
312*1c60b9acSAndroid Build Coastguard Worker 
313*1c60b9acSAndroid Build Coastguard Worker struct state state[2000];
314*1c60b9acSAndroid Build Coastguard Worker unsigned char terms[2000];
315*1c60b9acSAndroid Build Coastguard Worker int next = 1;
316*1c60b9acSAndroid Build Coastguard Worker 
lextable_decode(int pos,char c)317*1c60b9acSAndroid Build Coastguard Worker int lextable_decode(int pos, char c)
318*1c60b9acSAndroid Build Coastguard Worker {
319*1c60b9acSAndroid Build Coastguard Worker 	int q = pos + !!c;
320*1c60b9acSAndroid Build Coastguard Worker 
321*1c60b9acSAndroid Build Coastguard Worker 	if (lextable_terms[q >> 3] & (1 << (q & 7))) /* terminal */
322*1c60b9acSAndroid Build Coastguard Worker 		return lextable[q] | 0x8000;
323*1c60b9acSAndroid Build Coastguard Worker 
324*1c60b9acSAndroid Build Coastguard Worker 	return pos + (lextable[q] << 1);
325*1c60b9acSAndroid Build Coastguard Worker }
326*1c60b9acSAndroid Build Coastguard Worker 
main(void)327*1c60b9acSAndroid Build Coastguard Worker int main(void)
328*1c60b9acSAndroid Build Coastguard Worker {
329*1c60b9acSAndroid Build Coastguard Worker 	int n = 0;
330*1c60b9acSAndroid Build Coastguard Worker 	int m = 0;
331*1c60b9acSAndroid Build Coastguard Worker 	int prev;
332*1c60b9acSAndroid Build Coastguard Worker 	char c;
333*1c60b9acSAndroid Build Coastguard Worker 	int walk;
334*1c60b9acSAndroid Build Coastguard Worker 	int saw;
335*1c60b9acSAndroid Build Coastguard Worker 	int y;
336*1c60b9acSAndroid Build Coastguard Worker 	int j;
337*1c60b9acSAndroid Build Coastguard Worker 	int pos = 0;
338*1c60b9acSAndroid Build Coastguard Worker 	int biggest = 0;
339*1c60b9acSAndroid Build Coastguard Worker 	int fails = 0;
340*1c60b9acSAndroid Build Coastguard Worker 
341*1c60b9acSAndroid Build Coastguard Worker 	m = 0;
342*1c60b9acSAndroid Build Coastguard Worker 	while (m < LWS_ARRAY_SIZE(state)) {
343*1c60b9acSAndroid Build Coastguard Worker 		for (j = 0; j < PARALLEL; j++) {
344*1c60b9acSAndroid Build Coastguard Worker 			state[m].state[j] = 0xffff;
345*1c60b9acSAndroid Build Coastguard Worker 			state[m].terminal = 0;
346*1c60b9acSAndroid Build Coastguard Worker 		}
347*1c60b9acSAndroid Build Coastguard Worker 		m++;
348*1c60b9acSAndroid Build Coastguard Worker 	}
349*1c60b9acSAndroid Build Coastguard Worker 
350*1c60b9acSAndroid Build Coastguard Worker 	while (n < LWS_ARRAY_SIZE(huf_literal)) {
351*1c60b9acSAndroid Build Coastguard Worker 
352*1c60b9acSAndroid Build Coastguard Worker 		m = 0;
353*1c60b9acSAndroid Build Coastguard Worker 		walk = 0;
354*1c60b9acSAndroid Build Coastguard Worker 		prev = 0;
355*1c60b9acSAndroid Build Coastguard Worker 
356*1c60b9acSAndroid Build Coastguard Worker 		while (m < huf_literal[n].len) {
357*1c60b9acSAndroid Build Coastguard Worker 
358*1c60b9acSAndroid Build Coastguard Worker 			saw = 0;
359*1c60b9acSAndroid Build Coastguard Worker 			if (state[walk].state[code_bit(n, m)] != 0xffff) {
360*1c60b9acSAndroid Build Coastguard Worker 				/* exists -- go forward */
361*1c60b9acSAndroid Build Coastguard Worker 				walk = state[walk].state[code_bit(n, m)];
362*1c60b9acSAndroid Build Coastguard Worker 				goto again;
363*1c60b9acSAndroid Build Coastguard Worker 			}
364*1c60b9acSAndroid Build Coastguard Worker 
365*1c60b9acSAndroid Build Coastguard Worker 			/* something we didn't see before */
366*1c60b9acSAndroid Build Coastguard Worker 
367*1c60b9acSAndroid Build Coastguard Worker 			state[walk].state[code_bit(n, m)] = next;
368*1c60b9acSAndroid Build Coastguard Worker 			walk = next++;
369*1c60b9acSAndroid Build Coastguard Worker again:
370*1c60b9acSAndroid Build Coastguard Worker 			m++;
371*1c60b9acSAndroid Build Coastguard Worker 		}
372*1c60b9acSAndroid Build Coastguard Worker 
373*1c60b9acSAndroid Build Coastguard Worker 		state[walk].terminal = n++;
374*1c60b9acSAndroid Build Coastguard Worker 		state[walk].state[0] = 0; /* terminal marker */
375*1c60b9acSAndroid Build Coastguard Worker 	}
376*1c60b9acSAndroid Build Coastguard Worker 
377*1c60b9acSAndroid Build Coastguard Worker 	walk = 0;
378*1c60b9acSAndroid Build Coastguard Worker 	for (n = 0; n < next; n++) {
379*1c60b9acSAndroid Build Coastguard Worker 		state[n].bytepos = walk;
380*1c60b9acSAndroid Build Coastguard Worker 		walk += (2 * 2);
381*1c60b9acSAndroid Build Coastguard Worker 	}
382*1c60b9acSAndroid Build Coastguard Worker 
383*1c60b9acSAndroid Build Coastguard Worker 	/* compute everyone's position first */
384*1c60b9acSAndroid Build Coastguard Worker 
385*1c60b9acSAndroid Build Coastguard Worker 	pos = 0;
386*1c60b9acSAndroid Build Coastguard Worker 	walk = 0;
387*1c60b9acSAndroid Build Coastguard Worker 	for (n = 0; n < next; n++) {
388*1c60b9acSAndroid Build Coastguard Worker 
389*1c60b9acSAndroid Build Coastguard Worker 		state[n].real_pos = pos;
390*1c60b9acSAndroid Build Coastguard Worker 
391*1c60b9acSAndroid Build Coastguard Worker 		if (state[n].state[0]) /* nonterminal */
392*1c60b9acSAndroid Build Coastguard Worker 			pos += 2;
393*1c60b9acSAndroid Build Coastguard Worker 
394*1c60b9acSAndroid Build Coastguard Worker 		walk ++;
395*1c60b9acSAndroid Build Coastguard Worker 	}
396*1c60b9acSAndroid Build Coastguard Worker 
397*1c60b9acSAndroid Build Coastguard Worker 	fprintf(stdout, "static unsigned char lextable[] = {\n");
398*1c60b9acSAndroid Build Coastguard Worker 
399*1c60b9acSAndroid Build Coastguard Worker #define TERMINAL_MASK 0x8000
400*1c60b9acSAndroid Build Coastguard Worker 
401*1c60b9acSAndroid Build Coastguard Worker 	walk = 0;
402*1c60b9acSAndroid Build Coastguard Worker 	pos = 0;
403*1c60b9acSAndroid Build Coastguard Worker 
404*1c60b9acSAndroid Build Coastguard Worker 	for (n = 0; n < next; n++) {
405*1c60b9acSAndroid Build Coastguard Worker 		for (m = 0; m < 2; m++) {
406*1c60b9acSAndroid Build Coastguard Worker 			saw = state[n].state[m];
407*1c60b9acSAndroid Build Coastguard Worker 
408*1c60b9acSAndroid Build Coastguard Worker 			if (saw == 0) { // c is a terminal then
409*1c60b9acSAndroid Build Coastguard Worker 				m = 2;
410*1c60b9acSAndroid Build Coastguard Worker 				continue;
411*1c60b9acSAndroid Build Coastguard Worker 			}
412*1c60b9acSAndroid Build Coastguard Worker 			if (!m)
413*1c60b9acSAndroid Build Coastguard Worker 				fprintf(stdout, "/* pos %04x: %3d */ ",
414*1c60b9acSAndroid Build Coastguard Worker 							  state[n].real_pos, n);
415*1c60b9acSAndroid Build Coastguard Worker 			else
416*1c60b9acSAndroid Build Coastguard Worker 				fprintf(stdout, "                    ");
417*1c60b9acSAndroid Build Coastguard Worker 
418*1c60b9acSAndroid Build Coastguard Worker 			if (saw == 0xffff) {
419*1c60b9acSAndroid Build Coastguard Worker 				fprintf(stdout,
420*1c60b9acSAndroid Build Coastguard Worker 				  "   0xff, 0xff, /* 0 = fail */\n                    ");
421*1c60b9acSAndroid Build Coastguard Worker 				pos ++; /* fail */
422*1c60b9acSAndroid Build Coastguard Worker 				fails++;
423*1c60b9acSAndroid Build Coastguard Worker 				continue;
424*1c60b9acSAndroid Build Coastguard Worker 			}
425*1c60b9acSAndroid Build Coastguard Worker 
426*1c60b9acSAndroid Build Coastguard Worker 			if (state[saw].state[0] == 0) { /* points to terminal */
427*1c60b9acSAndroid Build Coastguard Worker 				fprintf(stdout, "    /* terminal %d */ 0x%02X,\n",
428*1c60b9acSAndroid Build Coastguard Worker 					state[saw].terminal,
429*1c60b9acSAndroid Build Coastguard Worker 					state[saw].terminal & 0xff);
430*1c60b9acSAndroid Build Coastguard Worker 				terms[(state[n].real_pos + m) >> 3] |=
431*1c60b9acSAndroid Build Coastguard Worker 					1 << ((state[n].real_pos + m) & 7);
432*1c60b9acSAndroid Build Coastguard Worker 				pos++;
433*1c60b9acSAndroid Build Coastguard Worker 				walk++;
434*1c60b9acSAndroid Build Coastguard Worker 				continue;
435*1c60b9acSAndroid Build Coastguard Worker 			}
436*1c60b9acSAndroid Build Coastguard Worker 
437*1c60b9acSAndroid Build Coastguard Worker 			j = (state[saw].real_pos - q) >> 1;
438*1c60b9acSAndroid Build Coastguard Worker 
439*1c60b9acSAndroid Build Coastguard Worker 			if (j > biggest)
440*1c60b9acSAndroid Build Coastguard Worker 				biggest = j;
441*1c60b9acSAndroid Build Coastguard Worker 
442*1c60b9acSAndroid Build Coastguard Worker 			if (j > 0xffff) {
443*1c60b9acSAndroid Build Coastguard Worker 				fprintf(stderr,
444*1c60b9acSAndroid Build Coastguard Worker 				  "Jump > 64K bytes ahead (%d to %d)\n",
445*1c60b9acSAndroid Build Coastguard Worker 					state[n].real_pos, state[saw].real_pos);
446*1c60b9acSAndroid Build Coastguard Worker 				return 1;
447*1c60b9acSAndroid Build Coastguard Worker 			}
448*1c60b9acSAndroid Build Coastguard Worker 
449*1c60b9acSAndroid Build Coastguard Worker 			fprintf(stdout, "   /* %d */ 0x%02X  "
450*1c60b9acSAndroid Build Coastguard Worker 				"/* (to 0x%04X state %3d) */,\n",
451*1c60b9acSAndroid Build Coastguard Worker 				m,
452*1c60b9acSAndroid Build Coastguard Worker 				j & 0xff,
453*1c60b9acSAndroid Build Coastguard Worker 				state[saw].real_pos, saw);
454*1c60b9acSAndroid Build Coastguard Worker 			pos++;
455*1c60b9acSAndroid Build Coastguard Worker 
456*1c60b9acSAndroid Build Coastguard Worker 			walk++;
457*1c60b9acSAndroid Build Coastguard Worker 		}
458*1c60b9acSAndroid Build Coastguard Worker 	}
459*1c60b9acSAndroid Build Coastguard Worker 
460*1c60b9acSAndroid Build Coastguard Worker 	fprintf(stdout, "/* total size %d bytes, biggest jump %d/256, fails=%d */\n};\n"
461*1c60b9acSAndroid Build Coastguard Worker 			"\n static unsigned char lextable_terms[] = {\n",
462*1c60b9acSAndroid Build Coastguard Worker 	 		pos, biggest, fails);
463*1c60b9acSAndroid Build Coastguard Worker 
464*1c60b9acSAndroid Build Coastguard Worker 	for (n = 0; n < (walk + 7) / 8; n++) {
465*1c60b9acSAndroid Build Coastguard Worker 		if (!(n & 7))
466*1c60b9acSAndroid Build Coastguard Worker 			fprintf(stdout, "\n\t");
467*1c60b9acSAndroid Build Coastguard Worker 		fprintf(stdout, "0x%02x, ", terms[n]);
468*1c60b9acSAndroid Build Coastguard Worker 	}
469*1c60b9acSAndroid Build Coastguard Worker 	fprintf(stdout, "\n};\n");
470*1c60b9acSAndroid Build Coastguard Worker 
471*1c60b9acSAndroid Build Coastguard Worker 	/*
472*1c60b9acSAndroid Build Coastguard Worker 	 * Try to parse every legal input string
473*1c60b9acSAndroid Build Coastguard Worker 	 */
474*1c60b9acSAndroid Build Coastguard Worker 
475*1c60b9acSAndroid Build Coastguard Worker 	for (n = 0; n < LWS_ARRAY_SIZE(huf_literal); n++) {
476*1c60b9acSAndroid Build Coastguard Worker 		walk = 0;
477*1c60b9acSAndroid Build Coastguard Worker 		m = 0;
478*1c60b9acSAndroid Build Coastguard Worker 		y = -1;
479*1c60b9acSAndroid Build Coastguard Worker 
480*1c60b9acSAndroid Build Coastguard Worker 		fprintf(stderr, "  trying %d\n", n);
481*1c60b9acSAndroid Build Coastguard Worker 
482*1c60b9acSAndroid Build Coastguard Worker 		while (m < huf_literal[n].len) {
483*1c60b9acSAndroid Build Coastguard Worker 			prev = walk;
484*1c60b9acSAndroid Build Coastguard Worker 			walk = lextable_decode(walk, code_bit(n, m));
485*1c60b9acSAndroid Build Coastguard Worker 
486*1c60b9acSAndroid Build Coastguard Worker 			if (walk == 0xffff) {
487*1c60b9acSAndroid Build Coastguard Worker 				fprintf(stderr, "failed\n");
488*1c60b9acSAndroid Build Coastguard Worker 				return 3;
489*1c60b9acSAndroid Build Coastguard Worker 			}
490*1c60b9acSAndroid Build Coastguard Worker 
491*1c60b9acSAndroid Build Coastguard Worker 			if (walk & 0x8000) {
492*1c60b9acSAndroid Build Coastguard Worker 				y = walk & 0x7fff;
493*1c60b9acSAndroid Build Coastguard Worker 				if (y == 0 && m == 29) {
494*1c60b9acSAndroid Build Coastguard Worker 					y |= 0x100;
495*1c60b9acSAndroid Build Coastguard Worker 					fprintf(stdout,
496*1c60b9acSAndroid Build Coastguard Worker 						"\n/* state that points to "
497*1c60b9acSAndroid Build Coastguard Worker 						"0x100 for disambiguation with "
498*1c60b9acSAndroid Build Coastguard Worker 						"0x0 */\n"
499*1c60b9acSAndroid Build Coastguard Worker 						"#define HUFTABLE_0x100_PREV "
500*1c60b9acSAndroid Build Coastguard Worker 						"%d\n", prev);
501*1c60b9acSAndroid Build Coastguard Worker 				}
502*1c60b9acSAndroid Build Coastguard Worker 				break;
503*1c60b9acSAndroid Build Coastguard Worker 			}
504*1c60b9acSAndroid Build Coastguard Worker 			m++;
505*1c60b9acSAndroid Build Coastguard Worker 		}
506*1c60b9acSAndroid Build Coastguard Worker 
507*1c60b9acSAndroid Build Coastguard Worker 		if (y != n) {
508*1c60b9acSAndroid Build Coastguard Worker 			fprintf(stderr, "decode failed %d got %d (0x%x)\n", n, y, y);
509*1c60b9acSAndroid Build Coastguard Worker 			return 4;
510*1c60b9acSAndroid Build Coastguard Worker 		}
511*1c60b9acSAndroid Build Coastguard Worker 	}
512*1c60b9acSAndroid Build Coastguard Worker 
513*1c60b9acSAndroid Build Coastguard Worker 	fprintf(stderr, "All decode OK\n");
514*1c60b9acSAndroid Build Coastguard Worker 
515*1c60b9acSAndroid Build Coastguard Worker 	return 0;
516*1c60b9acSAndroid Build Coastguard Worker }
517