Make the FS_Seek implementation for inside PK3s slightly more sane #854
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I'd have filled out the PR template, but the link in CONTRIBUTING.md points at a non-existent file.
This is a side effect of some load times optimisation work I've done for OpenMoHAA.
Uncompressed streams cannot really be sought because each symbol depends on the symbols decoded before it. The existing implementation does a bunch of acrobatics to emulate seeking via reopening the stream, and reading and discarding all the data until the desired offset is reached.
The new implementation does the same thing, but in a less convoluted way and avoiding some unnecessary work:
The offset clamping is the only real departure from how the original works. Implementing the stdio fseek semantic (i.e. accepting out-of-bounds offsets and deferring error reporting until actually attempting a read) would be possible, but it leaves open the question of what to do with the decompress-drop loop - just don't do it? How do we keep track of the fact that the last seek was invalid, so that we can return the error upon read - with another field in
fileHandleData_t? Etc. etc. Feels like it's better to sidestep this issue and either silently clamp, or perhaps return an error.