123 if (
__input->available() >=
sizeof(bom)) {
124 size_t readCount =
__input->read(bom,
sizeof(bom));
125 if ((readCount == 4) &&
IS_UTF32(bom))
127 else if ((readCount >= 3) &&
IS_UTF8(bom))
129 else if ((readCount >= 2) &&
IS_UTF16(bom))
132 memcpy(__extra, bom, readCount);
133 __extraBytes = readCount;
140 wchar_t* outCur = _buf;
141 wchar_t* outEnd = _buf + _n;
143#define __BUFFER_SIZE__ 1024
145 size_t extraCount = __extraBytes;
148 size_t availCount =
__input->available();
149 memcpy(inBuf, __extra, extraCount);
152 while ((outCount = outEnd - outCur) && availCount) {
154 readCount =
__input->read(inBuf + extraCount, readCount);
155 availCount -= readCount;
157 size_t inCount = readCount + extraCount;
161 size_t inCountSave = inCount;
162 int r =
__decoder->decode(inBuf, inCount, outCur, outCount);
165 extraCount = inCountSave - inCount;
170 memmove(inBuf, inBuf + inCount, extraCount);
185 if ((outCount = outEnd - outCur) > 0) {
187 readCount =
__input->read(inBuf + extraCount, readCount);
188 size_t inCount = readCount + extraCount;
191 size_t inCountSave = inCount;
192 int r =
__decoder->decode(inBuf, inCount, outCur, outCount);
195 extraCount = inCountSave - inCount;
200 memmove(inBuf, inBuf + inCount, extraCount);
215 memcpy(__extra, inBuf, extraCount);
216 __extraBytes = extraCount;
218 return outCur - _buf;