1/* -*- C++ -*-
2 SPDX-FileCopyrightText: 1998 Netscape Communications Corporation <developer@mozilla.org>
3
4 SPDX-License-Identifier: MIT
5*/
6
7#include "nsCodingStateMachine.h"
8
9/*
10Modification from frank tang's original work:
11. 0x00 is allowed as a legal character. Since some web pages contains this char in
12 text stream.
13*/
14
15// BIG5
16
17namespace kencodingprober
18{
19constexpr std::array<unsigned int, 256 / 8> BIG5_cls = PCKXBITS(
20 // clang-format off
21 // 0,1,1,1,1,1,1,1, // 00 - 07
22 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 00 - 07 //allow 0x00 as legal value
23 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 0, il: 0, // 08 - 0f
24 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 10 - 17
25 il: 1, il: 1, il: 1, il: 0, il: 1, il: 1, il: 1, il: 1, // 18 - 1f
26 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 20 - 27
27 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 28 - 2f
28 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 30 - 37
29 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 38 - 3f
30 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 40 - 47
31 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 48 - 4f
32 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 50 - 57
33 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 58 - 5f
34 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 60 - 67
35 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 68 - 6f
36 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 70 - 77
37 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 1, // 78 - 7f
38 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 80 - 87
39 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 88 - 8f
40 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 90 - 97
41 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 98 - 9f
42 il: 4, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // a0 - a7
43 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // a8 - af
44 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // b0 - b7
45 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // b8 - bf
46 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // c0 - c7
47 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // c8 - cf
48 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // d0 - d7
49 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // d8 - df
50 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // e0 - e7
51 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // e8 - ef
52 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // f0 - f7
53 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 0 // f8 - ff
54 // clang-format on
55);
56
57constexpr std::array<unsigned int, 3> BIG5_st = PCKXBITS(
58 // clang-format off
59 il: eError, il: eStart, il: eStart, il: 3, il: eError, // eStart
60 il: eError, il: eError, il: eError, il: eError, il: eError, // eError
61 il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, // eItsMe
62 il: eError, il: eError, il: eStart, il: eStart, il: eStart, // 3
63 il: eStart, il: eStart, il: eStart, il: eStart // Padding
64 // clang-format on
65);
66
67static const unsigned int Big5CharLenTable[] = {0, 1, 1, 2, 0};
68
69const SMModel Big5SMModel = {
70 .classTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: BIG5_cls.data()},
71 .classFactor: 5,
72 .stateTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: BIG5_st.data()},
73 .charLenTable: Big5CharLenTable,
74 .name: "Big5",
75};
76
77constexpr std::array<unsigned int, 256 / 8> EUCJP_cls = PCKXBITS(
78 // clang-format off
79 // 5,4,4,4,4,4,4,4, // 00 - 07
80 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 00 - 07
81 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 5, il: 5, // 08 - 0f
82 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 10 - 17
83 il: 4, il: 4, il: 4, il: 5, il: 4, il: 4, il: 4, il: 4, // 18 - 1f
84 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 20 - 27
85 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 28 - 2f
86 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 30 - 37
87 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 38 - 3f
88 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 40 - 47
89 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 48 - 4f
90 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 50 - 57
91 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 58 - 5f
92 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 60 - 67
93 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 68 - 6f
94 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 70 - 77
95 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // 78 - 7f
96 il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, // 80 - 87
97 il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, il: 1, il: 3, // 88 - 8f
98 il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, // 90 - 97
99 il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, // 98 - 9f
100 il: 5, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // a0 - a7
101 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // a8 - af
102 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // b0 - b7
103 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // b8 - bf
104 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // c0 - c7
105 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // c8 - cf
106 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // d0 - d7
107 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // d8 - df
108 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // e0 - e7
109 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // e8 - ef
110 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // f0 - f7
111 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 5 // f8 - ff
112 // clang-format on
113);
114
115constexpr std::array<unsigned int, 5> EUCJP_st = PCKXBITS(
116 // clang-format off
117 il: 3, il: 4, il: 3, il: 5, il: eStart, il: eError, // eStart
118 il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, // eError
119 il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, // eItsMe
120 il: eStart, il: eError, il: eStart, il: eError, il: eError, il: eError, // 3
121 il: eError, il: eError, il: eStart, il: eError, il: eError, il: eError, // 4
122 il: 3, il: eError, il: 3, il: eError, il: eError, il: eError, // 5
123 il: eStart, il: eStart, il: eStart, il: eStart // Padding
124 // clang-format on
125);
126
127static const unsigned int EUCJPCharLenTable[] = {2, 2, 2, 3, 1, 0};
128
129const SMModel EUCJPSMModel = {
130 .classTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: EUCJP_cls.data()},
131 .classFactor: 6,
132 .stateTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: EUCJP_st.data()},
133 .charLenTable: EUCJPCharLenTable,
134 .name: "EUC-JP",
135};
136
137constexpr std::array<unsigned int, 256 / 8> EUCKR_cls = PCKXBITS(
138 // clang-format off
139 // 0,1,1,1,1,1,1,1, // 00 - 07
140 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 00 - 07
141 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 0, il: 0, // 08 - 0f
142 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 10 - 17
143 il: 1, il: 1, il: 1, il: 0, il: 1, il: 1, il: 1, il: 1, // 18 - 1f
144 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 20 - 27
145 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 28 - 2f
146 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 30 - 37
147 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 38 - 3f
148 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 40 - 47
149 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 48 - 4f
150 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 50 - 57
151 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 58 - 5f
152 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 60 - 67
153 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 68 - 6f
154 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 70 - 77
155 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 78 - 7f
156 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 80 - 87
157 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 88 - 8f
158 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 90 - 97
159 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 98 - 9f
160 il: 0, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // a0 - a7
161 il: 2, il: 2, il: 2, il: 2, il: 2, il: 3, il: 3, il: 3, // a8 - af
162 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // b0 - b7
163 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // b8 - bf
164 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // c0 - c7
165 il: 2, il: 3, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // c8 - cf
166 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // d0 - d7
167 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // d8 - df
168 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // e0 - e7
169 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // e8 - ef
170 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // f0 - f7
171 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 0 // f8 - ff
172 // clang-format on
173);
174
175constexpr std::array<unsigned int, 2> EUCKR_st = PCKXBITS(
176 // clang-format off
177 il: eError, il: eStart, il: 3, il: eError, // eStart
178 il: eError, il: eError, il: eError, il: eError, // eError
179 il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, // eItsMe
180 il: eError, il: eError, il: eStart, il: eStart // 3
181 // clang-format on
182);
183
184static const unsigned int EUCKRCharLenTable[] = {0, 1, 2, 0};
185
186const SMModel EUCKRSMModel = {
187 .classTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: EUCKR_cls.data()},
188 .classFactor: 4,
189 .stateTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: EUCKR_st.data()},
190 .charLenTable: EUCKRCharLenTable,
191 .name: "EUC-KR",
192};
193
194// the following state machine data was created by perl script in
195// intl/chardet/tools. It should be the same as in PSM detector.
196constexpr std::array<unsigned int, 256 / 8> GB18030_cls = PCKXBITS(
197 // clang-format off
198 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 00 - 07
199 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 0, il: 0, // 08 - 0f
200 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 10 - 17
201 il: 1, il: 1, il: 1, il: 0, il: 1, il: 1, il: 1, il: 1, // 18 - 1f
202 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 20 - 27
203 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 28 - 2f
204 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // 30 - 37
205 il: 3, il: 3, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 38 - 3f
206 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 40 - 47
207 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 48 - 4f
208 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 50 - 57
209 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 58 - 5f
210 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 60 - 67
211 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 68 - 6f
212 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 70 - 77
213 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 4, // 78 - 7f
214 il: 5, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // 80 - 87
215 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // 88 - 8f
216 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // 90 - 97
217 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // 98 - 9f
218 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // a0 - a7
219 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // a8 - af
220 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // b0 - b7
221 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // b8 - bf
222 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // c0 - c7
223 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // c8 - cf
224 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // d0 - d7
225 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // d8 - df
226 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // e0 - e7
227 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // e8 - ef
228 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // f0 - f7
229 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 0 // f8 - ff
230 // clang-format on
231);
232
233constexpr std::array<unsigned int, 6> GB18030_st = PCKXBITS(
234 // clang-format off
235 il: eError, il: eStart, il: eStart, il: eStart, il: eStart, il: eStart, il: 3, // eStart
236 il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, // eError
237 il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, // eItsMe
238 il: eError, il: eError, il: eStart, il: 4, il: eError, il: eStart, il: eStart, // 3
239 il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: 5, // 4
240 il: eError, il: eError, il: eError, il: eItsMe, il: eError, il: eError, il: eError, // 5
241 il: eStart, il: eStart, il: eStart, il: eStart, il: eStart, il: eStart // Padding
242 // clang-format on
243);
244
245// To be accurate, the length of class 6 can be either 2 or 4.
246// But it is not necessary to discriminate between the two since
247// it is used for frequency analysis only, and we are validating
248// each code range there as well. So it is safe to set it to be
249// 2 here.
250static const unsigned int GB18030CharLenTable[] = {0, 1, 1, 1, 1, 1, 2};
251
252const SMModel GB18030SMModel = {
253 .classTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: GB18030_cls.data()},
254 .classFactor: 7,
255 .stateTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: GB18030_st.data()},
256 .charLenTable: GB18030CharLenTable,
257 .name: "GB18030",
258};
259
260// sjis
261
262constexpr std::array<unsigned int, 256 / 8> SJIS_cls = PCKXBITS(
263 // clang-format off
264 // 0,1,1,1,1,1,1,1, // 00 - 07
265 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 00 - 07
266 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 0, il: 0, // 08 - 0f
267 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 10 - 17
268 il: 1, il: 1, il: 1, il: 0, il: 1, il: 1, il: 1, il: 1, // 18 - 1f
269 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 20 - 27
270 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 28 - 2f
271 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 30 - 37
272 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 38 - 3f
273 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 40 - 47
274 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 48 - 4f
275 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 50 - 57
276 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 58 - 5f
277 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 60 - 67
278 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 68 - 6f
279 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 70 - 77
280 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 1, // 78 - 7f
281 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // 80 - 87
282 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // 88 - 8f
283 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // 90 - 97
284 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // 98 - 9f
285 // 0xa0 is illegal in sjis encoding, but some pages does
286 // contain such byte. We need to be more error forgiven.
287 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // a0 - a7
288 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // a8 - af
289 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // b0 - b7
290 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // b8 - bf
291 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // c0 - c7
292 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // c8 - cf
293 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // d0 - d7
294 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // d8 - df
295 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // e0 - e7
296 il: 3, il: 3, il: 3, il: 3, il: 3, il: 4, il: 4, il: 4, // e8 - ef
297 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // f0 - f7
298 il: 4, il: 4, il: 4, il: 4, il: 4, il: 0, il: 0, il: 0 // f8 - ff
299 // clang-format on
300);
301
302constexpr std::array<unsigned int, 3> SJIS_st = PCKXBITS(
303 // clang-format off
304 il: eError, il: eStart, il: eStart, il: 3, il: eError, il: eError, // eStart
305 il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, // eError
306 il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, // eItsMe
307 il: eError, il: eError, il: eStart, il: eStart, il: eStart, il: eStart // 3
308 // clang-format on
309);
310
311static const unsigned int SJISCharLenTable[] = {0, 1, 1, 2, 0, 0};
312
313const SMModel SJISSMModel = {
314 .classTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: SJIS_cls.data()},
315 .classFactor: 6,
316 .stateTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: SJIS_st.data()},
317 .charLenTable: SJISCharLenTable,
318 .name: "Shift_JIS",
319};
320
321constexpr std::array<unsigned int, 256 / 8> UCS2BE_cls = PCKXBITS(
322 // clang-format off
323 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 00 - 07
324 il: 0, il: 0, il: 1, il: 0, il: 0, il: 2, il: 0, il: 0, // 08 - 0f
325 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 10 - 17
326 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 18 - 1f
327 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 20 - 27
328 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 28 - 2f
329 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 30 - 37
330 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 38 - 3f
331 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 40 - 47
332 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 48 - 4f
333 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 50 - 57
334 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 58 - 5f
335 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 60 - 67
336 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 68 - 6f
337 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 70 - 77
338 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 78 - 7f
339 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 80 - 87
340 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 88 - 8f
341 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 90 - 97
342 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 98 - 9f
343 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // a0 - a7
344 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // a8 - af
345 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // b0 - b7
346 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // b8 - bf
347 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // c0 - c7
348 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // c8 - cf
349 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // d0 - d7
350 il: 6, il: 6, il: 6, il: 6, il: 7, il: 7, il: 7, il: 7, // d8 - df
351 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // e0 - e7
352 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // e8 - ef
353 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // f0 - f7
354 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 4, il: 5 // f8 - ff
355 // clang-format on
356);
357
358// eStart and "6" are MSB states, "5" and "7" are LSB
359// 9 is High Surrogate low byte
360// 10 is Low Surrogate high byte
361constexpr std::array<unsigned int, 11> UCS2BE_st = PCKXBITS(
362 // clang-format off
363 il: 5, il: 7, il: 7, il: eError, il: 4, il: 3, il: 9, il: eError, // 0
364 il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, // 1
365 il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, // 2
366 il: 6, il: 6, il: 6, il: 6, il: eError, il: eError, il: 9, il: 6, // 3
367 il: 6, il: 6, il: 6, il: 6, il: 6, il: eItsMe, il: 6, il: 6, // 4
368 il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, il: 6, // 5
369 il: 5, il: 7, il: 7, il: eError, il: 5, il: 8, il: 9, il: eError, // 6
370 il: 6, il: 6, il: eError, il: 6, il: 6, il: 6, il: 9, il: 6, // 7
371 il: 6, il: 6, il: 6, il: 6, il: eError, il: eError, il: 9, il: 6, // 8
372 il: 10, il: 10, il: 10, il: 10, il: 10, il: 10, il: 10, il: 10, // 9
373 il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: 6 // 10
374 // clang-format on
375);
376
377static const unsigned int UCS2BECharLenTable[] = {2, 2, 2, 0, 2, 2, 4, 4};
378
379const SMModel UCS2BESMModel = {
380 .classTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: UCS2BE_cls.data()},
381 .classFactor: 8,
382 .stateTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: UCS2BE_st.data()},
383 .charLenTable: UCS2BECharLenTable,
384 .name: "UTF-16BE",
385};
386
387constexpr std::array<unsigned int, 256 / 8> UCS2LE_cls = PCKXBITS(
388 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 00 - 07
389 il: 0, il: 0, il: 1, il: 0, il: 0, il: 2, il: 0, il: 0, // 08 - 0f
390 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 10 - 17
391 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 18 - 1f
392 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 20 - 27
393 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 28 - 2f
394 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 30 - 37
395 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 38 - 3f
396 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 40 - 47
397 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 48 - 4f
398 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 50 - 57
399 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 58 - 5f
400 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 60 - 67
401 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 68 - 6f
402 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 70 - 77
403 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 78 - 7f
404 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 80 - 87
405 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 88 - 8f
406 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 90 - 97
407 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // 98 - 9f
408 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // a0 - a7
409 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // a8 - af
410 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // b0 - b7
411 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // b8 - bf
412 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // c0 - c7
413 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // c8 - cf
414 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // d0 - d7
415 il: 6, il: 6, il: 6, il: 6, il: 7, il: 7, il: 7, il: 7, // d8 - df
416 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // e0 - e7
417 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // e8 - ef
418 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, // f0 - f7
419 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 4, il: 5 // f8 - ff
420);
421
422// eStart and "5" are LSB states, "3", "4", "6", "7" and "8" are MSB
423// 9 is Low Surrogate LSB
424// 10 is Low Surrogate MSB
425constexpr std::array<unsigned int, 11> UCS2LE_st = PCKXBITS(
426 // clang-format off
427 il: 6, il: 6, il: 7, il: 6, il: 4, il: 3, il: 6, il: 6, // 0
428 il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, // 1
429 il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, // 2
430 il: 5, il: 5, il: 5, il: eError, il: eItsMe, il: eError, il: 9, il: eError, // 3
431 il: 5, il: 5, il: 5, il: eError, il: 5, il: eError, il: 9, il: eError, // 4
432 il: 6, il: 6, il: 7, il: 6, il: 8, il: 8, il: 6, il: 6, // 5
433 il: 5, il: 5, il: 5, il: eError, il: 5, il: 5, il: 9, il: eError, // 6
434 il: 5, il: eError, il: eError, il: eError, il: 5, il: 5, il: 9, il: eError, // 7
435 il: 5, il: 5, il: 5, il: eError, il: 5, il: eError, il: 9, il: eError, // 8
436 il: 10, il: 10, il: 10, il: 10, il: 10, il: 10, il: 10, il: 10, // 9
437 il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: 5 // 10
438 // clang-format on
439);
440
441
442static const unsigned int UCS2LECharLenTable[] = {2, 2, 2, 2, 2, 2, 4, 4};
443
444const SMModel UCS2LESMModel = {
445 .classTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: UCS2LE_cls.data()},
446 .classFactor: 8,
447 .stateTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: UCS2LE_st.data()},
448 .charLenTable: UCS2LECharLenTable,
449 .name: "UTF-16LE",
450};
451
452constexpr std::array<unsigned int, 256 / 8> UTF8_cls = PCKXBITS(
453 // clang-format off
454 // 0,1,1,1,1,1,1,1, // 00 - 07
455 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 00 - 07 //allow 0x00 as a legal value
456 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 0, il: 0, // 08 - 0f
457 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 10 - 17
458 il: 1, il: 1, il: 1, il: 0, il: 1, il: 1, il: 1, il: 1, // 18 - 1f
459 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 20 - 27
460 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 28 - 2f
461 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 30 - 37
462 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 38 - 3f
463 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 40 - 47
464 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 48 - 4f
465 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 50 - 57
466 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 58 - 5f
467 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 60 - 67
468 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 68 - 6f
469 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 70 - 77
470 il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, il: 1, // 78 - 7f
471 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 80 - 87
472 il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, il: 2, // 88 - 8f
473 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // 90 - 97
474 il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, il: 3, // 98 - 9f
475 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // a0 - a7
476 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // a8 - af
477 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // b0 - b7
478 il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, il: 4, // b8 - bf
479 il: 0, il: 0, il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, // c0 - c7
480 il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, // c8 - cf
481 il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, // d0 - d7
482 il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, il: 5, // d8 - df
483 il: 6, il: 7, il: 7, il: 7, il: 7, il: 7, il: 7, il: 7, // e0 - e7
484 il: 7, il: 7, il: 7, il: 7, il: 7, il: 8, il: 7, il: 7, // e7 - ef
485 il: 9, il: 10, il: 10, il: 10, il: 11, il: 0, il: 0, il: 0, // f0 - f7
486 il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0, il: 0 // f8 - ff
487 // clang-format on
488);
489
490constexpr std::array<unsigned int, 10 * 12 / 8> UTF8_st = PCKXBITS(
491 // clang-format off
492 // byteclass:
493 // 0 1 2 3 4 5 6 7 8 9 10 11
494 il: eError, il: eStart, il: eError, il: eError, il: eError, il: 3, il: 4, il: 5, il: 6, il: 7, il: 8, il: 9, // eStart
495 il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, // eError
496 il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, il: eItsMe, // eItsMe
497 il: eError, il: eError, il: eStart, il: eStart, il: eStart, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, // 3
498 il: eError, il: eError, il: eError, il: eError, il: 3, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, // 4
499 il: eError, il: eError, il: 3, il: 3, il: 3, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, // 5
500 il: eError, il: eError, il: 3, il: 3, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, // 6
501 il: eError, il: eError, il: eError, il: 5, il: 5, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, // 7
502 il: eError, il: eError, il: 5, il: 5, il: 5, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, // 8
503 il: eError, il: eError, il: 5, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError, il: eError // 9
504 // clang-format on
505);
506
507static const unsigned int UTF8CharLenTable[] = {0, 1, 1, 1, 1, 1, 2, 3, 3, 3, 4, 4};
508
509const SMModel UTF8SMModel = {
510 .classTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: UTF8_cls.data()},
511 .classFactor: 12,
512 .stateTable: {.idxsft: eIdxSft4bits, .sftmsk: eSftMsk4bits, .bitsft: eBitSft4bits, .unitmsk: eUnitMsk4bits, .data: UTF8_st.data()},
513 .charLenTable: UTF8CharLenTable,
514 .name: "UTF-8",
515};
516}
517

source code of kcodecs/src/probers/nsMBCSSM.cpp