File indexing completed on 2024-12-22 04:33:42

0001 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
0002 /* ***** BEGIN LICENSE BLOCK *****
0003  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
0004  *
0005  * The contents of this file are subject to the Mozilla Public License Version
0006  * 1.1 (the "License"); you may not use this file except in compliance with
0007  * the License. You may obtain a copy of the License at
0008  * http://www.mozilla.org/MPL/
0009  *
0010  * Software distributed under the License is distributed on an "AS IS" basis,
0011  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
0012  * for the specific language governing rights and limitations under the
0013  * License.
0014  *
0015  * The Original Code is mozilla.org code.
0016  *
0017  * The Initial Developer of the Original Code is
0018  * Netscape Communications Corporation.
0019  * Portions created by the Initial Developer are Copyright (C) 1998
0020  * the Initial Developer. All Rights Reserved.
0021  *
0022  * Contributor(s):
0023  *
0024  * Alternatively, the contents of this file may be used under the terms of
0025  * either the GNU General Public License Version 2 or later (the "GPL"), or
0026  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
0027  * in which case the provisions of the GPL or the LGPL are applicable instead
0028  * of those above. If you wish to allow use of your version of this file only
0029  * under the terms of either the GPL or the LGPL, and not to allow others to
0030  * use your version of this file under the terms of the MPL, indicate your
0031  * decision by deleting the provisions above and replace them with the notice
0032  * and other provisions required by the GPL or the LGPL. If you do not delete
0033  * the provisions above, a recipient may use your version of this file under
0034  * the terms of any one of the MPL, the GPL or the LGPL.
0035  *
0036  * ***** END LICENSE BLOCK ***** */
0037 
0038 #pragma GCC visibility push(hidden)
0039 
0040 #include "nsCodingStateMachine.h"
0041 
0042 /*
0043 Modification from frank tang's original work:
0044 . 0x00 is allowed as a legal character. Since some web pages contains this char in 
0045   text stream.
0046 */
0047 
0048 // BIG5 
0049 
0050 static PRUint32 BIG5_cls [ 256 / 8 ] = {
0051 //PCK4BITS(0,1,1,1,1,1,1,1),  // 00 - 07 
0052 PCK4BITS(1,1,1,1,1,1,1,1),  // 00 - 07    //allow 0x00 as legal value
0053 PCK4BITS(1,1,1,1,1,1,0,0),  // 08 - 0f 
0054 PCK4BITS(1,1,1,1,1,1,1,1),  // 10 - 17 
0055 PCK4BITS(1,1,1,0,1,1,1,1),  // 18 - 1f 
0056 PCK4BITS(1,1,1,1,1,1,1,1),  // 20 - 27 
0057 PCK4BITS(1,1,1,1,1,1,1,1),  // 28 - 2f 
0058 PCK4BITS(1,1,1,1,1,1,1,1),  // 30 - 37 
0059 PCK4BITS(1,1,1,1,1,1,1,1),  // 38 - 3f 
0060 PCK4BITS(2,2,2,2,2,2,2,2),  // 40 - 47 
0061 PCK4BITS(2,2,2,2,2,2,2,2),  // 48 - 4f 
0062 PCK4BITS(2,2,2,2,2,2,2,2),  // 50 - 57 
0063 PCK4BITS(2,2,2,2,2,2,2,2),  // 58 - 5f 
0064 PCK4BITS(2,2,2,2,2,2,2,2),  // 60 - 67 
0065 PCK4BITS(2,2,2,2,2,2,2,2),  // 68 - 6f 
0066 PCK4BITS(2,2,2,2,2,2,2,2),  // 70 - 77 
0067 PCK4BITS(2,2,2,2,2,2,2,1),  // 78 - 7f 
0068 PCK4BITS(4,4,4,4,4,4,4,4),  // 80 - 87 
0069 PCK4BITS(4,4,4,4,4,4,4,4),  // 88 - 8f 
0070 PCK4BITS(4,4,4,4,4,4,4,4),  // 90 - 97 
0071 PCK4BITS(4,4,4,4,4,4,4,4),  // 98 - 9f 
0072 PCK4BITS(4,3,3,3,3,3,3,3),  // a0 - a7 
0073 PCK4BITS(3,3,3,3,3,3,3,3),  // a8 - af 
0074 PCK4BITS(3,3,3,3,3,3,3,3),  // b0 - b7 
0075 PCK4BITS(3,3,3,3,3,3,3,3),  // b8 - bf 
0076 PCK4BITS(3,3,3,3,3,3,3,3),  // c0 - c7 
0077 PCK4BITS(3,3,3,3,3,3,3,3),  // c8 - cf 
0078 PCK4BITS(3,3,3,3,3,3,3,3),  // d0 - d7 
0079 PCK4BITS(3,3,3,3,3,3,3,3),  // d8 - df 
0080 PCK4BITS(3,3,3,3,3,3,3,3),  // e0 - e7 
0081 PCK4BITS(3,3,3,3,3,3,3,3),  // e8 - ef 
0082 PCK4BITS(3,3,3,3,3,3,3,3),  // f0 - f7 
0083 PCK4BITS(3,3,3,3,3,3,3,0)   // f8 - ff 
0084 };
0085 
0086 
0087 static PRUint32 BIG5_st [ 3] = {
0088 PCK4BITS(eError,eStart,eStart,     3,eError,eError,eError,eError),//00-07 
0089 PCK4BITS(eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError),//08-0f 
0090 PCK4BITS(eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart) //10-17 
0091 };
0092 
0093 static const PRUint32 Big5CharLenTable[] = {0, 1, 1, 2, 0};
0094 
0095 SMModel Big5SMModel = {
0096   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, BIG5_cls },
0097     5,
0098   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, BIG5_st },
0099   Big5CharLenTable,
0100   "Big5",
0101 };
0102 
0103 static PRUint32 EUCJP_cls [ 256 / 8 ] = {
0104 //PCK4BITS(5,4,4,4,4,4,4,4),  // 00 - 07 
0105 PCK4BITS(4,4,4,4,4,4,4,4),  // 00 - 07 
0106 PCK4BITS(4,4,4,4,4,4,5,5),  // 08 - 0f 
0107 PCK4BITS(4,4,4,4,4,4,4,4),  // 10 - 17 
0108 PCK4BITS(4,4,4,5,4,4,4,4),  // 18 - 1f 
0109 PCK4BITS(4,4,4,4,4,4,4,4),  // 20 - 27 
0110 PCK4BITS(4,4,4,4,4,4,4,4),  // 28 - 2f 
0111 PCK4BITS(4,4,4,4,4,4,4,4),  // 30 - 37 
0112 PCK4BITS(4,4,4,4,4,4,4,4),  // 38 - 3f 
0113 PCK4BITS(4,4,4,4,4,4,4,4),  // 40 - 47 
0114 PCK4BITS(4,4,4,4,4,4,4,4),  // 48 - 4f 
0115 PCK4BITS(4,4,4,4,4,4,4,4),  // 50 - 57 
0116 PCK4BITS(4,4,4,4,4,4,4,4),  // 58 - 5f 
0117 PCK4BITS(4,4,4,4,4,4,4,4),  // 60 - 67 
0118 PCK4BITS(4,4,4,4,4,4,4,4),  // 68 - 6f 
0119 PCK4BITS(4,4,4,4,4,4,4,4),  // 70 - 77 
0120 PCK4BITS(4,4,4,4,4,4,4,4),  // 78 - 7f 
0121 PCK4BITS(5,5,5,5,5,5,5,5),  // 80 - 87 
0122 PCK4BITS(5,5,5,5,5,5,1,3),  // 88 - 8f 
0123 PCK4BITS(5,5,5,5,5,5,5,5),  // 90 - 97 
0124 PCK4BITS(5,5,5,5,5,5,5,5),  // 98 - 9f 
0125 PCK4BITS(5,2,2,2,2,2,2,2),  // a0 - a7 
0126 PCK4BITS(2,2,2,2,2,2,2,2),  // a8 - af 
0127 PCK4BITS(2,2,2,2,2,2,2,2),  // b0 - b7 
0128 PCK4BITS(2,2,2,2,2,2,2,2),  // b8 - bf 
0129 PCK4BITS(2,2,2,2,2,2,2,2),  // c0 - c7 
0130 PCK4BITS(2,2,2,2,2,2,2,2),  // c8 - cf 
0131 PCK4BITS(2,2,2,2,2,2,2,2),  // d0 - d7 
0132 PCK4BITS(2,2,2,2,2,2,2,2),  // d8 - df 
0133 PCK4BITS(0,0,0,0,0,0,0,0),  // e0 - e7 
0134 PCK4BITS(0,0,0,0,0,0,0,0),  // e8 - ef 
0135 PCK4BITS(0,0,0,0,0,0,0,0),  // f0 - f7 
0136 PCK4BITS(0,0,0,0,0,0,0,5)   // f8 - ff 
0137 };
0138 
0139 
0140 static PRUint32 EUCJP_st [ 5] = {
0141 PCK4BITS(     3,     4,     3,     5,eStart,eError,eError,eError),//00-07 
0142 PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f 
0143 PCK4BITS(eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError),//10-17 
0144 PCK4BITS(eError,eError,eStart,eError,eError,eError,     3,eError),//18-1f 
0145 PCK4BITS(     3,eError,eError,eError,eStart,eStart,eStart,eStart) //20-27 
0146 };
0147 
0148 static const PRUint32 EUCJPCharLenTable[] = {2, 2, 2, 3, 1, 0};
0149 
0150 SMModel EUCJPSMModel = {
0151   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCJP_cls },
0152    6,
0153   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCJP_st },
0154   EUCJPCharLenTable,
0155   "EUC-JP",
0156 };
0157 
0158 static PRUint32 EUCKR_cls [ 256 / 8 ] = {
0159 //PCK4BITS(0,1,1,1,1,1,1,1),  // 00 - 07 
0160 PCK4BITS(1,1,1,1,1,1,1,1),  // 00 - 07 
0161 PCK4BITS(1,1,1,1,1,1,0,0),  // 08 - 0f 
0162 PCK4BITS(1,1,1,1,1,1,1,1),  // 10 - 17 
0163 PCK4BITS(1,1,1,0,1,1,1,1),  // 18 - 1f 
0164 PCK4BITS(1,1,1,1,1,1,1,1),  // 20 - 27 
0165 PCK4BITS(1,1,1,1,1,1,1,1),  // 28 - 2f 
0166 PCK4BITS(1,1,1,1,1,1,1,1),  // 30 - 37 
0167 PCK4BITS(1,1,1,1,1,1,1,1),  // 38 - 3f 
0168 PCK4BITS(1,1,1,1,1,1,1,1),  // 40 - 47 
0169 PCK4BITS(1,1,1,1,1,1,1,1),  // 48 - 4f 
0170 PCK4BITS(1,1,1,1,1,1,1,1),  // 50 - 57 
0171 PCK4BITS(1,1,1,1,1,1,1,1),  // 58 - 5f 
0172 PCK4BITS(1,1,1,1,1,1,1,1),  // 60 - 67 
0173 PCK4BITS(1,1,1,1,1,1,1,1),  // 68 - 6f 
0174 PCK4BITS(1,1,1,1,1,1,1,1),  // 70 - 77 
0175 PCK4BITS(1,1,1,1,1,1,1,1),  // 78 - 7f 
0176 PCK4BITS(0,0,0,0,0,0,0,0),  // 80 - 87 
0177 PCK4BITS(0,0,0,0,0,0,0,0),  // 88 - 8f 
0178 PCK4BITS(0,0,0,0,0,0,0,0),  // 90 - 97 
0179 PCK4BITS(0,0,0,0,0,0,0,0),  // 98 - 9f 
0180 PCK4BITS(0,2,2,2,2,2,2,2),  // a0 - a7 
0181 PCK4BITS(2,2,2,2,2,3,3,3),  // a8 - af 
0182 PCK4BITS(2,2,2,2,2,2,2,2),  // b0 - b7 
0183 PCK4BITS(2,2,2,2,2,2,2,2),  // b8 - bf 
0184 PCK4BITS(2,2,2,2,2,2,2,2),  // c0 - c7 
0185 PCK4BITS(2,3,2,2,2,2,2,2),  // c8 - cf 
0186 PCK4BITS(2,2,2,2,2,2,2,2),  // d0 - d7 
0187 PCK4BITS(2,2,2,2,2,2,2,2),  // d8 - df 
0188 PCK4BITS(2,2,2,2,2,2,2,2),  // e0 - e7 
0189 PCK4BITS(2,2,2,2,2,2,2,2),  // e8 - ef 
0190 PCK4BITS(2,2,2,2,2,2,2,2),  // f0 - f7 
0191 PCK4BITS(2,2,2,2,2,2,2,0)   // f8 - ff 
0192 };
0193 
0194 
0195 static PRUint32 EUCKR_st [ 2] = {
0196 PCK4BITS(eError,eStart,     3,eError,eError,eError,eError,eError),//00-07 
0197 PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart) //08-0f 
0198 };
0199 
0200 static const PRUint32 EUCKRCharLenTable[] = {0, 1, 2, 0};
0201 
0202 SMModel EUCKRSMModel = {
0203   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCKR_cls },
0204   4,
0205   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCKR_st },
0206   EUCKRCharLenTable,
0207   "EUC-KR",
0208 };
0209 
0210 static PRUint32 EUCTW_cls [ 256 / 8 ] = {
0211 //PCK4BITS(0,2,2,2,2,2,2,2),  // 00 - 07 
0212 PCK4BITS(2,2,2,2,2,2,2,2),  // 00 - 07 
0213 PCK4BITS(2,2,2,2,2,2,0,0),  // 08 - 0f 
0214 PCK4BITS(2,2,2,2,2,2,2,2),  // 10 - 17 
0215 PCK4BITS(2,2,2,0,2,2,2,2),  // 18 - 1f 
0216 PCK4BITS(2,2,2,2,2,2,2,2),  // 20 - 27 
0217 PCK4BITS(2,2,2,2,2,2,2,2),  // 28 - 2f 
0218 PCK4BITS(2,2,2,2,2,2,2,2),  // 30 - 37 
0219 PCK4BITS(2,2,2,2,2,2,2,2),  // 38 - 3f 
0220 PCK4BITS(2,2,2,2,2,2,2,2),  // 40 - 47 
0221 PCK4BITS(2,2,2,2,2,2,2,2),  // 48 - 4f 
0222 PCK4BITS(2,2,2,2,2,2,2,2),  // 50 - 57 
0223 PCK4BITS(2,2,2,2,2,2,2,2),  // 58 - 5f 
0224 PCK4BITS(2,2,2,2,2,2,2,2),  // 60 - 67 
0225 PCK4BITS(2,2,2,2,2,2,2,2),  // 68 - 6f 
0226 PCK4BITS(2,2,2,2,2,2,2,2),  // 70 - 77 
0227 PCK4BITS(2,2,2,2,2,2,2,2),  // 78 - 7f 
0228 PCK4BITS(0,0,0,0,0,0,0,0),  // 80 - 87 
0229 PCK4BITS(0,0,0,0,0,0,6,0),  // 88 - 8f 
0230 PCK4BITS(0,0,0,0,0,0,0,0),  // 90 - 97 
0231 PCK4BITS(0,0,0,0,0,0,0,0),  // 98 - 9f 
0232 PCK4BITS(0,3,4,4,4,4,4,4),  // a0 - a7 
0233 PCK4BITS(5,5,1,1,1,1,1,1),  // a8 - af 
0234 PCK4BITS(1,1,1,1,1,1,1,1),  // b0 - b7 
0235 PCK4BITS(1,1,1,1,1,1,1,1),  // b8 - bf 
0236 PCK4BITS(1,1,3,1,3,3,3,3),  // c0 - c7 
0237 PCK4BITS(3,3,3,3,3,3,3,3),  // c8 - cf 
0238 PCK4BITS(3,3,3,3,3,3,3,3),  // d0 - d7 
0239 PCK4BITS(3,3,3,3,3,3,3,3),  // d8 - df 
0240 PCK4BITS(3,3,3,3,3,3,3,3),  // e0 - e7 
0241 PCK4BITS(3,3,3,3,3,3,3,3),  // e8 - ef 
0242 PCK4BITS(3,3,3,3,3,3,3,3),  // f0 - f7 
0243 PCK4BITS(3,3,3,3,3,3,3,0)   // f8 - ff 
0244 };
0245 
0246 
0247 static PRUint32 EUCTW_st [ 6] = {
0248 PCK4BITS(eError,eError,eStart,     3,     3,     3,     4,eError),//00-07 
0249 PCK4BITS(eError,eError,eError,eError,eError,eError,eItsMe,eItsMe),//08-0f 
0250 PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError),//10-17 
0251 PCK4BITS(eStart,eStart,eStart,eError,eError,eError,eError,eError),//18-1f 
0252 PCK4BITS(     5,eError,eError,eError,eStart,eError,eStart,eStart),//20-27 
0253 PCK4BITS(eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart) //28-2f 
0254 };
0255 
0256 static const PRUint32 EUCTWCharLenTable[] = {0, 0, 1, 2, 2, 2, 3};
0257 
0258 SMModel EUCTWSMModel = {
0259   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCTW_cls },
0260    7,
0261   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCTW_st },
0262   EUCTWCharLenTable,
0263   "x-euc-tw",
0264 };
0265 
0266 /* obsolete GB2312 by gb18030
0267 static PRUint32 GB2312_cls [ 256 / 8 ] = {
0268 //PCK4BITS(0,1,1,1,1,1,1,1),  // 00 - 07 
0269 PCK4BITS(1,1,1,1,1,1,1,1),  // 00 - 07 
0270 PCK4BITS(1,1,1,1,1,1,0,0),  // 08 - 0f 
0271 PCK4BITS(1,1,1,1,1,1,1,1),  // 10 - 17 
0272 PCK4BITS(1,1,1,0,1,1,1,1),  // 18 - 1f 
0273 PCK4BITS(1,1,1,1,1,1,1,1),  // 20 - 27 
0274 PCK4BITS(1,1,1,1,1,1,1,1),  // 28 - 2f 
0275 PCK4BITS(1,1,1,1,1,1,1,1),  // 30 - 37 
0276 PCK4BITS(1,1,1,1,1,1,1,1),  // 38 - 3f 
0277 PCK4BITS(1,1,1,1,1,1,1,1),  // 40 - 47 
0278 PCK4BITS(1,1,1,1,1,1,1,1),  // 48 - 4f 
0279 PCK4BITS(1,1,1,1,1,1,1,1),  // 50 - 57 
0280 PCK4BITS(1,1,1,1,1,1,1,1),  // 58 - 5f 
0281 PCK4BITS(1,1,1,1,1,1,1,1),  // 60 - 67 
0282 PCK4BITS(1,1,1,1,1,1,1,1),  // 68 - 6f 
0283 PCK4BITS(1,1,1,1,1,1,1,1),  // 70 - 77 
0284 PCK4BITS(1,1,1,1,1,1,1,1),  // 78 - 7f 
0285 PCK4BITS(1,0,0,0,0,0,0,0),  // 80 - 87 
0286 PCK4BITS(0,0,0,0,0,0,0,0),  // 88 - 8f 
0287 PCK4BITS(0,0,0,0,0,0,0,0),  // 90 - 97 
0288 PCK4BITS(0,0,0,0,0,0,0,0),  // 98 - 9f 
0289 PCK4BITS(0,2,2,2,2,2,2,2),  // a0 - a7 
0290 PCK4BITS(2,2,3,3,3,3,3,3),  // a8 - af 
0291 PCK4BITS(2,2,2,2,2,2,2,2),  // b0 - b7 
0292 PCK4BITS(2,2,2,2,2,2,2,2),  // b8 - bf 
0293 PCK4BITS(2,2,2,2,2,2,2,2),  // c0 - c7 
0294 PCK4BITS(2,2,2,2,2,2,2,2),  // c8 - cf 
0295 PCK4BITS(2,2,2,2,2,2,2,2),  // d0 - d7 
0296 PCK4BITS(2,2,2,2,2,2,2,2),  // d8 - df 
0297 PCK4BITS(2,2,2,2,2,2,2,2),  // e0 - e7 
0298 PCK4BITS(2,2,2,2,2,2,2,2),  // e8 - ef 
0299 PCK4BITS(2,2,2,2,2,2,2,2),  // f0 - f7 
0300 PCK4BITS(2,2,2,2,2,2,2,0)   // f8 - ff 
0301 };
0302 
0303 
0304 static PRUint32 GB2312_st [ 2] = {
0305 PCK4BITS(eError,eStart,     3,eError,eError,eError,eError,eError),//00-07 
0306 PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart) //08-0f 
0307 };
0308 
0309 static const PRUint32 GB2312CharLenTable[] = {0, 1, 2, 0};
0310 
0311 SMModel GB2312SMModel = {
0312   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB2312_cls },
0313    4,
0314   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB2312_st },
0315   GB2312CharLenTable,
0316   "GB2312",
0317 };
0318 */
0319 
0320 // the following state machine data was created by perl script in 
0321 // intl/chardet/tools. It should be the same as in PSM detector.
0322 static PRUint32 GB18030_cls [ 256 / 8 ] = {
0323 PCK4BITS(1,1,1,1,1,1,1,1),  // 00 - 07 
0324 PCK4BITS(1,1,1,1,1,1,0,0),  // 08 - 0f 
0325 PCK4BITS(1,1,1,1,1,1,1,1),  // 10 - 17 
0326 PCK4BITS(1,1,1,0,1,1,1,1),  // 18 - 1f 
0327 PCK4BITS(1,1,1,1,1,1,1,1),  // 20 - 27 
0328 PCK4BITS(1,1,1,1,1,1,1,1),  // 28 - 2f 
0329 PCK4BITS(3,3,3,3,3,3,3,3),  // 30 - 37 
0330 PCK4BITS(3,3,1,1,1,1,1,1),  // 38 - 3f 
0331 PCK4BITS(2,2,2,2,2,2,2,2),  // 40 - 47 
0332 PCK4BITS(2,2,2,2,2,2,2,2),  // 48 - 4f 
0333 PCK4BITS(2,2,2,2,2,2,2,2),  // 50 - 57 
0334 PCK4BITS(2,2,2,2,2,2,2,2),  // 58 - 5f 
0335 PCK4BITS(2,2,2,2,2,2,2,2),  // 60 - 67 
0336 PCK4BITS(2,2,2,2,2,2,2,2),  // 68 - 6f 
0337 PCK4BITS(2,2,2,2,2,2,2,2),  // 70 - 77 
0338 PCK4BITS(2,2,2,2,2,2,2,4),  // 78 - 7f 
0339 PCK4BITS(5,6,6,6,6,6,6,6),  // 80 - 87 
0340 PCK4BITS(6,6,6,6,6,6,6,6),  // 88 - 8f 
0341 PCK4BITS(6,6,6,6,6,6,6,6),  // 90 - 97 
0342 PCK4BITS(6,6,6,6,6,6,6,6),  // 98 - 9f 
0343 PCK4BITS(6,6,6,6,6,6,6,6),  // a0 - a7 
0344 PCK4BITS(6,6,6,6,6,6,6,6),  // a8 - af 
0345 PCK4BITS(6,6,6,6,6,6,6,6),  // b0 - b7 
0346 PCK4BITS(6,6,6,6,6,6,6,6),  // b8 - bf 
0347 PCK4BITS(6,6,6,6,6,6,6,6),  // c0 - c7 
0348 PCK4BITS(6,6,6,6,6,6,6,6),  // c8 - cf 
0349 PCK4BITS(6,6,6,6,6,6,6,6),  // d0 - d7 
0350 PCK4BITS(6,6,6,6,6,6,6,6),  // d8 - df 
0351 PCK4BITS(6,6,6,6,6,6,6,6),  // e0 - e7 
0352 PCK4BITS(6,6,6,6,6,6,6,6),  // e8 - ef 
0353 PCK4BITS(6,6,6,6,6,6,6,6),  // f0 - f7 
0354 PCK4BITS(6,6,6,6,6,6,6,0)   // f8 - ff 
0355 };
0356 
0357 
0358 static PRUint32 GB18030_st [ 6] = {
0359 PCK4BITS(eError,eStart,eStart,eStart,eStart,eStart,     3,eError),//00-07 
0360 PCK4BITS(eError,eError,eError,eError,eError,eError,eItsMe,eItsMe),//08-0f 
0361 PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart),//10-17 
0362 PCK4BITS(     4,eError,eStart,eStart,eError,eError,eError,eError),//18-1f 
0363 PCK4BITS(eError,eError,     5,eError,eError,eError,eItsMe,eError),//20-27 
0364 PCK4BITS(eError,eError,eStart,eStart,eStart,eStart,eStart,eStart) //28-2f 
0365 };
0366 
0367 // To be accurate, the length of class 6 can be either 2 or 4. 
0368 // But it is not necessary to discriminate between the two since 
0369 // it is used for frequency analysis only, and we are validating 
0370 // each code range there as well. So it is safe to set it to be 
0371 // 2 here. 
0372 static const PRUint32 GB18030CharLenTable[] = {0, 1, 1, 1, 1, 1, 2};
0373 
0374 SMModel GB18030SMModel = {
0375   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB18030_cls },
0376    7,
0377   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB18030_st },
0378   GB18030CharLenTable,
0379   "GB18030",
0380 };
0381 
0382 // sjis
0383 
0384 static PRUint32 SJIS_cls [ 256 / 8 ] = {
0385 //PCK4BITS(0,1,1,1,1,1,1,1),  // 00 - 07 
0386 PCK4BITS(1,1,1,1,1,1,1,1),  // 00 - 07 
0387 PCK4BITS(1,1,1,1,1,1,0,0),  // 08 - 0f 
0388 PCK4BITS(1,1,1,1,1,1,1,1),  // 10 - 17 
0389 PCK4BITS(1,1,1,0,1,1,1,1),  // 18 - 1f 
0390 PCK4BITS(1,1,1,1,1,1,1,1),  // 20 - 27 
0391 PCK4BITS(1,1,1,1,1,1,1,1),  // 28 - 2f 
0392 PCK4BITS(1,1,1,1,1,1,1,1),  // 30 - 37 
0393 PCK4BITS(1,1,1,1,1,1,1,1),  // 38 - 3f 
0394 PCK4BITS(2,2,2,2,2,2,2,2),  // 40 - 47 
0395 PCK4BITS(2,2,2,2,2,2,2,2),  // 48 - 4f 
0396 PCK4BITS(2,2,2,2,2,2,2,2),  // 50 - 57 
0397 PCK4BITS(2,2,2,2,2,2,2,2),  // 58 - 5f 
0398 PCK4BITS(2,2,2,2,2,2,2,2),  // 60 - 67 
0399 PCK4BITS(2,2,2,2,2,2,2,2),  // 68 - 6f 
0400 PCK4BITS(2,2,2,2,2,2,2,2),  // 70 - 77 
0401 PCK4BITS(2,2,2,2,2,2,2,1),  // 78 - 7f 
0402 PCK4BITS(3,3,3,3,3,3,3,3),  // 80 - 87 
0403 PCK4BITS(3,3,3,3,3,3,3,3),  // 88 - 8f 
0404 PCK4BITS(3,3,3,3,3,3,3,3),  // 90 - 97 
0405 PCK4BITS(3,3,3,3,3,3,3,3),  // 98 - 9f 
0406 //0xa0 is illegal in sjis encoding, but some pages does 
0407 //contain such byte. We need to be more error forgiven.
0408 PCK4BITS(2,2,2,2,2,2,2,2),  // a0 - a7     
0409 PCK4BITS(2,2,2,2,2,2,2,2),  // a8 - af 
0410 PCK4BITS(2,2,2,2,2,2,2,2),  // b0 - b7 
0411 PCK4BITS(2,2,2,2,2,2,2,2),  // b8 - bf 
0412 PCK4BITS(2,2,2,2,2,2,2,2),  // c0 - c7 
0413 PCK4BITS(2,2,2,2,2,2,2,2),  // c8 - cf 
0414 PCK4BITS(2,2,2,2,2,2,2,2),  // d0 - d7 
0415 PCK4BITS(2,2,2,2,2,2,2,2),  // d8 - df 
0416 PCK4BITS(3,3,3,3,3,3,3,3),  // e0 - e7 
0417 PCK4BITS(3,3,3,3,3,4,4,4),  // e8 - ef 
0418 PCK4BITS(4,4,4,4,4,4,4,4),  // f0 - f7 
0419 PCK4BITS(4,4,4,4,4,0,0,0)   // f8 - ff 
0420 };
0421 
0422 
0423 static PRUint32 SJIS_st [ 3] = {
0424 PCK4BITS(eError,eStart,eStart,     3,eError,eError,eError,eError),//00-07 
0425 PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f 
0426 PCK4BITS(eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart) //10-17 
0427 };
0428 
0429 static const PRUint32 SJISCharLenTable[] = {0, 1, 1, 2, 0, 0};
0430 
0431 SMModel SJISSMModel = {
0432   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, SJIS_cls },
0433    6,
0434   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, SJIS_st },
0435   SJISCharLenTable,
0436   "Shift_JIS",
0437 };
0438 
0439 
0440 static PRUint32 UCS2BE_cls [ 256 / 8 ] = {
0441 PCK4BITS(0,0,0,0,0,0,0,0),  // 00 - 07 
0442 PCK4BITS(0,0,1,0,0,2,0,0),  // 08 - 0f 
0443 PCK4BITS(0,0,0,0,0,0,0,0),  // 10 - 17 
0444 PCK4BITS(0,0,0,3,0,0,0,0),  // 18 - 1f 
0445 PCK4BITS(0,0,0,0,0,0,0,0),  // 20 - 27 
0446 PCK4BITS(0,3,3,3,3,3,0,0),  // 28 - 2f 
0447 PCK4BITS(0,0,0,0,0,0,0,0),  // 30 - 37 
0448 PCK4BITS(0,0,0,0,0,0,0,0),  // 38 - 3f 
0449 PCK4BITS(0,0,0,0,0,0,0,0),  // 40 - 47 
0450 PCK4BITS(0,0,0,0,0,0,0,0),  // 48 - 4f 
0451 PCK4BITS(0,0,0,0,0,0,0,0),  // 50 - 57 
0452 PCK4BITS(0,0,0,0,0,0,0,0),  // 58 - 5f 
0453 PCK4BITS(0,0,0,0,0,0,0,0),  // 60 - 67 
0454 PCK4BITS(0,0,0,0,0,0,0,0),  // 68 - 6f 
0455 PCK4BITS(0,0,0,0,0,0,0,0),  // 70 - 77 
0456 PCK4BITS(0,0,0,0,0,0,0,0),  // 78 - 7f 
0457 PCK4BITS(0,0,0,0,0,0,0,0),  // 80 - 87 
0458 PCK4BITS(0,0,0,0,0,0,0,0),  // 88 - 8f 
0459 PCK4BITS(0,0,0,0,0,0,0,0),  // 90 - 97 
0460 PCK4BITS(0,0,0,0,0,0,0,0),  // 98 - 9f 
0461 PCK4BITS(0,0,0,0,0,0,0,0),  // a0 - a7 
0462 PCK4BITS(0,0,0,0,0,0,0,0),  // a8 - af 
0463 PCK4BITS(0,0,0,0,0,0,0,0),  // b0 - b7 
0464 PCK4BITS(0,0,0,0,0,0,0,0),  // b8 - bf 
0465 PCK4BITS(0,0,0,0,0,0,0,0),  // c0 - c7 
0466 PCK4BITS(0,0,0,0,0,0,0,0),  // c8 - cf 
0467 PCK4BITS(0,0,0,0,0,0,0,0),  // d0 - d7 
0468 PCK4BITS(0,0,0,0,0,0,0,0),  // d8 - df 
0469 PCK4BITS(0,0,0,0,0,0,0,0),  // e0 - e7 
0470 PCK4BITS(0,0,0,0,0,0,0,0),  // e8 - ef 
0471 PCK4BITS(0,0,0,0,0,0,0,0),  // f0 - f7 
0472 PCK4BITS(0,0,0,0,0,0,4,5)   // f8 - ff 
0473 };
0474 
0475 
0476 static PRUint32 UCS2BE_st [ 7] = {
0477 PCK4BITS(     5,     7,     7,eError,     4,     3,eError,eError),//00-07 
0478 PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f 
0479 PCK4BITS(eItsMe,eItsMe,     6,     6,     6,     6,eError,eError),//10-17 
0480 PCK4BITS(     6,     6,     6,     6,     6,eItsMe,     6,     6),//18-1f 
0481 PCK4BITS(     6,     6,     6,     6,     5,     7,     7,eError),//20-27 
0482 PCK4BITS(     5,     8,     6,     6,eError,     6,     6,     6),//28-2f 
0483 PCK4BITS(     6,     6,     6,     6,eError,eError,eStart,eStart) //30-37 
0484 };
0485 
0486 static const PRUint32 UCS2BECharLenTable[] = {2, 2, 2, 0, 2, 2};
0487 
0488 SMModel UCS2BESMModel = {
0489   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UCS2BE_cls },
0490    6,
0491   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UCS2BE_st },
0492   UCS2BECharLenTable,
0493   "UTF-16BE",
0494 };
0495 
0496 static PRUint32 UCS2LE_cls [ 256 / 8 ] = {
0497 PCK4BITS(0,0,0,0,0,0,0,0),  // 00 - 07 
0498 PCK4BITS(0,0,1,0,0,2,0,0),  // 08 - 0f 
0499 PCK4BITS(0,0,0,0,0,0,0,0),  // 10 - 17 
0500 PCK4BITS(0,0,0,3,0,0,0,0),  // 18 - 1f 
0501 PCK4BITS(0,0,0,0,0,0,0,0),  // 20 - 27 
0502 PCK4BITS(0,3,3,3,3,3,0,0),  // 28 - 2f 
0503 PCK4BITS(0,0,0,0,0,0,0,0),  // 30 - 37 
0504 PCK4BITS(0,0,0,0,0,0,0,0),  // 38 - 3f 
0505 PCK4BITS(0,0,0,0,0,0,0,0),  // 40 - 47 
0506 PCK4BITS(0,0,0,0,0,0,0,0),  // 48 - 4f 
0507 PCK4BITS(0,0,0,0,0,0,0,0),  // 50 - 57 
0508 PCK4BITS(0,0,0,0,0,0,0,0),  // 58 - 5f 
0509 PCK4BITS(0,0,0,0,0,0,0,0),  // 60 - 67 
0510 PCK4BITS(0,0,0,0,0,0,0,0),  // 68 - 6f 
0511 PCK4BITS(0,0,0,0,0,0,0,0),  // 70 - 77 
0512 PCK4BITS(0,0,0,0,0,0,0,0),  // 78 - 7f 
0513 PCK4BITS(0,0,0,0,0,0,0,0),  // 80 - 87 
0514 PCK4BITS(0,0,0,0,0,0,0,0),  // 88 - 8f 
0515 PCK4BITS(0,0,0,0,0,0,0,0),  // 90 - 97 
0516 PCK4BITS(0,0,0,0,0,0,0,0),  // 98 - 9f 
0517 PCK4BITS(0,0,0,0,0,0,0,0),  // a0 - a7 
0518 PCK4BITS(0,0,0,0,0,0,0,0),  // a8 - af 
0519 PCK4BITS(0,0,0,0,0,0,0,0),  // b0 - b7 
0520 PCK4BITS(0,0,0,0,0,0,0,0),  // b8 - bf 
0521 PCK4BITS(0,0,0,0,0,0,0,0),  // c0 - c7 
0522 PCK4BITS(0,0,0,0,0,0,0,0),  // c8 - cf 
0523 PCK4BITS(0,0,0,0,0,0,0,0),  // d0 - d7 
0524 PCK4BITS(0,0,0,0,0,0,0,0),  // d8 - df 
0525 PCK4BITS(0,0,0,0,0,0,0,0),  // e0 - e7 
0526 PCK4BITS(0,0,0,0,0,0,0,0),  // e8 - ef 
0527 PCK4BITS(0,0,0,0,0,0,0,0),  // f0 - f7 
0528 PCK4BITS(0,0,0,0,0,0,4,5)   // f8 - ff 
0529 };
0530 
0531 
0532 static PRUint32 UCS2LE_st [ 7] = {
0533 PCK4BITS(     6,     6,     7,     6,     4,     3,eError,eError),//00-07 
0534 PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f 
0535 PCK4BITS(eItsMe,eItsMe,     5,     5,     5,eError,eItsMe,eError),//10-17 
0536 PCK4BITS(     5,     5,     5,eError,     5,eError,     6,     6),//18-1f 
0537 PCK4BITS(     7,     6,     8,     8,     5,     5,     5,eError),//20-27 
0538 PCK4BITS(     5,     5,     5,eError,eError,eError,     5,     5),//28-2f 
0539 PCK4BITS(     5,     5,     5,eError,     5,eError,eStart,eStart) //30-37 
0540 };
0541 
0542 static const PRUint32 UCS2LECharLenTable[] = {2, 2, 2, 2, 2, 2};
0543 
0544 SMModel UCS2LESMModel = {
0545   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UCS2LE_cls },
0546    6,
0547   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UCS2LE_st },
0548   UCS2LECharLenTable,
0549   "UTF-16LE",
0550 };
0551 
0552 
0553 static PRUint32 UTF8_cls [ 256 / 8 ] = {
0554 //PCK4BITS(0,1,1,1,1,1,1,1),  // 00 - 07 
0555 PCK4BITS(1,1,1,1,1,1,1,1),  // 00 - 07  //allow 0x00 as a legal value
0556 PCK4BITS(1,1,1,1,1,1,0,0),  // 08 - 0f 
0557 PCK4BITS(1,1,1,1,1,1,1,1),  // 10 - 17 
0558 PCK4BITS(1,1,1,0,1,1,1,1),  // 18 - 1f 
0559 PCK4BITS(1,1,1,1,1,1,1,1),  // 20 - 27 
0560 PCK4BITS(1,1,1,1,1,1,1,1),  // 28 - 2f 
0561 PCK4BITS(1,1,1,1,1,1,1,1),  // 30 - 37 
0562 PCK4BITS(1,1,1,1,1,1,1,1),  // 38 - 3f 
0563 PCK4BITS(1,1,1,1,1,1,1,1),  // 40 - 47 
0564 PCK4BITS(1,1,1,1,1,1,1,1),  // 48 - 4f 
0565 PCK4BITS(1,1,1,1,1,1,1,1),  // 50 - 57 
0566 PCK4BITS(1,1,1,1,1,1,1,1),  // 58 - 5f 
0567 PCK4BITS(1,1,1,1,1,1,1,1),  // 60 - 67 
0568 PCK4BITS(1,1,1,1,1,1,1,1),  // 68 - 6f 
0569 PCK4BITS(1,1,1,1,1,1,1,1),  // 70 - 77 
0570 PCK4BITS(1,1,1,1,1,1,1,1),  // 78 - 7f 
0571 PCK4BITS(2,2,2,2,3,3,3,3),  // 80 - 87 
0572 PCK4BITS(4,4,4,4,4,4,4,4),  // 88 - 8f 
0573 PCK4BITS(4,4,4,4,4,4,4,4),  // 90 - 97 
0574 PCK4BITS(4,4,4,4,4,4,4,4),  // 98 - 9f 
0575 PCK4BITS(5,5,5,5,5,5,5,5),  // a0 - a7 
0576 PCK4BITS(5,5,5,5,5,5,5,5),  // a8 - af 
0577 PCK4BITS(5,5,5,5,5,5,5,5),  // b0 - b7 
0578 PCK4BITS(5,5,5,5,5,5,5,5),  // b8 - bf 
0579 PCK4BITS(0,0,6,6,6,6,6,6),  // c0 - c7 
0580 PCK4BITS(6,6,6,6,6,6,6,6),  // c8 - cf 
0581 PCK4BITS(6,6,6,6,6,6,6,6),  // d0 - d7 
0582 PCK4BITS(6,6,6,6,6,6,6,6),  // d8 - df 
0583 PCK4BITS(7,8,8,8,8,8,8,8),  // e0 - e7 
0584 PCK4BITS(8,8,8,8,8,9,8,8),  // e8 - ef 
0585 PCK4BITS(10,11,11,11,11,11,11,11),  // f0 - f7 
0586 PCK4BITS(12,13,13,13,14,15,0,0)   // f8 - ff 
0587 };
0588 
0589 
0590 static PRUint32 UTF8_st [ 26] = {
0591 PCK4BITS(eError,eStart,eError,eError,eError,eError,     12,     10),//00-07 
0592 PCK4BITS(     9,     11,     8,     7,     6,     5,     4,     3),//08-0f 
0593 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//10-17 
0594 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//18-1f 
0595 PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe),//20-27 
0596 PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe),//28-2f 
0597 PCK4BITS(eError,eError,     5,     5,     5,     5,eError,eError),//30-37 
0598 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//38-3f 
0599 PCK4BITS(eError,eError,eError,     5,     5,     5,eError,eError),//40-47 
0600 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//48-4f 
0601 PCK4BITS(eError,eError,     7,     7,     7,     7,eError,eError),//50-57 
0602 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//58-5f 
0603 PCK4BITS(eError,eError,eError,eError,     7,     7,eError,eError),//60-67 
0604 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//68-6f 
0605 PCK4BITS(eError,eError,     9,     9,     9,     9,eError,eError),//70-77 
0606 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//78-7f 
0607 PCK4BITS(eError,eError,eError,eError,eError,     9,eError,eError),//80-87 
0608 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//88-8f 
0609 PCK4BITS(eError,eError,     12,     12,     12,     12,eError,eError),//90-97 
0610 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//98-9f 
0611 PCK4BITS(eError,eError,eError,eError,eError,     12,eError,eError),//a0-a7 
0612 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//a8-af 
0613 PCK4BITS(eError,eError,     12,     12,     12,eError,eError,eError),//b0-b7 
0614 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//b8-bf 
0615 PCK4BITS(eError,eError,eStart,eStart,eStart,eStart,eError,eError),//c0-c7 
0616 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError) //c8-cf 
0617 };
0618 
0619 static const PRUint32 UTF8CharLenTable[] = {0, 1, 0, 0, 0, 0, 2, 3, 
0620                             3, 3, 4, 4, 5, 5, 6, 6 };
0621 
0622 SMModel UTF8SMModel = {
0623   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UTF8_cls },
0624    16,
0625   {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UTF8_st },
0626   UTF8CharLenTable,
0627   "UTF-8",
0628 };
0629 
0630 #pragma GCC visibility pop
0631