7 #ifndef __UTF8_DFA_DECODER_H 8 #define __UTF8_DFA_DECODER_H 12 enum State : uint8_t {
17 kThreeByteLowMid = 48,
21 kFourByteMidHigh = 96,
24 static inline void Decode(uint8_t byte, State* state,
uint32_t* buffer) {
26 static constexpr uint8_t transitions[] = {
27 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
28 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
29 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
30 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
31 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
32 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
33 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
34 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
36 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
37 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
38 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
39 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
40 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
41 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5,
42 11, 7, 7, 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
58 static constexpr uint8_t states[] = {
59 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
60 12, 0, 0, 0, 24, 36, 48, 60, 72, 0, 84, 96,
61 0, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0,
62 0, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0,
63 0, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0,
64 0, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0,
65 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
66 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0,
67 0, 0, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0,
70 uint8_t type = transitions[byte];
71 *state =
static_cast<State
>(states[*state + type]);
72 *buffer = (*buffer << 6) | (byte & (0x7F >> (type >> 1)));