1*f4ee7fbaSAndroid Build Coastguard Worker /* Copyright 2013 Google Inc. All Rights Reserved.
2*f4ee7fbaSAndroid Build Coastguard Worker
3*f4ee7fbaSAndroid Build Coastguard Worker Distributed under MIT license.
4*f4ee7fbaSAndroid Build Coastguard Worker See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
5*f4ee7fbaSAndroid Build Coastguard Worker */
6*f4ee7fbaSAndroid Build Coastguard Worker
7*f4ee7fbaSAndroid Build Coastguard Worker #include "./transform.h"
8*f4ee7fbaSAndroid Build Coastguard Worker
9*f4ee7fbaSAndroid Build Coastguard Worker #if defined(__cplusplus) || defined(c_plusplus)
10*f4ee7fbaSAndroid Build Coastguard Worker extern "C" {
11*f4ee7fbaSAndroid Build Coastguard Worker #endif
12*f4ee7fbaSAndroid Build Coastguard Worker
13*f4ee7fbaSAndroid Build Coastguard Worker /* RFC 7932 transforms string data */
14*f4ee7fbaSAndroid Build Coastguard Worker static const char kPrefixSuffix[217] =
15*f4ee7fbaSAndroid Build Coastguard Worker "\1 \2, \10 of the \4 of \2s \1.\5 and \4 "
16*f4ee7fbaSAndroid Build Coastguard Worker /* 0x _0 _2 __5 _E _3 _6 _8 _E */
17*f4ee7fbaSAndroid Build Coastguard Worker "in \1\"\4 to \2\">\1\n\2. \1]\5 for \3 a \6 "
18*f4ee7fbaSAndroid Build Coastguard Worker /* 2x _3_ _5 _A_ _D_ _F _2 _4 _A _E */
19*f4ee7fbaSAndroid Build Coastguard Worker "that \1\'\6 with \6 from \4 by \1(\6. T"
20*f4ee7fbaSAndroid Build Coastguard Worker /* 4x _5_ _7 _E _5 _A _C */
21*f4ee7fbaSAndroid Build Coastguard Worker "he \4 on \4 as \4 is \4ing \2\n\t\1:\3ed "
22*f4ee7fbaSAndroid Build Coastguard Worker /* 6x _3 _8 _D _2 _7_ _ _A _C */
23*f4ee7fbaSAndroid Build Coastguard Worker "\2=\"\4 at \3ly \1,\2=\'\5.com/\7. This \5"
24*f4ee7fbaSAndroid Build Coastguard Worker /* 8x _0 _ _3 _8 _C _E _ _1 _7 _F */
25*f4ee7fbaSAndroid Build Coastguard Worker " not \3er \3al \4ful \4ive \5less \4es"
26*f4ee7fbaSAndroid Build Coastguard Worker /* Ax _5 _9 _D _2 _7 _D */
27*f4ee7fbaSAndroid Build Coastguard Worker "t \4ize \2\xc2\xa0\4ous \5 the \2e "; /* \0 - implicit trailing zero. */
28*f4ee7fbaSAndroid Build Coastguard Worker /* Cx _2 _7___ ___ _A _F _5 _8 */
29*f4ee7fbaSAndroid Build Coastguard Worker
30*f4ee7fbaSAndroid Build Coastguard Worker static const uint16_t kPrefixSuffixMap[50] = {
31*f4ee7fbaSAndroid Build Coastguard Worker 0x00, 0x02, 0x05, 0x0E, 0x13, 0x16, 0x18, 0x1E, 0x23, 0x25,
32*f4ee7fbaSAndroid Build Coastguard Worker 0x2A, 0x2D, 0x2F, 0x32, 0x34, 0x3A, 0x3E, 0x45, 0x47, 0x4E,
33*f4ee7fbaSAndroid Build Coastguard Worker 0x55, 0x5A, 0x5C, 0x63, 0x68, 0x6D, 0x72, 0x77, 0x7A, 0x7C,
34*f4ee7fbaSAndroid Build Coastguard Worker 0x80, 0x83, 0x88, 0x8C, 0x8E, 0x91, 0x97, 0x9F, 0xA5, 0xA9,
35*f4ee7fbaSAndroid Build Coastguard Worker 0xAD, 0xB2, 0xB7, 0xBD, 0xC2, 0xC7, 0xCA, 0xCF, 0xD5, 0xD8
36*f4ee7fbaSAndroid Build Coastguard Worker };
37*f4ee7fbaSAndroid Build Coastguard Worker
38*f4ee7fbaSAndroid Build Coastguard Worker /* RFC 7932 transforms */
39*f4ee7fbaSAndroid Build Coastguard Worker static const uint8_t kTransformsData[] = {
40*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 49,
41*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 0,
42*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_IDENTITY, 0,
43*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_FIRST_1, 49,
44*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 0,
45*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 47,
46*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_IDENTITY, 49,
47*f4ee7fbaSAndroid Build Coastguard Worker 4, BROTLI_TRANSFORM_IDENTITY, 0,
48*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 3,
49*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 49,
50*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 6,
51*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_FIRST_2, 49,
52*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_LAST_1, 49,
53*f4ee7fbaSAndroid Build Coastguard Worker 1, BROTLI_TRANSFORM_IDENTITY, 0,
54*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 1,
55*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 0,
56*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 7,
57*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 9,
58*f4ee7fbaSAndroid Build Coastguard Worker 48, BROTLI_TRANSFORM_IDENTITY, 0,
59*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 8,
60*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 5,
61*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 10,
62*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 11,
63*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_LAST_3, 49,
64*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 13,
65*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 14,
66*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_FIRST_3, 49,
67*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_LAST_2, 49,
68*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 15,
69*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 16,
70*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 49,
71*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 12,
72*f4ee7fbaSAndroid Build Coastguard Worker 5, BROTLI_TRANSFORM_IDENTITY, 49,
73*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_IDENTITY, 1,
74*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_FIRST_4, 49,
75*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 18,
76*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 17,
77*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 19,
78*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 20,
79*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_FIRST_5, 49,
80*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_FIRST_6, 49,
81*f4ee7fbaSAndroid Build Coastguard Worker 47, BROTLI_TRANSFORM_IDENTITY, 49,
82*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_LAST_4, 49,
83*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 22,
84*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 49,
85*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 23,
86*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 24,
87*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 25,
88*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_LAST_7, 49,
89*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_LAST_1, 26,
90*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 27,
91*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 28,
92*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_IDENTITY, 12,
93*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 29,
94*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_FIRST_9, 49,
95*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_FIRST_7, 49,
96*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_LAST_6, 49,
97*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 21,
98*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 1,
99*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_LAST_8, 49,
100*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 31,
101*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 32,
102*f4ee7fbaSAndroid Build Coastguard Worker 47, BROTLI_TRANSFORM_IDENTITY, 3,
103*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_LAST_5, 49,
104*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_OMIT_LAST_9, 49,
105*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 1,
106*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 8,
107*f4ee7fbaSAndroid Build Coastguard Worker 5, BROTLI_TRANSFORM_IDENTITY, 21,
108*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 0,
109*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 10,
110*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 30,
111*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_IDENTITY, 5,
112*f4ee7fbaSAndroid Build Coastguard Worker 35, BROTLI_TRANSFORM_IDENTITY, 49,
113*f4ee7fbaSAndroid Build Coastguard Worker 47, BROTLI_TRANSFORM_IDENTITY, 2,
114*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 17,
115*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 36,
116*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 33,
117*f4ee7fbaSAndroid Build Coastguard Worker 5, BROTLI_TRANSFORM_IDENTITY, 0,
118*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 21,
119*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 5,
120*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 37,
121*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_IDENTITY, 30,
122*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 38,
123*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 0,
124*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 39,
125*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 49,
126*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 34,
127*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 8,
128*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 12,
129*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_IDENTITY, 21,
130*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 40,
131*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 12,
132*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 41,
133*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 42,
134*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 17,
135*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 43,
136*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 5,
137*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 10,
138*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_IDENTITY, 34,
139*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 33,
140*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 44,
141*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 5,
142*f4ee7fbaSAndroid Build Coastguard Worker 45, BROTLI_TRANSFORM_IDENTITY, 49,
143*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_IDENTITY, 33,
144*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 30,
145*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 30,
146*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_IDENTITY, 46,
147*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 1,
148*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 34,
149*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 33,
150*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 30,
151*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 1,
152*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 33,
153*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 21,
154*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 12,
155*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 5,
156*f4ee7fbaSAndroid Build Coastguard Worker 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 34,
157*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 12,
158*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 30,
159*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 34,
160*f4ee7fbaSAndroid Build Coastguard Worker 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 34,
161*f4ee7fbaSAndroid Build Coastguard Worker };
162*f4ee7fbaSAndroid Build Coastguard Worker
163*f4ee7fbaSAndroid Build Coastguard Worker static const BrotliTransforms kBrotliTransforms = {
164*f4ee7fbaSAndroid Build Coastguard Worker sizeof(kPrefixSuffix),
165*f4ee7fbaSAndroid Build Coastguard Worker (const uint8_t*)kPrefixSuffix,
166*f4ee7fbaSAndroid Build Coastguard Worker kPrefixSuffixMap,
167*f4ee7fbaSAndroid Build Coastguard Worker sizeof(kTransformsData) / (3 * sizeof(kTransformsData[0])),
168*f4ee7fbaSAndroid Build Coastguard Worker kTransformsData,
169*f4ee7fbaSAndroid Build Coastguard Worker NULL, /* no extra parameters */
170*f4ee7fbaSAndroid Build Coastguard Worker {0, 12, 27, 23, 42, 63, 56, 48, 59, 64}
171*f4ee7fbaSAndroid Build Coastguard Worker };
172*f4ee7fbaSAndroid Build Coastguard Worker
BrotliGetTransforms(void)173*f4ee7fbaSAndroid Build Coastguard Worker const BrotliTransforms* BrotliGetTransforms(void) {
174*f4ee7fbaSAndroid Build Coastguard Worker return &kBrotliTransforms;
175*f4ee7fbaSAndroid Build Coastguard Worker }
176*f4ee7fbaSAndroid Build Coastguard Worker
ToUpperCase(uint8_t * p)177*f4ee7fbaSAndroid Build Coastguard Worker static int ToUpperCase(uint8_t* p) {
178*f4ee7fbaSAndroid Build Coastguard Worker if (p[0] < 0xC0) {
179*f4ee7fbaSAndroid Build Coastguard Worker if (p[0] >= 'a' && p[0] <= 'z') {
180*f4ee7fbaSAndroid Build Coastguard Worker p[0] ^= 32;
181*f4ee7fbaSAndroid Build Coastguard Worker }
182*f4ee7fbaSAndroid Build Coastguard Worker return 1;
183*f4ee7fbaSAndroid Build Coastguard Worker }
184*f4ee7fbaSAndroid Build Coastguard Worker /* An overly simplified uppercasing model for UTF-8. */
185*f4ee7fbaSAndroid Build Coastguard Worker if (p[0] < 0xE0) {
186*f4ee7fbaSAndroid Build Coastguard Worker p[1] ^= 32;
187*f4ee7fbaSAndroid Build Coastguard Worker return 2;
188*f4ee7fbaSAndroid Build Coastguard Worker }
189*f4ee7fbaSAndroid Build Coastguard Worker /* An arbitrary transform for three byte characters. */
190*f4ee7fbaSAndroid Build Coastguard Worker p[2] ^= 5;
191*f4ee7fbaSAndroid Build Coastguard Worker return 3;
192*f4ee7fbaSAndroid Build Coastguard Worker }
193*f4ee7fbaSAndroid Build Coastguard Worker
Shift(uint8_t * word,int word_len,uint16_t parameter)194*f4ee7fbaSAndroid Build Coastguard Worker static int Shift(uint8_t* word, int word_len, uint16_t parameter) {
195*f4ee7fbaSAndroid Build Coastguard Worker /* Limited sign extension: scalar < (1 << 24). */
196*f4ee7fbaSAndroid Build Coastguard Worker uint32_t scalar =
197*f4ee7fbaSAndroid Build Coastguard Worker (parameter & 0x7FFFu) + (0x1000000u - (parameter & 0x8000u));
198*f4ee7fbaSAndroid Build Coastguard Worker if (word[0] < 0x80) {
199*f4ee7fbaSAndroid Build Coastguard Worker /* 1-byte rune / 0sssssss / 7 bit scalar (ASCII). */
200*f4ee7fbaSAndroid Build Coastguard Worker scalar += (uint32_t)word[0];
201*f4ee7fbaSAndroid Build Coastguard Worker word[0] = (uint8_t)(scalar & 0x7Fu);
202*f4ee7fbaSAndroid Build Coastguard Worker return 1;
203*f4ee7fbaSAndroid Build Coastguard Worker } else if (word[0] < 0xC0) {
204*f4ee7fbaSAndroid Build Coastguard Worker /* Continuation / 10AAAAAA. */
205*f4ee7fbaSAndroid Build Coastguard Worker return 1;
206*f4ee7fbaSAndroid Build Coastguard Worker } else if (word[0] < 0xE0) {
207*f4ee7fbaSAndroid Build Coastguard Worker /* 2-byte rune / 110sssss AAssssss / 11 bit scalar. */
208*f4ee7fbaSAndroid Build Coastguard Worker if (word_len < 2) return 1;
209*f4ee7fbaSAndroid Build Coastguard Worker scalar += (uint32_t)((word[1] & 0x3Fu) | ((word[0] & 0x1Fu) << 6u));
210*f4ee7fbaSAndroid Build Coastguard Worker word[0] = (uint8_t)(0xC0 | ((scalar >> 6u) & 0x1F));
211*f4ee7fbaSAndroid Build Coastguard Worker word[1] = (uint8_t)((word[1] & 0xC0) | (scalar & 0x3F));
212*f4ee7fbaSAndroid Build Coastguard Worker return 2;
213*f4ee7fbaSAndroid Build Coastguard Worker } else if (word[0] < 0xF0) {
214*f4ee7fbaSAndroid Build Coastguard Worker /* 3-byte rune / 1110ssss AAssssss BBssssss / 16 bit scalar. */
215*f4ee7fbaSAndroid Build Coastguard Worker if (word_len < 3) return word_len;
216*f4ee7fbaSAndroid Build Coastguard Worker scalar += (uint32_t)((word[2] & 0x3Fu) | ((word[1] & 0x3Fu) << 6u) |
217*f4ee7fbaSAndroid Build Coastguard Worker ((word[0] & 0x0Fu) << 12u));
218*f4ee7fbaSAndroid Build Coastguard Worker word[0] = (uint8_t)(0xE0 | ((scalar >> 12u) & 0x0F));
219*f4ee7fbaSAndroid Build Coastguard Worker word[1] = (uint8_t)((word[1] & 0xC0) | ((scalar >> 6u) & 0x3F));
220*f4ee7fbaSAndroid Build Coastguard Worker word[2] = (uint8_t)((word[2] & 0xC0) | (scalar & 0x3F));
221*f4ee7fbaSAndroid Build Coastguard Worker return 3;
222*f4ee7fbaSAndroid Build Coastguard Worker } else if (word[0] < 0xF8) {
223*f4ee7fbaSAndroid Build Coastguard Worker /* 4-byte rune / 11110sss AAssssss BBssssss CCssssss / 21 bit scalar. */
224*f4ee7fbaSAndroid Build Coastguard Worker if (word_len < 4) return word_len;
225*f4ee7fbaSAndroid Build Coastguard Worker scalar += (uint32_t)((word[3] & 0x3Fu) | ((word[2] & 0x3Fu) << 6u) |
226*f4ee7fbaSAndroid Build Coastguard Worker ((word[1] & 0x3Fu) << 12u) | ((word[0] & 0x07u) << 18u));
227*f4ee7fbaSAndroid Build Coastguard Worker word[0] = (uint8_t)(0xF0 | ((scalar >> 18u) & 0x07));
228*f4ee7fbaSAndroid Build Coastguard Worker word[1] = (uint8_t)((word[1] & 0xC0) | ((scalar >> 12u) & 0x3F));
229*f4ee7fbaSAndroid Build Coastguard Worker word[2] = (uint8_t)((word[2] & 0xC0) | ((scalar >> 6u) & 0x3F));
230*f4ee7fbaSAndroid Build Coastguard Worker word[3] = (uint8_t)((word[3] & 0xC0) | (scalar & 0x3F));
231*f4ee7fbaSAndroid Build Coastguard Worker return 4;
232*f4ee7fbaSAndroid Build Coastguard Worker }
233*f4ee7fbaSAndroid Build Coastguard Worker return 1;
234*f4ee7fbaSAndroid Build Coastguard Worker }
235*f4ee7fbaSAndroid Build Coastguard Worker
BrotliTransformDictionaryWord(uint8_t * dst,const uint8_t * word,int len,const BrotliTransforms * transforms,int transform_idx)236*f4ee7fbaSAndroid Build Coastguard Worker int BrotliTransformDictionaryWord(uint8_t* dst, const uint8_t* word, int len,
237*f4ee7fbaSAndroid Build Coastguard Worker const BrotliTransforms* transforms, int transform_idx) {
238*f4ee7fbaSAndroid Build Coastguard Worker int idx = 0;
239*f4ee7fbaSAndroid Build Coastguard Worker const uint8_t* prefix = BROTLI_TRANSFORM_PREFIX(transforms, transform_idx);
240*f4ee7fbaSAndroid Build Coastguard Worker uint8_t type = BROTLI_TRANSFORM_TYPE(transforms, transform_idx);
241*f4ee7fbaSAndroid Build Coastguard Worker const uint8_t* suffix = BROTLI_TRANSFORM_SUFFIX(transforms, transform_idx);
242*f4ee7fbaSAndroid Build Coastguard Worker {
243*f4ee7fbaSAndroid Build Coastguard Worker int prefix_len = *prefix++;
244*f4ee7fbaSAndroid Build Coastguard Worker while (prefix_len--) { dst[idx++] = *prefix++; }
245*f4ee7fbaSAndroid Build Coastguard Worker }
246*f4ee7fbaSAndroid Build Coastguard Worker {
247*f4ee7fbaSAndroid Build Coastguard Worker const int t = type;
248*f4ee7fbaSAndroid Build Coastguard Worker int i = 0;
249*f4ee7fbaSAndroid Build Coastguard Worker if (t <= BROTLI_TRANSFORM_OMIT_LAST_9) {
250*f4ee7fbaSAndroid Build Coastguard Worker len -= t;
251*f4ee7fbaSAndroid Build Coastguard Worker } else if (t >= BROTLI_TRANSFORM_OMIT_FIRST_1
252*f4ee7fbaSAndroid Build Coastguard Worker && t <= BROTLI_TRANSFORM_OMIT_FIRST_9) {
253*f4ee7fbaSAndroid Build Coastguard Worker int skip = t - (BROTLI_TRANSFORM_OMIT_FIRST_1 - 1);
254*f4ee7fbaSAndroid Build Coastguard Worker word += skip;
255*f4ee7fbaSAndroid Build Coastguard Worker len -= skip;
256*f4ee7fbaSAndroid Build Coastguard Worker }
257*f4ee7fbaSAndroid Build Coastguard Worker while (i < len) { dst[idx++] = word[i++]; }
258*f4ee7fbaSAndroid Build Coastguard Worker if (t == BROTLI_TRANSFORM_UPPERCASE_FIRST) {
259*f4ee7fbaSAndroid Build Coastguard Worker ToUpperCase(&dst[idx - len]);
260*f4ee7fbaSAndroid Build Coastguard Worker } else if (t == BROTLI_TRANSFORM_UPPERCASE_ALL) {
261*f4ee7fbaSAndroid Build Coastguard Worker uint8_t* uppercase = &dst[idx - len];
262*f4ee7fbaSAndroid Build Coastguard Worker while (len > 0) {
263*f4ee7fbaSAndroid Build Coastguard Worker int step = ToUpperCase(uppercase);
264*f4ee7fbaSAndroid Build Coastguard Worker uppercase += step;
265*f4ee7fbaSAndroid Build Coastguard Worker len -= step;
266*f4ee7fbaSAndroid Build Coastguard Worker }
267*f4ee7fbaSAndroid Build Coastguard Worker } else if (t == BROTLI_TRANSFORM_SHIFT_FIRST) {
268*f4ee7fbaSAndroid Build Coastguard Worker uint16_t param = (uint16_t)(transforms->params[transform_idx * 2]
269*f4ee7fbaSAndroid Build Coastguard Worker + (transforms->params[transform_idx * 2 + 1] << 8u));
270*f4ee7fbaSAndroid Build Coastguard Worker Shift(&dst[idx - len], len, param);
271*f4ee7fbaSAndroid Build Coastguard Worker } else if (t == BROTLI_TRANSFORM_SHIFT_ALL) {
272*f4ee7fbaSAndroid Build Coastguard Worker uint16_t param = (uint16_t)(transforms->params[transform_idx * 2]
273*f4ee7fbaSAndroid Build Coastguard Worker + (transforms->params[transform_idx * 2 + 1] << 8u));
274*f4ee7fbaSAndroid Build Coastguard Worker uint8_t* shift = &dst[idx - len];
275*f4ee7fbaSAndroid Build Coastguard Worker while (len > 0) {
276*f4ee7fbaSAndroid Build Coastguard Worker int step = Shift(shift, len, param);
277*f4ee7fbaSAndroid Build Coastguard Worker shift += step;
278*f4ee7fbaSAndroid Build Coastguard Worker len -= step;
279*f4ee7fbaSAndroid Build Coastguard Worker }
280*f4ee7fbaSAndroid Build Coastguard Worker }
281*f4ee7fbaSAndroid Build Coastguard Worker }
282*f4ee7fbaSAndroid Build Coastguard Worker {
283*f4ee7fbaSAndroid Build Coastguard Worker int suffix_len = *suffix++;
284*f4ee7fbaSAndroid Build Coastguard Worker while (suffix_len--) { dst[idx++] = *suffix++; }
285*f4ee7fbaSAndroid Build Coastguard Worker return idx;
286*f4ee7fbaSAndroid Build Coastguard Worker }
287*f4ee7fbaSAndroid Build Coastguard Worker }
288*f4ee7fbaSAndroid Build Coastguard Worker
289*f4ee7fbaSAndroid Build Coastguard Worker #if defined(__cplusplus) || defined(c_plusplus)
290*f4ee7fbaSAndroid Build Coastguard Worker } /* extern "C" */
291*f4ee7fbaSAndroid Build Coastguard Worker #endif
292