webkit  2cdf99a9e3038c7e01b3c37e8ad903ecbe5eecf1
https://github.com/WebKit/webkit
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
transform.h
Go to the documentation of this file.
1 /* Copyright 2013 Google Inc. All Rights Reserved.
2 
3  Distributed under MIT license.
4  See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
5 */
6 
7 /* Transformations on dictionary words. */
8 
9 #ifndef BROTLI_DEC_TRANSFORM_H_
10 #define BROTLI_DEC_TRANSFORM_H_
11 
12 #include "./port.h"
13 #include "./types.h"
14 
15 #if defined(__cplusplus) || defined(c_plusplus)
16 extern "C" {
17 #endif
18 
20  kIdentity = 0,
41 };
42 
43 typedef struct {
47 } Transform;
48 
49 static const char kPrefixSuffix[208] =
50  "\0 \0, \0 of the \0 of \0s \0.\0 and \0 in \0\"\0 to \0\">\0\n\0. \0]\0"
51  " for \0 a \0 that \0\'\0 with \0 from \0 by \0(\0. The \0 on \0 as \0"
52  " is \0ing \0\n\t\0:\0ed \0=\"\0 at \0ly \0,\0=\'\0.com/\0. This \0"
53  " not \0er \0al \0ful \0ive \0less \0est \0ize \0\xc2\xa0\0ous ";
54 
55 enum {
56  /* EMPTY = ""
57  SP = " "
58  DQUOT = "\""
59  SQUOT = "'"
60  CLOSEBR = "]"
61  OPEN = "("
62  SLASH = "/"
63  NBSP = non-breaking space "\0xc2\xa0"
64  */
66  kPFix_SP = 1,
70  kPFix_eSP = 12,
72  kPFix_sSP = 20,
73  kPFix_DOT = 23,
89  kPFix_OPEN = 91,
91  kPFix_SPonSP = 100,
92  kPFix_SPasSP = 105,
93  kPFix_SPisSP = 110,
94  kPFix_ingSP = 115,
96  kPFix_COLON = 123,
97  kPFix_edSP = 125,
99  kPFix_SPatSP = 132,
100  kPFix_lySP = 137,
101  kPFix_COMMA = 141,
106  kPFix_erSP = 166,
107  kPFix_alSP = 170,
108  kPFix_fulSP = 174,
109  kPFix_iveSP = 179,
111  kPFix_estSP = 190,
112  kPFix_izeSP = 195,
113  kPFix_NBSP = 200,
115 };
116 
117 static const Transform kTransforms[] = {
120  { kPFix_SP, kIdentity, kPFix_SP },
121  { kPFix_EMPTY, kOmitFirst1, kPFix_EMPTY },
122  { kPFix_EMPTY, kUppercaseFirst, kPFix_SP },
124  { kPFix_SP, kIdentity, kPFix_EMPTY },
125  { kPFix_sSP, kIdentity, kPFix_SP },
127  { kPFix_EMPTY, kUppercaseFirst, kPFix_EMPTY },
129  { kPFix_EMPTY, kOmitFirst2, kPFix_EMPTY },
130  { kPFix_EMPTY, kOmitLast1, kPFix_EMPTY },
131  { kPFix_COMMASP, kIdentity, kPFix_SP },
133  { kPFix_SP, kUppercaseFirst, kPFix_SP },
136  { kPFix_eSP, kIdentity, kPFix_SP },
141  { kPFix_EMPTY, kOmitLast3, kPFix_EMPTY },
144  { kPFix_EMPTY, kOmitFirst3, kPFix_EMPTY },
145  { kPFix_EMPTY, kOmitLast2, kPFix_EMPTY },
148  { kPFix_SP, kUppercaseFirst, kPFix_EMPTY },
150  { kPFix_DOT, kIdentity, kPFix_EMPTY },
151  { kPFix_SP, kIdentity, kPFix_COMMASP },
152  { kPFix_EMPTY, kOmitFirst4, kPFix_EMPTY },
157  { kPFix_EMPTY, kOmitFirst5, kPFix_EMPTY },
158  { kPFix_EMPTY, kOmitFirst6, kPFix_EMPTY },
159  { kPFix_SPtheSP, kIdentity, kPFix_EMPTY },
160  { kPFix_EMPTY, kOmitLast4, kPFix_EMPTY },
162  { kPFix_EMPTY, kUppercaseAll, kPFix_EMPTY },
166  { kPFix_EMPTY, kOmitLast7, kPFix_EMPTY },
170  { kPFix_SP, kIdentity, kPFix_DOTSP },
172  { kPFix_EMPTY, kOmitFirst9, kPFix_EMPTY },
173  { kPFix_EMPTY, kOmitFirst7, kPFix_EMPTY },
174  { kPFix_EMPTY, kOmitLast6, kPFix_EMPTY },
176  { kPFix_EMPTY, kUppercaseFirst, kPFix_COMMASP },
177  { kPFix_EMPTY, kOmitLast8, kPFix_EMPTY },
180  { kPFix_SPtheSP, kIdentity, kPFix_SPofSP },
181  { kPFix_EMPTY, kOmitLast5, kPFix_EMPTY },
182  { kPFix_EMPTY, kOmitLast9, kPFix_EMPTY },
183  { kPFix_SP, kUppercaseFirst, kPFix_COMMASP },
184  { kPFix_EMPTY, kUppercaseFirst, kPFix_DQUOT },
185  { kPFix_DOT, kIdentity, kPFix_OPEN },
186  { kPFix_EMPTY, kUppercaseAll, kPFix_SP },
187  { kPFix_EMPTY, kUppercaseFirst, kPFix_DQUOTGT },
189  { kPFix_SP, kIdentity, kPFix_DOT },
190  { kPFix_DOTcomSLASH, kIdentity, kPFix_EMPTY },
192  { kPFix_EMPTY, kUppercaseFirst, kPFix_SQUOT },
195  { kPFix_DOT, kIdentity, kPFix_SP },
196  { kPFix_EMPTY, kUppercaseFirst, kPFix_OPEN },
197  { kPFix_EMPTY, kUppercaseFirst, kPFix_DOT },
199  { kPFix_SP, kIdentity, kPFix_EQDQUOT },
201  { kPFix_SP, kUppercaseAll, kPFix_SP },
203  { kPFix_SP, kUppercaseAll, kPFix_EMPTY },
205  { kPFix_EMPTY, kUppercaseAll, kPFix_DQUOT },
206  { kPFix_EMPTY, kUppercaseFirst, kPFix_DOTSP },
207  { kPFix_SP, kIdentity, kPFix_OPEN },
209  { kPFix_SP, kUppercaseFirst, kPFix_DOTSP },
212  { kPFix_EMPTY, kUppercaseAll, kPFix_SQUOT },
214  { kPFix_SP, kUppercaseFirst, kPFix_DOT },
215  { kPFix_EMPTY, kUppercaseAll, kPFix_DQUOTGT },
216  { kPFix_SP, kIdentity, kPFix_EQSQUOT },
217  { kPFix_EMPTY, kUppercaseFirst, kPFix_COMMA },
219  { kPFix_EMPTY, kUppercaseAll, kPFix_DOT },
220  { kPFix_NBSP, kIdentity, kPFix_EMPTY },
221  { kPFix_SP, kIdentity, kPFix_COMMA },
222  { kPFix_EMPTY, kUppercaseFirst, kPFix_EQDQUOT },
223  { kPFix_EMPTY, kUppercaseAll, kPFix_EQDQUOT },
225  { kPFix_EMPTY, kUppercaseAll, kPFix_COMMASP },
226  { kPFix_EMPTY, kUppercaseFirst, kPFix_EQSQUOT },
227  { kPFix_SP, kUppercaseFirst, kPFix_COMMA },
228  { kPFix_SP, kUppercaseAll, kPFix_EQDQUOT },
229  { kPFix_SP, kUppercaseAll, kPFix_COMMASP },
230  { kPFix_EMPTY, kUppercaseAll, kPFix_COMMA },
231  { kPFix_EMPTY, kUppercaseAll, kPFix_OPEN },
232  { kPFix_EMPTY, kUppercaseAll, kPFix_DOTSP },
233  { kPFix_SP, kUppercaseAll, kPFix_DOT },
234  { kPFix_EMPTY, kUppercaseAll, kPFix_EQSQUOT },
235  { kPFix_SP, kUppercaseAll, kPFix_DOTSP },
236  { kPFix_SP, kUppercaseFirst, kPFix_EQDQUOT },
237  { kPFix_SP, kUppercaseAll, kPFix_EQSQUOT },
238  { kPFix_SP, kUppercaseFirst, kPFix_EQSQUOT },
239 };
240 
241 static const int kNumTransforms = sizeof(kTransforms) / sizeof(kTransforms[0]);
242 
243 static int ToUpperCase(uint8_t* p) {
244  if (p[0] < 0xc0) {
245  if (p[0] >= 'a' && p[0] <= 'z') {
246  p[0] ^= 32;
247  }
248  return 1;
249  }
250  /* An overly simplified uppercasing model for utf-8. */
251  if (p[0] < 0xe0) {
252  p[1] ^= 32;
253  return 2;
254  }
255  /* An arbitrary transform for three byte characters. */
256  p[2] ^= 5;
257  return 3;
258 }
259 
260 static BROTLI_NOINLINE int TransformDictionaryWord(
261  uint8_t* dst, const uint8_t* word, int len, int transform) {
262  int idx = 0;
263  {
264  const char* prefix = &kPrefixSuffix[kTransforms[transform].prefix_id];
265  while (*prefix) { dst[idx++] = (uint8_t)*prefix++; }
266  }
267  {
268  const int t = kTransforms[transform].transform;
269  int i = 0;
270  int skip = t - (kOmitFirst1 - 1);
271  if (skip > 0) {
272  word += skip;
273  len -= skip;
274  } else if (t <= kOmitLast9) {
275  len -= t;
276  }
277  while (i < len) { dst[idx++] = word[i++]; }
278  if (t == kUppercaseFirst) {
279  ToUpperCase(&dst[idx - len]);
280  } else if (t == kUppercaseAll) {
281  uint8_t* uppercase = &dst[idx - len];
282  while (len > 0) {
283  int step = ToUpperCase(uppercase);
284  uppercase += step;
285  len -= step;
286  }
287  }
288  }
289  {
290  const char* suffix = &kPrefixSuffix[kTransforms[transform].suffix_id];
291  while (*suffix) { dst[idx++] = (uint8_t)*suffix++; }
292  return idx;
293  }
294 }
295 
296 #if defined(__cplusplus) || defined(c_plusplus)
297 } /* extern "C" */
298 #endif
299 
300 #endif /* BROTLI_DEC_TRANSFORM_H_ */
Definition: transform.h:81
Definition: transform.h:102
Definition: transform.h:87
Definition: transform.h:31
Definition: transform.h:114
size_t(* Transform)(char *buffer, size_t buflen, const char *source, size_t srclen)
Definition: stringencode.h:123
Definition: transform.h:89
Definition: transform.h:36
Definition: transform.h:25
Definition: transform.h:95
Definition: transform.h:29
DOMString p
Definition: WebCryptoAPI.idl:116
Definition: transform.h:66
Definition: transform.h:98
Definition: transform.h:37
Definition: transform.h:101
Definition: transform.h:22
typename detail::transform< sizeof...(OpSeq2), Sequence1, OpSeq1, OpSeq2... >::type transform
Definition: Brigand.h:757
unsigned char uint8_t
Definition: skin_detection.h:18
Definition: transform.h:106
bool t
Definition: UpdateContents.py:37
Definition: transform.h:92
Definition: transform.h:70
Definition: transform.h:88
Definition: transform.h:110
Definition: transform.h:67
Definition: transform.h:85
Definition: transform.h:113
Definition: transform.h:21
Definition: transform.h:71
Definition: transform.h:26
Definition: transform.h:35
Definition: transform.h:90
Definition: transform.h:86
Definition: transform.h:77
Definition: transform.h:74
GLenum GLenum dst
Definition: gl2ext.h:304
Definition: transform.h:109
Definition: transform.h:75
Definition: transform.h:112
OPENSSL_EXPORT const ASN1_OBJECT int const unsigned char int len
Definition: x509.h:1053
Definition: transform.h:72
Definition: transform.h:84
#define BROTLI_NOINLINE
Definition: port.h:217
Definition: transform.h:33
unsigned char uint8_t
Definition: ptypes.h:89
Definition: transform.h:103
Definition: transform.h:111
Definition: transform.h:43
Definition: transform.h:99
Definition: transform.h:100
const uint8_t suffix_id
Definition: transform.h:46
Definition: transform.h:76
Definition: transform.h:69
Definition: transform.h:79
Definition: transform.h:23
Definition: transform.h:104
Definition: xmlparse.c:154
Definition: transform.h:68
Definition: transform.h:28
Definition: transform.h:82
Definition: transform.h:96
Definition: transform.h:30
WordTransformType
Definition: transform.h:19
Definition: transform.h:38
Definition: transform.h:20
Definition: transform.h:34
Definition: transform.h:107
Definition: transform.h:27
for i
Definition: complexityMeasures.m:24
const uint8_t transform
Definition: transform.h:45
Definition: transform.h:65
Definition: transform.h:40
Definition: transform.h:105
Definition: transform.h:97
Definition: transform.h:94
Definition: transform.h:83
Definition: transform.h:108
Definition: transform.h:93
const uint8_t prefix_id
Definition: transform.h:44
Definition: transform.h:78
Definition: transform.h:73
Definition: transform.h:39
Definition: transform.h:80
Definition: transform.h:91
Definition: transform.h:24
Definition: transform.h:32