11#if __DCL_HAVE_ALLOC_DEBUG
12#undef __DCL_ALLOC_LEVEL
13#define __DCL_ALLOC_LEVEL __DCL_ALLOC_INTERNAL
23#define ILLEGAL_UCS2 -1
24#define ILLEGAL_SEQUENCE -2
26#define SOURCE_FEW_N(_mbslen) (-3-(_mbslen))
34#if __SIZEOF_WCHAR_T__ == 4
37#if __SIZEOF_WCHAR_T__ == 2
41#if __BYTE_ORDER == __BIG_ENDIAN
60 wchar_t* dstend = dst + _outCount;
63 const byte_t* srcend = src + _inCount;
67 while((srclen = srcend - src) > 0 && dst < dstend) {
74#if __SIZEOF_WCHAR_T__ == 2
75 if (uc > 0xFFFF || (0xD800 <= uc && uc < 0xE000)) {
82 src += (size_t)_mbslen;
87 _outCount = dst - _out;
105 size_t inTotal = _mbslen;
110 size_t _inCount = inTotal;
112 int r =
decode(_in, _inCount,
buf, _outCount);
113 outTotal += _outCount;
132 if (_mbslen == (
size_t) -1)
133 _mbslen = ByteString::length(_mbs);
138 size_t _inCount = _mbslen;
142 size_t _outCount = _mbslen;
145 CharBuffer*
buf = CharBuffer::create(_outCount);
146 int rn =
decode(_in, _inCount,
buf->data(), _outCount);
152 buf->data()[_outCount] = L
'\0';
153 buf->__dataLength = _outCount;
154 CharBuffer::shrink(
buf);
165 return decode(_str, _str.length());
170UTF8Decoder::UTF8Decoder()
175void UTF8Decoder::reset()
183 while (_mbslen > 0) {
197 if (!((_mbs[1] ^ 0x80) < 0x40))
200 *_uc = ((
ucs4_t)(c & 0x1F) << 6)
201 | (
ucs4_t)(_mbs[1] ^ 0x80);
209 if (!((_mbs[1] ^ 0x80) < 0x40 && (_mbs[2] ^ 0x80) < 0x40
210 && (c >= 0xE1 || _mbs[1] >= 0xA0)))
214 | ((
ucs4_t) (_mbs[1] ^ 0x80) << 6)
215 | (
ucs4_t) (_mbs[2] ^ 0x80);
216 if (ucTemp == 0xFEFF) {
231 if (!((_mbs[1] ^ 0x80) < 0x40 && (_mbs[2] ^ 0x80) < 0x40
232 && (_mbs[3] ^ 0x80) < 0x40 && (c >= 0xF1 || _mbs[1] >= 0x90)))
235 *_uc = ((
ucs4_t) (c & 0x07) << 18)
236 | ((
ucs4_t) (_mbs[1] ^ 0x80) << 12)
237 | ((
ucs4_t) (_mbs[2] ^ 0x80) << 6)
238 | (
ucs4_t) (_mbs[3] ^ 0x80);
246 if (!((_mbs[1] ^ 0x80) < 0x40 && (_mbs[2] ^ 0x80) < 0x40
247 && (_mbs[3] ^ 0x80) < 0x40 && (_mbs[4] ^ 0x80) < 0x40
248 && (c >= 0xF9 || _mbs[1] >= 0x88)))
251 *_uc = ((
ucs4_t) (c & 0x03) << 24)
252 | ((
ucs4_t) (_mbs[1] ^ 0x80) << 18)
253 | ((
ucs4_t) (_mbs[2] ^ 0x80) << 12)
254 | ((
ucs4_t) (_mbs[3] ^ 0x80) << 6)
255 | (
ucs4_t) (_mbs[4] ^ 0x80);
263 if (!((_mbs[1] ^ 0x80) < 0x40 && (_mbs[2] ^ 0x80) < 0x40
264 && (_mbs[3] ^ 0x80) < 0x40 && (_mbs[4] ^ 0x80) < 0x40
265 && (_mbs[5] ^ 0x80) < 0x40
266 && (c >= 0xFD || _mbs[1] >= 0x84)))
269 *_uc = ((
ucs4_t) (c & 0x01) << 30)
270 | ((
ucs4_t) (_mbs[1] ^ 0x80) << 24)
271 | ((
ucs4_t) (_mbs[2] ^ 0x80) << 18)
272 | ((
ucs4_t) (_mbs[3] ^ 0x80) << 12)
273 | ((
ucs4_t) (_mbs[4] ^ 0x80) << 6)
274 | (
ucs4_t) (_mbs[5] ^ 0x80);
286UTF16Decoder::UTF16Decoder(
287 int nDefaultByteOrder
297void UTF16Decoder::reset()
300 __bigEndian = __defaultBigEndian;
306 while(_mbslen >= 2) {
307 ucs4_t uc = __bigEndian ? (_mbs[0] << 8) + _mbs[1] : _mbs[0] + (_mbs[1] << 8);
311 else if (uc == 0xFFFE) {
313 __bigEndian = !__bigEndian;
315 else if (uc >= 0xD800 && uc < 0xDC00) {
317 ucs4_t uc2 = __bigEndian ? (_mbs[2] << 8) + _mbs[3] : _mbs[2] + (_mbs[3] << 8);
318 if (!(uc2 >= 0xdc00 && uc2 < 0xe000))
320 *_uc = 0x10000 + ((uc - 0xd800) << 10) + (uc2 - 0xdc00);
326 else if (uc >= 0xdc00 && uc < 0xe000) {
333 _mbs += 2; _mbslen -= 2; count += 2;
340UTF32Decoder::UTF32Decoder(
341 int nDefaultByteOrder
350void UTF32Decoder::reset()
353 __bigEndian = __defaultBigEndian;
359 while(_mbslen >= 4) {
360 ucs4_t uc = __bigEndian ? (_mbs[0] << 24) + (_mbs[1] << 16) + (_mbs[2] << 8) + _mbs[3]
361 : _mbs[0] + (_mbs[1] << 8) + (_mbs[2] << 16) + (_mbs[3] << 24);
365 if (uc == 0x0000FEFF) {
368 else if (uc == 0xFFFE0000U) {
370 __bigEndian = !__bigEndian;
373 if (uc < 0x110000 && !(uc >= 0xD800 && uc < 0xE000)) {
380 _mbs += 4; _mbslen -= 4;
387AsciiDecoder::AsciiDecoder()
403 if (_mbslen == (
size_t)-1)
404 _mbslen = ByteString::length(_mbs);
406 CharBuffer*
buf = CharBuffer::create(_mbslen);
407 wchar_t* p =
buf->data();
408 for(
size_t i = 0; i < _mbslen; i++)
409 p[i] = (
wchar_t)(
byte_t)_mbs[i];
412 buf->__dataLength = _mbslen;
422Latin1Decoder::Latin1Decoder()
434 if (_mbslen == (
size_t)-1)
435 _mbslen = ByteString::length(_mbs);
437 CharBuffer*
buf = CharBuffer::create(_mbslen);
438 wchar_t* p =
buf->data();
439 for (
size_t i = 0; i < _mbslen; i++)
440 p[i] = (
wchar_t)(
byte_t)_mbs[i];
443 buf->__dataLength = _mbslen;
453LocaleDecoder::LocaleDecoder()
458void LocaleDecoder::reset()
460 memset(&__mbstate, 0,
sizeof(__mbstate));
464int LocaleDecoder::decode(
474 wchar_t* dstend = dst + _outCount;
477 const byte_t* srcend = src + _inCount;
481 while(dst < dstend && (srclen = srcend - src) > 0) {
482 _mbslen = mbrtowc(dst, (
const char*) src, srclen, &__mbstate);
483 if (_mbslen == 0 || _mbslen == (
size_t) -1 || _mbslen == (
size_t) -2)
490 _inCount = src - _in;
491 _outCount = dst - _out;
__DCL_BEGIN_NAMESPACE typedef uint32_t ucs4_t
#define SOURCE_FEW_N(_mbslen)
#define __countof(array, type)
#define __DCL_ASSERT(expr)
#define IMPLEMENT_CLASSINFO(class_name, base_class_name)
static String decode(const char *_mbs, size_t _mbslen=(size_t) -1)
virtual int toWideChar(const byte_t *_mbs, size_t _mbslen, ucs4_t *_uc)
size_t getDecodedLength(const char *_mbs, size_t _mbslen) __DCL_THROWS1(CharsetConvertException *)
virtual int toWideChar(const byte_t *_mbs, size_t _mbslen, ucs4_t *_uc)=0
virtual int decode(const byte_t *_in, size_t &_inCount, wchar_t *_out, size_t &_outCount)
virtual int toWideChar(const byte_t *_mbs, size_t _mbslen, ucs4_t *_uc)
static String decode(const char *_mbs, size_t _nmbs=(size_t) -1)
virtual int toWideChar(const byte_t *_mbs, size_t _mbslen, ucs4_t *_uc)
virtual int toWideChar(const byte_t *_mbs, size_t _mbslen, ucs4_t *_uc)
virtual int toWideChar(const byte_t *_mbs, size_t _mbslen, ucs4_t *_uc)
virtual int toWideChar(const byte_t *_mbs, size_t _mbslen, ucs4_t *_uc)