mc2: 0x00617D20
| 78 | |
| 79 | // mc2: 0x00617D20 |
| 80 | std::int32_t FileHandler::read(void *data, std::int32_t size) { |
| 81 | if (buffer_read == 0 && buffer_offset != 0 && this->flush() < 0) return -1; |
| 82 | |
| 83 | std::int32_t buffer_used = 0; |
| 84 | const std::int32_t buffer_available = buffer_read - buffer_offset; |
| 85 | if (size > buffer_available) { |
| 86 | if (buffer_available > 0) { |
| 87 | std::memcpy(data, buffer + buffer_offset, buffer_available); |
| 88 | data = reinterpret_cast<std::uint8_t *>(data) + buffer_available; |
| 89 | size -= buffer_available; |
| 90 | buffer_used = buffer_available; |
| 91 | } |
| 92 | |
| 93 | seek_pos += buffer_read; |
| 94 | buffer_read = 0; |
| 95 | buffer_offset = 0; |
| 96 | |
| 97 | if (size >= buffer_size) { |
| 98 | // skip buffering if read would consume an entire buffer |
| 99 | std::int32_t read = this->file_funcs->read(handle, data, size); |
| 100 | if (read < 0) return -1; |
| 101 | seek_pos += read; |
| 102 | return read + buffer_used; |
| 103 | } |
| 104 | |
| 105 | std::int32_t read = this->file_funcs->read(handle, buffer, buffer_size); |
| 106 | if (read < 0) return -1; |
| 107 | buffer_read = read; |
| 108 | size = std::min(size, read); |
| 109 | } |
| 110 | |
| 111 | std::memcpy(data, buffer + buffer_offset, size); |
| 112 | buffer_offset += size; |
| 113 | return buffer_used + size; |
| 114 | } |
| 115 | |
| 116 | // mc2: 0x00617F60 |
| 117 | std::int32_t FileHandler::seek(std::int32_t offset) { |