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