Allow truncation to work within VFileFromMemory (#3455)
* Allow truncation to work within VFileFromMemory/VFileFromConstMemory Truncation here is limited to buffer size (allowing for shrinking but not growing the buffer size) * Don't change VFileFromConstMemory; have VFileFromMemory write "expand" size until the buffer size * 0 out "expanded" space
This commit is contained in:
parent
de3ab3889d
commit
4f9ad3a162
@ -26,6 +26,7 @@ static ssize_t _vfmWriteNoop(struct VFile* vf, const void* buffer, size_t size);
|
||||
static void* _vfmMap(struct VFile* vf, size_t size, int flags);
|
||||
static void _vfmUnmap(struct VFile* vf, void* memory, size_t size);
|
||||
static void _vfmTruncate(struct VFile* vf, size_t size);
|
||||
static void _vfmTruncateNoExpand(struct VFile* vf, size_t size);
|
||||
static void _vfmTruncateNoop(struct VFile* vf, size_t size);
|
||||
static ssize_t _vfmSize(struct VFile* vf);
|
||||
static bool _vfmSync(struct VFile* vf, void* buffer, size_t size);
|
||||
@ -51,7 +52,7 @@ struct VFile* VFileFromMemory(void* mem, size_t size) {
|
||||
vfm->d.write = _vfmWrite;
|
||||
vfm->d.map = _vfmMap;
|
||||
vfm->d.unmap = _vfmUnmap;
|
||||
vfm->d.truncate = _vfmTruncateNoop;
|
||||
vfm->d.truncate = _vfmTruncateNoExpand;
|
||||
vfm->d.size = _vfmSize;
|
||||
vfm->d.sync = _vfmSync;
|
||||
|
||||
@ -236,8 +237,12 @@ ssize_t _vfmRead(struct VFile* vf, void* buffer, size_t size) {
|
||||
ssize_t _vfmWrite(struct VFile* vf, const void* buffer, size_t size) {
|
||||
struct VFileMem* vfm = (struct VFileMem*) vf;
|
||||
|
||||
if (size + vfm->offset >= vfm->size) {
|
||||
size = vfm->size - vfm->offset;
|
||||
if (size + vfm->offset > vfm->size) {
|
||||
vfm->size = size + vfm->offset;
|
||||
if (vfm->size > vfm->bufferSize) {
|
||||
vfm->size = vfm->bufferSize;
|
||||
size = vfm->size - vfm->offset;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy((void*) ((uintptr_t) vfm->mem + vfm->offset), buffer, size);
|
||||
@ -287,6 +292,20 @@ void _vfmTruncate(struct VFile* vf, size_t size) {
|
||||
_vfmExpand(vfm, size);
|
||||
}
|
||||
|
||||
void _vfmTruncateNoExpand(struct VFile* vf, size_t size) {
|
||||
struct VFileMem* vfm = (struct VFileMem*) vf;
|
||||
|
||||
if (size > vfm->bufferSize) {
|
||||
size = vfm->bufferSize;
|
||||
}
|
||||
|
||||
if (size > vfm->size) {
|
||||
memset((void*) ((uintptr_t) vfm->mem + vfm->size), 0, size - vfm->size);
|
||||
}
|
||||
|
||||
vfm->size = size;
|
||||
}
|
||||
|
||||
void _vfmTruncateNoop(struct VFile* vf, size_t size) {
|
||||
// TODO: Return value?
|
||||
UNUSED(vf);
|
||||
|
Loading…
x
Reference in New Issue
Block a user