1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <stdint.h>
21:
22:
23: int32_t
24: internal_function
25: __collidx_table_lookup (const char *table, uint32_t wc)
26: {
27: uint32_t shift1 = ((const uint32_t *) table)[0];
28: uint32_t index1 = wc >> shift1;
29: uint32_t bound = ((const uint32_t *) table)[1];
30: if (index1 < bound)
31: {
32: uint32_t lookup1 = ((const uint32_t *) table)[5 + index1];
33: if (lookup1 != 0)
34: {
35: uint32_t shift2 = ((const uint32_t *) table)[2];
36: uint32_t mask2 = ((const uint32_t *) table)[3];
37: uint32_t index2 = (wc >> shift2) & mask2;
38: uint32_t lookup2 = ((const uint32_t *)(table + lookup1))[index2];
39: if (lookup2 != 0)
40: {
41: uint32_t mask3 = ((const uint32_t *) table)[4];
42: uint32_t index3 = wc & mask3;
43: int32_t lookup3 = ((const int32_t *)(table + lookup2))[index3];
44:
45: return lookup3;
46: }
47: }
48: }
49: return 0;
50: }
51:
52:
53:
54: uint32_t
55: internal_function
56: __collseq_table_lookup (const char *table, uint32_t wc)
57: {
58: uint32_t shift1 = ((const uint32_t *) table)[0];
59: uint32_t index1 = wc >> shift1;
60: uint32_t bound = ((const uint32_t *) table)[1];
61: if (index1 < bound)
62: {
63: uint32_t lookup1 = ((const uint32_t *) table)[5 + index1];
64: if (lookup1 != 0)
65: {
66: uint32_t shift2 = ((const uint32_t *) table)[2];
67: uint32_t mask2 = ((const uint32_t *) table)[3];
68: uint32_t index2 = (wc >> shift2) & mask2;
69: uint32_t lookup2 = ((const uint32_t *)(table + lookup1))[index2];
70: if (lookup2 != 0)
71: {
72: uint32_t mask3 = ((const uint32_t *) table)[4];
73: uint32_t index3 = wc & mask3;
74: uint32_t lookup3 = ((const uint32_t *)(table + lookup2))[index3];
75:
76: return lookup3;
77: }
78: }
79: }
80: return ~((uint32_t) 0);
81: }