1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/intl/uconv/ucvcn/nsISO2022CNToUnicode.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,578 @@ 1.4 +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 +#include "nsISO2022CNToUnicode.h" 1.9 +#include "nsUCSupport.h" 1.10 +#include "nsICharsetConverterManager.h" 1.11 +#include "nsServiceManagerUtils.h" 1.12 + 1.13 +static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CID); 1.14 + 1.15 +NS_IMETHODIMP nsISO2022CNToUnicode::GB2312_To_Unicode(unsigned char *aSrc, int32_t aSrcLength, char16_t * aDest, int32_t * aDestLength) 1.16 +{ 1.17 + nsresult rv; 1.18 + 1.19 + if(!mGB2312_Decoder) { 1.20 + // creating a delegate converter (GB2312) 1.21 + nsCOMPtr<nsICharsetConverterManager> ccm = 1.22 + do_GetService(kCharsetConverterManagerCID, &rv); 1.23 + if(NS_FAILED(rv)) 1.24 + return NS_ERROR_UNEXPECTED; 1.25 + 1.26 + rv = ccm->GetUnicodeDecoderRaw("GB2312", getter_AddRefs(mGB2312_Decoder)); 1.27 + if(NS_FAILED(rv)) 1.28 + return NS_ERROR_UNEXPECTED; 1.29 + } 1.30 + 1.31 + if(!mGB2312_Decoder) // failed creating a delegate converter 1.32 + return NS_ERROR_UNEXPECTED; 1.33 + 1.34 + rv = mGB2312_Decoder->Convert((const char *)aSrc, &aSrcLength, aDest, aDestLength); 1.35 + return rv; 1.36 +} 1.37 + 1.38 +NS_IMETHODIMP nsISO2022CNToUnicode::EUCTW_To_Unicode(unsigned char *aSrc, int32_t aSrcLength, char16_t * aDest, int32_t * aDestLength) 1.39 +{ 1.40 + nsresult rv; 1.41 + 1.42 + if(!mEUCTW_Decoder) { 1.43 + // creating a delegate converter (x-euc-tw) 1.44 + nsCOMPtr<nsICharsetConverterManager> ccm = 1.45 + do_GetService(kCharsetConverterManagerCID, &rv); 1.46 + if(NS_FAILED(rv)) 1.47 + return NS_ERROR_UNEXPECTED; 1.48 + 1.49 + rv = ccm->GetUnicodeDecoderRaw("x-euc-tw", getter_AddRefs(mEUCTW_Decoder)); 1.50 + if(NS_FAILED(rv)) 1.51 + return NS_ERROR_UNEXPECTED; 1.52 + } 1.53 + 1.54 + if(!mEUCTW_Decoder) // failed creating a delegate converter 1.55 + return NS_ERROR_UNEXPECTED; 1.56 + 1.57 + rv = mEUCTW_Decoder->Convert((const char *)aSrc, &aSrcLength, aDest, aDestLength); 1.58 + return(rv); 1.59 +} 1.60 + 1.61 +NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, int32_t * aSrcLen, char16_t * aDest, int32_t * aDestLen) 1.62 +{ 1.63 + const unsigned char * srcEnd = (unsigned char *)aSrc + *aSrcLen; 1.64 + const unsigned char * src = (unsigned char *) aSrc; 1.65 + char16_t* destEnd = aDest + *aDestLen; 1.66 + char16_t* dest = aDest; 1.67 + nsresult rv; 1.68 + int32_t aLen; 1.69 + 1.70 + while ((src < srcEnd)) 1.71 + { 1.72 + switch (mState) 1.73 + { 1.74 + case eState_ASCII: 1.75 + if(ESC == *src) { 1.76 + mState = eState_ESC; 1.77 + } else { 1.78 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.79 + goto error1; 1.80 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.81 + 1.82 + mState = eState_ASCII; 1.83 + } 1.84 + break; 1.85 + 1.86 + case eState_ESC: // ESC 1.87 + if('$' == *src) { 1.88 + mState = eState_ESC_24; 1.89 + } else { 1.90 + if (CHECK_OVERRUN(dest, destEnd, 2)) 1.91 + goto error1; 1.92 + *dest++ = (char16_t) ESC; 1.93 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.94 + 1.95 + mState = eState_ASCII; 1.96 + } 1.97 + break; 1.98 + 1.99 + case eState_ESC_24: // ESC $ 1.100 + if(')' == *src) { 1.101 + mState = eState_ESC_24_29; 1.102 + } else if('*' == *src) { 1.103 + mState = eState_ESC_24_2A; 1.104 + } else if('+' == *src) { 1.105 + mState = eState_ESC_24_2B; 1.106 + } else { 1.107 + if (CHECK_OVERRUN(dest, destEnd, 3)) 1.108 + goto error1; 1.109 + *dest++ = (char16_t) ESC; 1.110 + *dest++ = (char16_t) '$'; 1.111 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.112 + 1.113 + mState = eState_ASCII; 1.114 + } 1.115 + break; 1.116 + 1.117 + case eState_ESC_24_29: // ESC $ ) 1.118 + if('A' == *src) { 1.119 + mState = eState_ESC_24_29_A; 1.120 + } else if('G' == *src) { 1.121 + mState = eState_ESC_24_29_G; 1.122 + } else { 1.123 + if (CHECK_OVERRUN(dest, destEnd, 4)) 1.124 + goto error1; 1.125 + *dest++ = (char16_t) ESC; 1.126 + *dest++ = (char16_t) '$'; 1.127 + *dest++ = (char16_t) ')'; 1.128 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.129 + 1.130 + mState = eState_ASCII; 1.131 + } 1.132 + break; 1.133 + 1.134 + case eState_ESC_24_29_A: // ESC $ ) A 1.135 + if(SO == *src) { 1.136 + mState = eState_GB2312_1980; 1.137 + mRunLength = 0; 1.138 + } else { 1.139 + if (CHECK_OVERRUN(dest, destEnd, 5)) 1.140 + goto error1; 1.141 + *dest++ = (char16_t) ESC; 1.142 + *dest++ = (char16_t) '$'; 1.143 + *dest++ = (char16_t) ')'; 1.144 + *dest++ = (char16_t) 'A'; 1.145 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.146 + 1.147 + mState = eState_ASCII; 1.148 + } 1.149 + break; 1.150 + 1.151 + case eState_GB2312_1980: // ESC $ ) A SO 1.152 + if(SI == *src) { // Shift-In (SI) 1.153 + mState = eState_ESC_24_29_A_SO_SI; 1.154 + if (mRunLength == 0) { 1.155 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.156 + goto error1; 1.157 + *dest++ = 0xFFFD; 1.158 + } 1.159 + mRunLength = 0; 1.160 + } else if(ESC == *src) { 1.161 + mState = eState_ESC; 1.162 + } else { 1.163 + if(0x20 < *src && *src < 0x7f) { 1.164 + mData = *src; 1.165 + mState = eState_GB2312_1980_2ndbyte; 1.166 + } else { 1.167 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.168 + goto error1; 1.169 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.170 + } 1.171 + } 1.172 + break; 1.173 + 1.174 + case eState_GB2312_1980_2ndbyte: // ESC $ ) A SO 1.175 + if(0x20 < *src && *src < 0x7f) { 1.176 + unsigned char gb[2]; 1.177 + int32_t gbLen = 2; 1.178 + 1.179 + gb[0] = mData | 0x80; 1.180 + gb[1] = *src | 0x80; 1.181 + 1.182 + aLen = destEnd - dest; 1.183 + rv = GB2312_To_Unicode(gb, gbLen, dest, &aLen); 1.184 + ++mRunLength; 1.185 + if(rv == NS_OK_UDEC_MOREOUTPUT) { 1.186 + goto error1; 1.187 + } else if(NS_FAILED(rv)) { 1.188 + goto error2; 1.189 + } 1.190 + 1.191 + dest += aLen; 1.192 + } else { 1.193 + if (CHECK_OVERRUN(dest, destEnd, 2)) 1.194 + goto error1; 1.195 + *dest++ = (char16_t) mData; 1.196 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.197 + } 1.198 + mState = eState_GB2312_1980; 1.199 + break; 1.200 + 1.201 + case eState_ESC_24_29_A_SO_SI: // ESC $ ) A SO SI 1.202 + if(SO == *src) { 1.203 + mState = eState_GB2312_1980; 1.204 + mRunLength = 0; 1.205 + } else if(ESC == *src) { 1.206 + mState = eState_ESC; 1.207 + } else { 1.208 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.209 + goto error1; 1.210 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.211 + 1.212 + mState = eState_ESC_24_29_A_SO_SI; 1.213 + } 1.214 + break; 1.215 + 1.216 + case eState_ESC_24_29_G: // ESC $ ) G 1.217 + if(SO == *src) { 1.218 + mState = eState_CNS11643_1; 1.219 + mRunLength = 0; 1.220 + } else { 1.221 + if (CHECK_OVERRUN(dest, destEnd, 5)) 1.222 + goto error1; 1.223 + *dest++ = (char16_t) ESC; 1.224 + *dest++ = (char16_t) '$'; 1.225 + *dest++ = (char16_t) ')'; 1.226 + *dest++ = (char16_t) 'G'; 1.227 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.228 + 1.229 + mState = eState_ASCII; 1.230 + } 1.231 + break; 1.232 + 1.233 + case eState_CNS11643_1: // ESC $ ) G SO 1.234 + if(SI == *src) { // Shift-In (SI) 1.235 + mState = eState_ESC_24_29_G_SO_SI; 1.236 + if (mRunLength == 0) { 1.237 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.238 + goto error1; 1.239 + *dest++ = 0xFFFD; 1.240 + } 1.241 + mRunLength = 0; 1.242 + } else if(ESC == *src) { 1.243 + mState = eState_ESC; 1.244 + } else { 1.245 + if(0x20 < *src && *src < 0x7f) { 1.246 + mData = *src; 1.247 + mState = eState_CNS11643_1_2ndbyte; 1.248 + } else { 1.249 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.250 + goto error1; 1.251 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.252 + } 1.253 + } 1.254 + break; 1.255 + 1.256 + case eState_CNS11643_1_2ndbyte: // ESC $ ) G SO 1.257 + if(0x20 < *src && *src < 0x7f) { 1.258 + unsigned char cns[4]; 1.259 + int32_t cnsLen = 2; 1.260 + 1.261 + cns[0] = mData | 0x80; 1.262 + cns[1] = *src | 0x80; 1.263 + 1.264 + aLen = destEnd - dest; 1.265 + rv = EUCTW_To_Unicode(cns, cnsLen, dest, &aLen); 1.266 + ++mRunLength; 1.267 + if(rv == NS_OK_UDEC_MOREOUTPUT) { 1.268 + goto error1; 1.269 + } else if(NS_FAILED(rv)) { 1.270 + goto error2; 1.271 + } 1.272 + 1.273 + dest += aLen; 1.274 + } else { 1.275 + if (CHECK_OVERRUN(dest, destEnd, 2)) 1.276 + goto error1; 1.277 + *dest++ = (char16_t) mData; 1.278 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.279 + } 1.280 + mState = eState_CNS11643_1; 1.281 + break; 1.282 + 1.283 + case eState_ESC_24_29_G_SO_SI: // ESC $ ) G SO SI 1.284 + if(SO == *src) { 1.285 + mState = eState_CNS11643_1; 1.286 + mRunLength = 0; 1.287 + } else if(ESC == *src) { 1.288 + mState = eState_ESC; 1.289 + } else { 1.290 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.291 + goto error1; 1.292 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.293 + 1.294 + mState = eState_ESC_24_29_G_SO_SI; 1.295 + } 1.296 + break; 1.297 + 1.298 + case eState_ESC_24_2A: // ESC $ * 1.299 + if('H' == *src) { 1.300 + mState = eState_ESC_24_2A_H; 1.301 + } else { 1.302 + if (CHECK_OVERRUN(dest, destEnd, 4)) 1.303 + goto error1; 1.304 + *dest++ = (char16_t) ESC; 1.305 + *dest++ = (char16_t) '$'; 1.306 + *dest++ = (char16_t) '*'; 1.307 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.308 + 1.309 + mState = eState_ASCII; 1.310 + } 1.311 + break; 1.312 + 1.313 + case eState_ESC_24_2A_H: // ESC $ * H 1.314 + if(ESC == *src) { 1.315 + mState = eState_ESC_24_2A_H_ESC; 1.316 + } else { 1.317 + if (CHECK_OVERRUN(dest, destEnd, 5)) 1.318 + goto error1; 1.319 + *dest++ = (char16_t) ESC; 1.320 + *dest++ = (char16_t) '$'; 1.321 + *dest++ = (char16_t) '*'; 1.322 + *dest++ = (char16_t) 'H'; 1.323 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.324 + 1.325 + mState = eState_ASCII; 1.326 + } 1.327 + break; 1.328 + 1.329 + case eState_ESC_24_2A_H_ESC: // ESC $ * H ESC 1.330 + if(SS2 == *src) { 1.331 + mState = eState_CNS11643_2; 1.332 + mRunLength = 0; 1.333 + } else if('$' == *src) { 1.334 + mState = eState_ESC_24; 1.335 + } else { 1.336 + if (CHECK_OVERRUN(dest, destEnd, 6)) 1.337 + goto error1; 1.338 + *dest++ = (char16_t) ESC; 1.339 + *dest++ = (char16_t) '$'; 1.340 + *dest++ = (char16_t) '*'; 1.341 + *dest++ = (char16_t) 'H'; 1.342 + *dest++ = (char16_t) ESC; 1.343 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.344 + 1.345 + mState = eState_ASCII; 1.346 + } 1.347 + break; 1.348 + 1.349 + case eState_CNS11643_2: // ESC $ * H ESC SS2 1.350 + if(SI == *src) { // Shift-In (SI) 1.351 + mState = eState_ESC_24_2A_H_ESC_SS2_SI; 1.352 + if (mRunLength == 0) { 1.353 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.354 + goto error1; 1.355 + *dest++ = 0xFFFD; 1.356 + } 1.357 + mRunLength = 0; 1.358 + } else if(ESC == *src) { 1.359 + mState = eState_ESC_24_2A_H_ESC; 1.360 + } else { 1.361 + if(0x20 < *src && *src < 0x7f) { 1.362 + mData = *src; 1.363 + mState = eState_CNS11643_2_2ndbyte; 1.364 + } else { 1.365 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.366 + goto error1; 1.367 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.368 + } 1.369 + } 1.370 + break; 1.371 + 1.372 + case eState_CNS11643_2_2ndbyte: // ESC $ * H ESC SS2 1.373 + if(0x20 < *src && *src < 0x7f) { 1.374 + unsigned char cns[4]; 1.375 + int32_t cnsLen = 4; 1.376 + 1.377 + cns[0] = (unsigned char) MBYTE; 1.378 + cns[1] = (unsigned char) (PMASK + 2); 1.379 + cns[2] = mData | 0x80; 1.380 + cns[3] = *src | 0x80; 1.381 + 1.382 + aLen = destEnd - dest; 1.383 + rv = EUCTW_To_Unicode(cns, cnsLen, dest, &aLen); 1.384 + ++mRunLength; 1.385 + if(rv == NS_OK_UDEC_MOREOUTPUT) { 1.386 + goto error1; 1.387 + } else if(NS_FAILED(rv)) { 1.388 + goto error2; 1.389 + } 1.390 + 1.391 + dest += aLen; 1.392 + } else { 1.393 + if (CHECK_OVERRUN(dest, destEnd, 2)) 1.394 + goto error1; 1.395 + *dest++ = (char16_t) mData; 1.396 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.397 + } 1.398 + mState = eState_CNS11643_2; 1.399 + break; 1.400 + 1.401 + case eState_ESC_24_2A_H_ESC_SS2_SI: // ESC $ * H ESC SS2 SI 1.402 + if(ESC == *src) { 1.403 + mState = eState_ESC_24_2A_H_ESC_SS2_SI_ESC; 1.404 + } else { 1.405 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.406 + goto error1; 1.407 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.408 + 1.409 + mState = eState_ESC_24_2A_H_ESC_SS2_SI; 1.410 + } 1.411 + break; 1.412 + 1.413 + case eState_ESC_24_2A_H_ESC_SS2_SI_ESC: // ESC $ * H ESC SS2 SI ESC 1.414 + if(SS2 == *src) { 1.415 + mState = eState_CNS11643_2; 1.416 + mRunLength = 0; 1.417 + } else if('$' == *src) { 1.418 + mState = eState_ESC_24; 1.419 + } else { 1.420 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.421 + goto error1; 1.422 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.423 + 1.424 + mState = eState_ESC_24_2A_H_ESC_SS2_SI; 1.425 + } 1.426 + break; 1.427 + 1.428 + case eState_ESC_24_2B: // ESC $ + 1.429 + if('I' <= *src && *src <= 'M') { 1.430 + mState = eState_ESC_24_2B_I; 1.431 + mPlaneID = *src - 'I' + 3; 1.432 + } else { 1.433 + if (CHECK_OVERRUN(dest, destEnd, 4)) 1.434 + goto error1; 1.435 + *dest++ = (char16_t) ESC; 1.436 + *dest++ = (char16_t) '$'; 1.437 + *dest++ = (char16_t) '+'; 1.438 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.439 + 1.440 + mState = eState_ASCII; 1.441 + } 1.442 + break; 1.443 + 1.444 + case eState_ESC_24_2B_I: // ESC $ + I 1.445 + if(ESC == *src) { 1.446 + mState = eState_ESC_24_2B_I_ESC; 1.447 + } else { 1.448 + if (CHECK_OVERRUN(dest, destEnd, 5)) 1.449 + goto error1; 1.450 + *dest++ = (char16_t) ESC; 1.451 + *dest++ = (char16_t) '$'; 1.452 + *dest++ = (char16_t) '+'; 1.453 + *dest++ = (char16_t) 'I' + mPlaneID - 3; 1.454 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.455 + 1.456 + mState = eState_ASCII; 1.457 + } 1.458 + break; 1.459 + 1.460 + case eState_ESC_24_2B_I_ESC: // ESC $ + I ESC 1.461 + if(SS3 == *src) { 1.462 + mState = eState_CNS11643_3; 1.463 + mRunLength = 0; 1.464 + } else if('$' == *src) { 1.465 + mState = eState_ESC_24; 1.466 + } else { 1.467 + if (CHECK_OVERRUN(dest, destEnd, 6)) 1.468 + goto error1; 1.469 + *dest++ = (char16_t) ESC; 1.470 + *dest++ = (char16_t) '$'; 1.471 + *dest++ = (char16_t) '+'; 1.472 + *dest++ = (char16_t) 'I' + mPlaneID - 3; 1.473 + *dest++ = (char16_t) ESC; 1.474 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.475 + 1.476 + mState = eState_ASCII; 1.477 + } 1.478 + break; 1.479 + 1.480 + case eState_CNS11643_3: // ESC $ + I ESC SS3 1.481 + if(SI == *src) { // Shift-In (SI) 1.482 + mState = eState_ESC_24_2B_I_ESC_SS3_SI; 1.483 + if (mRunLength == 0) { 1.484 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.485 + goto error1; 1.486 + *dest++ = 0xFFFD; 1.487 + } 1.488 + mRunLength = 0; 1.489 + } else if(ESC == *src) { 1.490 + mState = eState_ESC_24_2B_I_ESC; 1.491 + } else { 1.492 + if(0x20 < *src && *src < 0x7f) { 1.493 + mData = *src; 1.494 + mState = eState_CNS11643_3_2ndbyte; 1.495 + } else { 1.496 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.497 + goto error1; 1.498 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.499 + } 1.500 + } 1.501 + 1.502 + break; 1.503 + 1.504 + case eState_CNS11643_3_2ndbyte: // ESC $ + I ESC SS3 1.505 + if(0x20 < *src && *src < 0x7f) { 1.506 + unsigned char cns[4]; 1.507 + int32_t cnsLen = 4; 1.508 + 1.509 + cns[0] = (unsigned char) MBYTE; 1.510 + cns[1] = (unsigned char) (PMASK + mPlaneID); 1.511 + cns[2] = mData | 0x80; 1.512 + cns[3] = *src | 0x80; 1.513 + 1.514 + aLen = destEnd - dest; 1.515 + rv = EUCTW_To_Unicode(cns, cnsLen, dest, &aLen); 1.516 + ++mRunLength; 1.517 + if(rv == NS_OK_UDEC_MOREOUTPUT) { 1.518 + goto error1; 1.519 + } else if(NS_FAILED(rv)) { 1.520 + goto error2; 1.521 + } 1.522 + 1.523 + dest += aLen; 1.524 + } else { 1.525 + if (CHECK_OVERRUN(dest, destEnd, 2)) 1.526 + goto error1; 1.527 + *dest++ = (char16_t) mData; 1.528 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.529 + } 1.530 + mState = eState_CNS11643_3; 1.531 + break; 1.532 + 1.533 + case eState_ESC_24_2B_I_ESC_SS3_SI: // ESC $ + I ESC SS3 SI 1.534 + if(ESC == *src) { 1.535 + mState = eState_ESC_24_2B_I_ESC_SS3_SI_ESC; 1.536 + } else { 1.537 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.538 + goto error1; 1.539 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.540 + 1.541 + mState = eState_ESC_24_2B_I_ESC_SS3_SI; 1.542 + } 1.543 + break; 1.544 + 1.545 + case eState_ESC_24_2B_I_ESC_SS3_SI_ESC: // ESC $ + I ESC SS3 SI ESC 1.546 + if(SS3 == *src) { 1.547 + mState = eState_CNS11643_3; 1.548 + mRunLength = 0; 1.549 + } else if('$' == *src) { 1.550 + mState = eState_ESC_24; 1.551 + } else { 1.552 + if (CHECK_OVERRUN(dest, destEnd, 1)) 1.553 + goto error1; 1.554 + *dest++ = (0x80 & *src) ? 0xFFFD : (char16_t) *src; 1.555 + 1.556 + mState = eState_ESC_24_2B_I_ESC_SS3_SI; 1.557 + } 1.558 + break; 1.559 + 1.560 + case eState_ERROR: 1.561 + NS_NOTREACHED("unhandled case"); 1.562 + goto error2; 1.563 + 1.564 + } // switch 1.565 + src++; 1.566 + } 1.567 + 1.568 + *aDestLen = dest- aDest; 1.569 + return NS_OK; 1.570 + 1.571 +error1: 1.572 + *aDestLen = dest-aDest; 1.573 + *aSrcLen = src - (const unsigned char*)aSrc; 1.574 + return NS_OK_UDEC_MOREOUTPUT; 1.575 + 1.576 +error2: 1.577 + *aSrcLen = src - (const unsigned char*)aSrc; 1.578 + *aDestLen = dest-aDest; 1.579 + mState = eState_ASCII; 1.580 + return NS_ERROR_UNEXPECTED; 1.581 +}