Coverage Report

Created: 2026-10-14 09:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/workdir/UnpackedTarball/harfbuzz/src/hb-ot-shaper-khmer-machine.hh
Line
Count
Source
1
2
#line 1 "hb-ot-shaper-khmer-machine.rl"
3
/*
4
 * Copyright © 2011,2012  Google, Inc.
5
 *
6
 *  This is part of HarfBuzz, a text shaping library.
7
 *
8
 * Permission is hereby granted, without written agreement and without
9
 * license or royalty fees, to use, copy, modify, and distribute this
10
 * software and its documentation for any purpose, provided that the
11
 * above copyright notice and the following two paragraphs appear in
12
 * all copies of this software.
13
 *
14
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
15
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
16
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
17
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
18
 * DAMAGE.
19
 *
20
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
21
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
22
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
23
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
24
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
25
 *
26
 * Google Author(s): Behdad Esfahbod
27
 */
28
29
#ifndef HB_OT_SHAPER_KHMER_MACHINE_HH
30
#define HB_OT_SHAPER_KHMER_MACHINE_HH
31
32
#include "hb.hh"
33
34
#include "hb-ot-layout.hh"
35
#include "hb-ot-shaper-indic.hh"
36
37
/* buffer var allocations */
38
87.1k
#define khmer_category() ot_shaper_var_u8_category() /* khmer_category_t */
39
40
using khmer_category_t = unsigned;
41
42
16.4k
#define K_Cat(Cat) khmer_syllable_machine_ex_##Cat
43
44
enum khmer_syllable_type_t {
45
  khmer_consonant_syllable,
46
  khmer_broken_cluster,
47
  khmer_non_khmer_cluster,
48
};
49
50
51
#line 49 "hb-ot-shaper-khmer-machine.hh"
52
#define khmer_syllable_machine_ex_C 1u
53
12.9k
#define khmer_syllable_machine_ex_DOTTEDCIRCLE 11u
54
3.49k
#define khmer_syllable_machine_ex_H 4u
55
#define khmer_syllable_machine_ex_PLACEHOLDER 10u
56
1
#define khmer_syllable_machine_ex_Ra 15u
57
#define khmer_syllable_machine_ex_Robatic 25u
58
#define khmer_syllable_machine_ex_V 2u
59
#define khmer_syllable_machine_ex_VAbv 20u
60
#define khmer_syllable_machine_ex_VBlw 21u
61
1.74k
#define khmer_syllable_machine_ex_VPre 22u
62
#define khmer_syllable_machine_ex_VPst 23u
63
#define khmer_syllable_machine_ex_Xgroup 26u
64
#define khmer_syllable_machine_ex_Ygroup 27u
65
#define khmer_syllable_machine_ex_ZWJ 6u
66
#define khmer_syllable_machine_ex_ZWNJ 5u
67
68
69
#line 65 "hb-ot-shaper-khmer-machine.hh"
70
static const unsigned char _khmer_syllable_machine_trans_keys[] = {
71
  5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 
72
  5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, 
73
  5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 1u, 27u, 4u, 27u, 1u, 15u, 
74
  4u, 27u, 4u, 27u, 27u, 27u, 4u, 27u, 4u, 27u, 4u, 27u, 4u, 27u, 4u, 27u, 
75
  4u, 27u, 1u, 15u, 4u, 27u, 4u, 27u, 27u, 27u, 4u, 27u, 4u, 27u, 4u, 27u, 
76
  4u, 27u, 4u, 27u, 5u, 26u, 0
77
};
78
79
static const char _khmer_syllable_machine_key_spans[] = {
80
  22, 22, 15, 22, 22, 22, 22, 22, 
81
  22, 22, 22, 22, 22, 15, 22, 22, 
82
  22, 22, 22, 22, 22, 27, 24, 15, 
83
  24, 24, 1, 24, 24, 24, 24, 24, 
84
  24, 15, 24, 24, 1, 24, 24, 24, 
85
  24, 24, 22
86
};
87
88
static const short _khmer_syllable_machine_index_offsets[] = {
89
  0, 23, 46, 62, 85, 108, 131, 154, 
90
  177, 200, 223, 246, 269, 292, 308, 331, 
91
  354, 377, 400, 423, 446, 469, 497, 522, 
92
  538, 563, 588, 590, 615, 640, 665, 690, 
93
  715, 740, 756, 781, 806, 808, 833, 858, 
94
  883, 908, 933
95
};
96
97
static const char _khmer_syllable_machine_indicies[] = {
98
  1, 1, 0, 0, 0, 0, 0, 0, 
99
  0, 0, 0, 0, 0, 0, 0, 2, 
100
  0, 0, 0, 0, 3, 4, 0, 1, 
101
  1, 0, 0, 0, 0, 0, 0, 0, 
102
  0, 0, 0, 0, 0, 0, 0, 0, 
103
  0, 0, 0, 0, 4, 0, 5, 5, 
104
  0, 0, 0, 0, 0, 0, 0, 0, 
105
  0, 0, 0, 0, 5, 0, 1, 1, 
106
  0, 0, 0, 0, 0, 0, 0, 0, 
107
  0, 0, 0, 0, 0, 2, 0, 0, 
108
  0, 0, 0, 4, 0, 6, 6, 0, 
109
  0, 0, 0, 0, 0, 0, 0, 0, 
110
  0, 0, 0, 0, 0, 0, 0, 0, 
111
  0, 0, 2, 0, 7, 7, 0, 0, 
112
  0, 0, 0, 0, 0, 0, 0, 0, 
113
  0, 0, 0, 0, 0, 0, 0, 0, 
114
  0, 8, 0, 9, 9, 0, 0, 0, 
115
  0, 0, 0, 0, 0, 0, 0, 0, 
116
  0, 0, 2, 0, 0, 0, 0, 0, 
117
  10, 0, 9, 9, 0, 0, 0, 0, 
118
  0, 0, 0, 0, 0, 0, 0, 0, 
119
  0, 0, 0, 0, 0, 0, 0, 10, 
120
  0, 11, 11, 0, 0, 0, 0, 0, 
121
  0, 0, 0, 0, 0, 0, 0, 0, 
122
  2, 0, 0, 0, 0, 0, 12, 0, 
123
  11, 11, 0, 0, 0, 0, 0, 0, 
124
  0, 0, 0, 0, 0, 0, 0, 0, 
125
  0, 0, 0, 0, 0, 12, 0, 1, 
126
  1, 0, 0, 0, 0, 0, 0, 0, 
127
  0, 0, 0, 0, 0, 0, 2, 0, 
128
  0, 0, 0, 13, 4, 0, 15, 15, 
129
  14, 14, 14, 14, 14, 14, 14, 14, 
130
  14, 14, 14, 14, 14, 16, 14, 14, 
131
  14, 14, 17, 18, 14, 15, 15, 19, 
132
  19, 19, 19, 19, 19, 19, 19, 19, 
133
  19, 19, 19, 19, 19, 19, 19, 19, 
134
  19, 19, 18, 19, 20, 20, 14, 14, 
135
  14, 14, 14, 14, 14, 14, 14, 14, 
136
  14, 14, 20, 14, 15, 15, 14, 14, 
137
  14, 14, 14, 14, 14, 14, 14, 14, 
138
  14, 14, 14, 16, 14, 14, 14, 14, 
139
  14, 18, 14, 21, 21, 14, 14, 14, 
140
  14, 14, 14, 14, 14, 14, 14, 14, 
141
  14, 14, 14, 14, 14, 14, 14, 14, 
142
  16, 14, 22, 22, 14, 14, 14, 14, 
143
  14, 14, 14, 14, 14, 14, 14, 14, 
144
  14, 14, 14, 14, 14, 14, 14, 23, 
145
  14, 24, 24, 14, 14, 14, 14, 14, 
146
  14, 14, 14, 14, 14, 14, 14, 14, 
147
  16, 14, 14, 14, 14, 14, 25, 14, 
148
  24, 24, 14, 14, 14, 14, 14, 14, 
149
  14, 14, 14, 14, 14, 14, 14, 14, 
150
  14, 14, 14, 14, 14, 25, 14, 26, 
151
  26, 14, 14, 14, 14, 14, 14, 14, 
152
  14, 14, 14, 14, 14, 14, 16, 14, 
153
  14, 14, 14, 14, 27, 14, 26, 26, 
154
  14, 14, 14, 14, 14, 14, 14, 14, 
155
  14, 14, 14, 14, 14, 14, 14, 14, 
156
  14, 14, 14, 27, 14, 29, 29, 28, 
157
  30, 31, 31, 28, 28, 28, 13, 13, 
158
  28, 28, 28, 29, 28, 28, 28, 28, 
159
  16, 25, 27, 23, 28, 17, 18, 20, 
160
  28, 33, 34, 34, 32, 32, 32, 32, 
161
  32, 32, 32, 32, 32, 32, 32, 32, 
162
  32, 2, 10, 12, 8, 32, 13, 4, 
163
  5, 32, 35, 35, 32, 32, 32, 32, 
164
  32, 32, 32, 32, 32, 32, 32, 32, 
165
  35, 32, 33, 36, 36, 32, 32, 32, 
166
  32, 32, 32, 32, 32, 32, 32, 32, 
167
  32, 32, 2, 10, 12, 8, 32, 3, 
168
  4, 5, 32, 37, 38, 38, 32, 32, 
169
  32, 32, 32, 32, 32, 32, 32, 32, 
170
  32, 32, 32, 2, 10, 12, 8, 32, 
171
  32, 4, 5, 32, 5, 32, 37, 6, 
172
  6, 32, 32, 32, 32, 32, 32, 32, 
173
  32, 32, 32, 32, 32, 32, 32, 32, 
174
  32, 8, 32, 32, 2, 5, 32, 37, 
175
  7, 7, 32, 32, 32, 32, 32, 32, 
176
  32, 32, 32, 32, 32, 32, 32, 32, 
177
  32, 32, 32, 32, 32, 8, 5, 32, 
178
  37, 39, 39, 32, 32, 32, 32, 32, 
179
  32, 32, 32, 32, 32, 32, 32, 32, 
180
  2, 32, 32, 8, 32, 32, 10, 5, 
181
  32, 37, 40, 40, 32, 32, 32, 32, 
182
  32, 32, 32, 32, 32, 32, 32, 32, 
183
  32, 2, 10, 32, 8, 32, 32, 12, 
184
  5, 32, 33, 38, 38, 32, 32, 32, 
185
  32, 32, 32, 32, 32, 32, 32, 32, 
186
  32, 32, 2, 10, 12, 8, 32, 32, 
187
  4, 5, 32, 33, 38, 38, 32, 32, 
188
  32, 32, 32, 32, 32, 32, 32, 32, 
189
  32, 32, 32, 2, 10, 12, 8, 32, 
190
  3, 4, 5, 32, 42, 42, 41, 41, 
191
  41, 41, 41, 41, 41, 41, 41, 41, 
192
  41, 41, 42, 41, 30, 43, 43, 41, 
193
  41, 41, 41, 41, 41, 41, 41, 41, 
194
  41, 41, 41, 41, 16, 25, 27, 23, 
195
  41, 17, 18, 20, 41, 44, 45, 45, 
196
  41, 41, 41, 41, 41, 41, 41, 41, 
197
  41, 41, 41, 41, 41, 16, 25, 27, 
198
  23, 41, 41, 18, 20, 41, 20, 41, 
199
  44, 21, 21, 41, 41, 41, 41, 41, 
200
  41, 41, 41, 41, 41, 41, 41, 41, 
201
  41, 41, 41, 23, 41, 41, 16, 20, 
202
  41, 44, 22, 22, 41, 41, 41, 41, 
203
  41, 41, 41, 41, 41, 41, 41, 41, 
204
  41, 41, 41, 41, 41, 41, 41, 23, 
205
  20, 41, 44, 46, 46, 41, 41, 41, 
206
  41, 41, 41, 41, 41, 41, 41, 41, 
207
  41, 41, 16, 41, 41, 23, 41, 41, 
208
  25, 20, 41, 44, 47, 47, 41, 41, 
209
  41, 41, 41, 41, 41, 41, 41, 41, 
210
  41, 41, 41, 16, 25, 41, 23, 41, 
211
  41, 27, 20, 41, 30, 45, 45, 41, 
212
  41, 41, 41, 41, 41, 41, 41, 41, 
213
  41, 41, 41, 41, 16, 25, 27, 23, 
214
  41, 41, 18, 20, 41, 15, 15, 48, 
215
  48, 48, 48, 48, 48, 48, 48, 48, 
216
  48, 48, 48, 48, 16, 48, 48, 48, 
217
  48, 48, 18, 48, 0
218
};
219
220
static const char _khmer_syllable_machine_trans_targs[] = {
221
  21, 1, 27, 31, 25, 26, 4, 5, 
222
  28, 7, 29, 9, 30, 32, 21, 12, 
223
  37, 41, 35, 21, 36, 15, 16, 38, 
224
  18, 39, 20, 40, 21, 22, 33, 42, 
225
  21, 23, 10, 24, 0, 2, 3, 6, 
226
  8, 21, 34, 11, 13, 14, 17, 19, 
227
  21
228
};
229
230
static const char _khmer_syllable_machine_trans_actions[] = {
231
  1, 0, 2, 2, 2, 0, 0, 0, 
232
  2, 0, 2, 0, 2, 2, 3, 0, 
233
  2, 4, 4, 5, 0, 0, 0, 2, 
234
  0, 2, 0, 2, 8, 2, 0, 9, 
235
  10, 0, 0, 2, 0, 0, 0, 0, 
236
  0, 11, 4, 0, 0, 0, 0, 0, 
237
  12
238
};
239
240
static const char _khmer_syllable_machine_to_state_actions[] = {
241
  0, 0, 0, 0, 0, 0, 0, 0, 
242
  0, 0, 0, 0, 0, 0, 0, 0, 
243
  0, 0, 0, 0, 0, 6, 0, 0, 
244
  0, 0, 0, 0, 0, 0, 0, 0, 
245
  0, 0, 0, 0, 0, 0, 0, 0, 
246
  0, 0, 0
247
};
248
249
static const char _khmer_syllable_machine_from_state_actions[] = {
250
  0, 0, 0, 0, 0, 0, 0, 0, 
251
  0, 0, 0, 0, 0, 0, 0, 0, 
252
  0, 0, 0, 0, 0, 7, 0, 0, 
253
  0, 0, 0, 0, 0, 0, 0, 0, 
254
  0, 0, 0, 0, 0, 0, 0, 0, 
255
  0, 0, 0
256
};
257
258
static const short _khmer_syllable_machine_eof_trans[] = {
259
  1, 1, 1, 1, 1, 1, 1, 1, 
260
  1, 1, 1, 15, 20, 15, 15, 15, 
261
  15, 15, 15, 15, 15, 0, 33, 33, 
262
  33, 33, 33, 33, 33, 33, 33, 33, 
263
  33, 42, 42, 42, 42, 42, 42, 42, 
264
  42, 42, 49
265
};
266
267
static const int khmer_syllable_machine_start = 21;
268
static const int khmer_syllable_machine_first_final = 21;
269
static const int khmer_syllable_machine_error = -1;
270
271
static const int khmer_syllable_machine_en_main = 21;
272
273
274
#line 53 "hb-ot-shaper-khmer-machine.rl"
275
276
277
278
#line 102 "hb-ot-shaper-khmer-machine.rl"
279
280
281
#define found_syllable(syllable_type) \
282
27.6k
  HB_STMT_START { \
283
27.6k
    if (0) fprintf (stderr, "syllable %u..%u %s\n", ts, te, #syllable_type); \
284
55.6k
    for (unsigned int i = ts; i < te; i++) \
285
28.0k
      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
286
27.6k
    syllable_serial++; \
287
27.6k
    if (syllable_serial == 16) syllable_serial = 1; \
288
27.6k
  } HB_STMT_END
289
290
inline void
291
find_syllables_khmer (hb_buffer_t *buffer)
292
12.9k
{
293
12.9k
  unsigned int p, pe, eof, ts, te, act HB_UNUSED;
294
12.9k
  int cs;
295
12.9k
  hb_glyph_info_t *info = buffer->info;
296
  
297
12.9k
#line 287 "hb-ot-shaper-khmer-machine.hh"
298
12.9k
  {
299
12.9k
  cs = khmer_syllable_machine_start;
300
12.9k
  ts = 0;
301
12.9k
  te = 0;
302
12.9k
  act = 0;
303
12.9k
  }
304
305
12.9k
#line 122 "hb-ot-shaper-khmer-machine.rl"
306
307
308
12.9k
  p = 0;
309
12.9k
  pe = eof = buffer->len;
310
311
12.9k
  unsigned int syllable_serial = 1;
312
  
313
12.9k
#line 299 "hb-ot-shaper-khmer-machine.hh"
314
12.9k
  {
315
12.9k
  int _slen;
316
12.9k
  int _trans;
317
12.9k
  const unsigned char *_keys;
318
12.9k
  const char *_inds;
319
12.9k
  if ( p == pe )
320
0
    goto _test_eof;
321
28.9k
_resume:
322
28.9k
  switch ( _khmer_syllable_machine_from_state_actions[cs] ) {
323
27.6k
  case 7:
324
27.6k
#line 1 "NONE"
325
27.6k
  {ts = p;}
326
27.6k
  break;
327
28.9k
#line 311 "hb-ot-shaper-khmer-machine.hh"
328
28.9k
  }
329
330
28.9k
  _keys = _khmer_syllable_machine_trans_keys + (cs<<1);
331
28.9k
  _inds = _khmer_syllable_machine_indicies + _khmer_syllable_machine_index_offsets[cs];
332
333
28.9k
  _slen = _khmer_syllable_machine_key_spans[cs];
334
28.9k
  _trans = _inds[ _slen > 0 && _keys[0] <=( info[p].khmer_category()) &&
335
13.5k
    ( info[p].khmer_category()) <= _keys[1] ?
336
15.8k
    ( info[p].khmer_category()) - _keys[0] : _slen ];
337
338
34.9k
_eof_trans:
339
34.9k
  cs = _khmer_syllable_machine_trans_targs[_trans];
340
341
34.9k
  if ( _khmer_syllable_machine_trans_actions[_trans] == 0 )
342
178
    goto _again;
343
344
34.7k
  switch ( _khmer_syllable_machine_trans_actions[_trans] ) {
345
7.08k
  case 2:
346
7.08k
#line 1 "NONE"
347
7.08k
  {te = p+1;}
348
7.08k
  break;
349
20.7k
  case 8:
350
20.7k
#line 98 "hb-ot-shaper-khmer-machine.rl"
351
20.7k
  {te = p+1;{ found_syllable (khmer_non_khmer_cluster); }}
352
20.7k
  break;
353
5.58k
  case 10:
354
5.58k
#line 96 "hb-ot-shaper-khmer-machine.rl"
355
5.58k
  {te = p;p--;{ found_syllable (khmer_consonant_syllable); }}
356
5.58k
  break;
357
1.27k
  case 11:
358
1.27k
#line 97 "hb-ot-shaper-khmer-machine.rl"
359
1.27k
  {te = p;p--;{ found_syllable (khmer_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }}
360
1.27k
  break;
361
5
  case 12:
362
5
#line 98 "hb-ot-shaper-khmer-machine.rl"
363
5
  {te = p;p--;{ found_syllable (khmer_non_khmer_cluster); }}
364
5
  break;
365
1
  case 1:
366
1
#line 96 "hb-ot-shaper-khmer-machine.rl"
367
1
  {{p = ((te))-1;}{ found_syllable (khmer_consonant_syllable); }}
368
1
  break;
369
1
  case 3:
370
1
#line 97 "hb-ot-shaper-khmer-machine.rl"
371
1
  {{p = ((te))-1;}{ found_syllable (khmer_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }}
372
1
  break;
373
0
  case 5:
374
0
#line 1 "NONE"
375
0
  { switch( act ) {
376
0
  case 2:
377
0
  {{p = ((te))-1;} found_syllable (khmer_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }
378
0
  break;
379
0
  case 3:
380
0
  {{p = ((te))-1;} found_syllable (khmer_non_khmer_cluster); }
381
0
  break;
382
0
  }
383
0
  }
384
0
  break;
385
80
  case 4:
386
80
#line 1 "NONE"
387
80
  {te = p+1;}
388
80
#line 97 "hb-ot-shaper-khmer-machine.rl"
389
80
  {act = 2;}
390
80
  break;
391
5
  case 9:
392
5
#line 1 "NONE"
393
5
  {te = p+1;}
394
5
#line 98 "hb-ot-shaper-khmer-machine.rl"
395
5
  {act = 3;}
396
5
  break;
397
34.7k
#line 368 "hb-ot-shaper-khmer-machine.hh"
398
34.7k
  }
399
400
34.9k
_again:
401
34.9k
  switch ( _khmer_syllable_machine_to_state_actions[cs] ) {
402
27.6k
  case 6:
403
27.6k
#line 1 "NONE"
404
27.6k
  {ts = 0;}
405
27.6k
  break;
406
34.9k
#line 375 "hb-ot-shaper-khmer-machine.hh"
407
34.9k
  }
408
409
34.9k
  if ( ++p != pe )
410
16.0k
    goto _resume;
411
18.9k
  _test_eof: {}
412
18.9k
  if ( p == eof )
413
18.9k
  {
414
18.9k
  if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) {
415
5.99k
    _trans = _khmer_syllable_machine_eof_trans[cs] - 1;
416
5.99k
    goto _eof_trans;
417
5.99k
  }
418
18.9k
  }
419
420
18.9k
  }
421
422
18.9k
#line 130 "hb-ot-shaper-khmer-machine.rl"
423
424
18.9k
}
425
426
#undef found_syllable
427
428
#endif /* HB_OT_SHAPER_KHMER_MACHINE_HH */