@@ -200,7 +200,7 @@ FileIOResult File::read_unlocked(void *data, size_t len) {
200
200
}
201
201
}
202
202
203
- FileIOResult File::read_unlocked_fbf (uint8_t *data, size_t len) {
203
+ FileIOResult File::copy_data_from_buf (uint8_t *data, size_t len) {
204
204
cpp::span<uint8_t > bufref (static_cast <uint8_t *>(buf), bufsize);
205
205
cpp::span<uint8_t > dataref (static_cast <uint8_t *>(data), len);
206
206
@@ -220,12 +220,22 @@ FileIOResult File::read_unlocked_fbf(uint8_t *data, size_t len) {
220
220
for (size_t i = 0 ; i < available_data; ++i)
221
221
dataref[i] = bufref[i + pos];
222
222
read_limit = pos = 0 ; // Reset the pointers.
223
+
224
+ return available_data;
225
+ }
226
+
227
+ FileIOResult File::read_unlocked_fbf (uint8_t *data, size_t len) {
228
+ // Read data from the buffer first.
229
+ size_t available_data = copy_data_from_buf (data, len);
230
+ if (available_data == len)
231
+ return available_data;
232
+
223
233
// Update the dataref to reflect that fact that we have already
224
234
// copied |available_data| into |data|.
225
- dataref = cpp::span<uint8_t >(dataref.data () + available_data,
226
- dataref.size () - available_data);
227
-
228
235
size_t to_fetch = len - available_data;
236
+ cpp::span<uint8_t > dataref (static_cast <uint8_t *>(data) + available_data,
237
+ to_fetch);
238
+
229
239
if (to_fetch > bufsize) {
230
240
auto result = platform_read (this , dataref.data (), to_fetch);
231
241
size_t fetched_size = result.value ;
@@ -245,7 +255,7 @@ FileIOResult File::read_unlocked_fbf(uint8_t *data, size_t len) {
245
255
read_limit += fetched_size;
246
256
size_t transfer_size = fetched_size >= to_fetch ? to_fetch : fetched_size;
247
257
for (size_t i = 0 ; i < transfer_size; ++i)
248
- dataref[i] = bufref [i];
258
+ dataref[i] = buf [i];
249
259
pos += transfer_size;
250
260
if (result.has_error () || fetched_size < to_fetch) {
251
261
if (!result.has_error ())
@@ -257,15 +267,23 @@ FileIOResult File::read_unlocked_fbf(uint8_t *data, size_t len) {
257
267
}
258
268
259
269
FileIOResult File::read_unlocked_nbf (uint8_t *data, size_t len) {
260
- auto result = platform_read (this , data, len);
270
+ // Check whether there is a character in the ungetc buffer.
271
+ size_t available_data = copy_data_from_buf (data, len);
272
+ if (available_data == len)
273
+ return available_data;
274
+
275
+ // Directly copy the data into |data|.
276
+ cpp::span<uint8_t > dataref (static_cast <uint8_t *>(data) + available_data,
277
+ len - available_data);
278
+ auto result = platform_read (this , dataref.data (), dataref.size ());
261
279
262
- if (result.has_error () || result < len ) {
280
+ if (result.has_error () || result < dataref. size () ) {
263
281
if (!result.has_error ())
264
282
eof = true ;
265
283
else
266
284
err = true ;
267
285
}
268
- return result;
286
+ return { result + available_data, result. has_error ()} ;
269
287
}
270
288
271
289
int File::ungetc_unlocked (int c) {
0 commit comments