131 if (
__input->available() >=
sizeof(bom))
133 size_t readCount =
__input->read(bom,
sizeof(bom));
134 if ((readCount == 4) &&
IS_UTF32(bom))
136 else if ((readCount >= 3) &&
IS_UTF8(bom))
138 else if ((readCount >= 2) &&
IS_UTF16(bom))
141 memcpy(__extra, bom, readCount);
142 __extraBytes = readCount;
149 wchar_t* outCur = _buf;
150 wchar_t* outEnd = _buf + _n;
152#define __BUFFER_SIZE__ 1024
154 size_t extraCount = __extraBytes;
157 size_t availCount =
__input->available();
158 memcpy(inBuf, __extra, extraCount);
161 while ((outCount = outEnd - outCur) && availCount)
164 readCount =
__input->read(inBuf + extraCount, readCount);
165 availCount -= readCount;
167 size_t inCount = readCount + extraCount;
171 size_t inCountSave = inCount;
172 int r =
__decoder->decode(inBuf, inCount, outCur, outCount);
175 extraCount = inCountSave - inCount;
181 memmove(inBuf, inBuf + inCount, extraCount);
193 if ((outCount = outEnd - outCur) > 0)
196 readCount =
__input->read(inBuf + extraCount, readCount);
197 size_t inCount = readCount + extraCount;
201 size_t inCountSave = inCount;
202 int r =
__decoder->decode(inBuf, inCount, outCur, outCount);
205 extraCount = inCountSave - inCount;
211 memmove(inBuf, inBuf + inCount, extraCount);
223 memcpy(__extra, inBuf, extraCount);
224 __extraBytes = extraCount;
226 return outCur - _buf;