텍스트를 읽는다.
114{
117
118 if (!_n)
119 return 0;
120
122 char bom[4];
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))
131
132 memcpy(__extra, bom, readCount);
133 __extraBytes = readCount;
134 }
135
138 }
139
140 wchar_t* outCur = _buf;
141 wchar_t* outEnd = _buf + _n;
142
143#define __BUFFER_SIZE__ 1024
145 size_t extraCount = __extraBytes;
146
147
148 size_t availCount =
__input->available();
149 memcpy(inBuf, __extra, extraCount);
150
151 size_t outCount;
152 while ((outCount = outEnd - outCur) && availCount) {
154 readCount =
__input->read(inBuf + extraCount, readCount);
155 availCount -= readCount;
156
157 size_t inCount = readCount + extraCount;
158 if (!inCount)
159 break;
160
161 size_t inCountSave = inCount;
162 int r =
__decoder->decode(inBuf, inCount, outCur, outCount);
163
164
165 extraCount = inCountSave - inCount;
169 if (inCount > 0)
170 memmove(inBuf, inBuf + inCount, extraCount);
171 break;
172 }
175 break;
176 }
177 default: {
178 throw(
new IOException(
toString(),
new CharsetConvertException(
r)));
179 }
180 }
181 outCur += outCount;
182 }
183
184
185 if ((outCount = outEnd - outCur) > 0) {
187 readCount =
__input->read(inBuf + extraCount, readCount);
188 size_t inCount = readCount + extraCount;
189
190 if (inCount) {
191 size_t inCountSave = inCount;
192 int r =
__decoder->decode(inBuf, inCount, outCur, outCount);
193
194
195 extraCount = inCountSave - inCount;
199 if (inCount > 0)
200 memmove(inBuf, inBuf + inCount, extraCount);
201 break;
202 }
205 break;
206 }
207 default: {
208 throw(
new IOException(
className(),
new CharsetConvertException(
r)));
209 }
210 }
211 outCur += outCount;
212 }
213 }
214
215 memcpy(__extra, inBuf, extraCount);
216 __extraBytes = extraCount;
217
218 return outCur - _buf;
219}
#define __DCL_ASSERT(expr)
size_t __MAX(size_t x, size_t y)
size_t __MIN(size_t x, size_t y)