텍스트를 읽는다.
121{
124
125 if (!_n)
126 return 0;
127
129 {
130 char bom[4];
131 if (
__input->available() >=
sizeof(bom))
132 {
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))
140
141 memcpy(__extra, bom, readCount);
142 __extraBytes = readCount;
143 }
144
147 }
148
149 wchar_t* outCur = _buf;
150 wchar_t* outEnd = _buf + _n;
151
152#define __BUFFER_SIZE__ 1024
154 size_t extraCount = __extraBytes;
155
156
157 size_t availCount =
__input->available();
158 memcpy(inBuf, __extra, extraCount);
159
160 size_t outCount;
161 while ((outCount = outEnd - outCur) && availCount)
162 {
164 readCount =
__input->read(inBuf + extraCount, readCount);
165 availCount -= readCount;
166
167 size_t inCount = readCount + extraCount;
168 if (!inCount)
169 break;
170
171 size_t inCountSave = inCount;
172 int r =
__decoder->decode(inBuf, inCount, outCur, outCount);
173
174
175 extraCount = inCountSave - inCount;
177 {
180 if (inCount > 0)
181 memmove(inBuf, inBuf + inCount, extraCount);
182 break;
185 break;
186 default :
187 throw(
new IOException(
toString(),
new CharsetConvertException(
r)));
188 }
189 outCur += outCount;
190 }
191
192
193 if ((outCount = outEnd - outCur) > 0)
194 {
196 readCount =
__input->read(inBuf + extraCount, readCount);
197 size_t inCount = readCount + extraCount;
198
199 if (inCount)
200 {
201 size_t inCountSave = inCount;
202 int r =
__decoder->decode(inBuf, inCount, outCur, outCount);
203
204
205 extraCount = inCountSave - inCount;
207 {
210 if (inCount > 0)
211 memmove(inBuf, inBuf + inCount, extraCount);
212 break;
215 break;
216 default :
217 throw(
new IOException(
className(),
new CharsetConvertException(
r)));
218 }
219 outCur += outCount;
220 }
221 }
222
223 memcpy(__extra, inBuf, extraCount);
224 __extraBytes = extraCount;
225
226 return outCur - _buf;
227}
#define __DCL_ASSERT(expr)
size_t __MAX(size_t x, size_t y)
size_t __MIN(size_t x, size_t y)