1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21: auto inline int32_t
22: __attribute ((always_inline))
23: findidx (const unsigned char **cpp)
24: {
25: int_fast32_t i = table[*(*cpp)++];
26: const unsigned char *cp;
27: const unsigned char *usrc;
28:
29: if (i >= 0)
30:
31: return i;
32:
33:
34:
35: cp = &extra[-i];
36: usrc = *cpp;
37: while (1)
38: {
39: size_t nhere;
40:
41:
42: i = *((const int32_t *) cp);
43: cp += sizeof (int32_t);
44:
45:
46:
47:
48: nhere = *cp++;
49:
50: if (i >= 0)
51: {
52:
53:
54:
55:
56:
57: size_t cnt;
58:
59: for (cnt = 0; cnt < nhere; ++cnt)
60: if (cp[cnt] != usrc[cnt])
61: break;
62:
63: if (cnt == nhere)
64: {
65:
66: *cpp += nhere;
67: return i;
68: }
69:
70:
71: cp += nhere;
72: if ((1 + nhere) % __alignof__ (int32_t) != 0)
73: cp += __alignof__ (int32_t) - (1 + nhere) % __alignof__ (int32_t);
74: }
75: else
76: {
77:
78:
79: size_t cnt;
80: size_t offset = 0;
81:
82: for (cnt = 0; cnt < nhere; ++cnt)
83: if (cp[cnt] != usrc[cnt])
84: break;
85:
86: if (cnt != nhere)
87: {
88: if (cp[cnt] > usrc[cnt])
89: {
90:
91: cp += 2 * nhere;
92: if ((1 + 2 * nhere) % __alignof__ (int32_t) != 0)
93: cp += (__alignof__ (int32_t)
94: - (1 + 2 * nhere) % __alignof__ (int32_t));
95: continue;
96: }
97:
98:
99: for (cnt = 0; cnt < nhere; ++cnt)
100: if (cp[nhere + cnt] != usrc[cnt])
101: break;
102:
103: if (cnt != nhere && cp[nhere + cnt] < usrc[cnt])
104: {
105:
106: cp += 2 * nhere;
107: if ((1 + 2 * nhere) % __alignof__ (int32_t) != 0)
108: cp += (__alignof__ (int32_t)
109: - (1 + 2 * nhere) % __alignof__ (int32_t));
110: continue;
111: }
112:
113:
114:
115: for (cnt = 0; cp[cnt] == usrc[cnt]; ++cnt);
116:
117: do
118: {
119: offset <<= 8;
120: offset += usrc[cnt] - cp[cnt];
121: }
122: while (++cnt < nhere);
123: }
124:
125: *cpp += nhere;
126: return indirect[-i + offset];
127: }
128: }
129:
130:
131: return 0x43219876;
132: }