Skip to content

Commit 077bbd7

Browse files
authored
Merge pull request #1899 from nicolasnoble/read-slice
Adding the ability to read slices from Lua.
2 parents 45675f1 + 93dda66 commit 077bbd7

File tree

3 files changed

+50
-11
lines changed

3 files changed

+50
-11
lines changed

src/lua/fileffi-cdef.lua

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ void closeFile(LuaFile* wrapper);
5656

5757
uint64_t readFileRawPtr(LuaFile* wrapper, void* dst, uint64_t size);
5858
uint64_t readFileBuffer(LuaFile* wrapper, LuaBuffer* buffer);
59+
LuaSlice* readFileToSlice(LuaFile* wrapper, uint64_t size);
60+
uint64_t readFileToExistingSlice(LuaFile* wrapper, LuaSlice* slice, uint64_t size);
5961

6062
uint64_t writeFileRawPtr(LuaFile* wrapper, const const void* data, uint64_t size);
6163
uint64_t writeFileBuffer(LuaFile* wrapper, const LuaBuffer* buffer);
@@ -70,6 +72,8 @@ uint64_t getFileSize(LuaFile*);
7072

7173
uint64_t readFileAtRawPtr(LuaFile* wrapper, void* dst, uint64_t size, uint64_t pos);
7274
uint64_t readFileAtBuffer(LuaFile* wrapper, LuaBuffer* buffer, uint64_t pos);
75+
LuaSlice* readFileAtToSlice(LuaFile* wrapper, uint64_t size, uint64_t pos);
76+
uint64_t readFileAtToExistingSlice(LuaFile* wrapper, LuaSlice* slice, uint64_t size, uint64_t pos);
7377

7478
uint64_t writeFileAtRawPtr(LuaFile* wrapper, const const void* data, uint64_t size, uint64_t pos);
7579
uint64_t writeFileAtBuffer(LuaFile* wrapper, const LuaBuffer* buffer, uint64_t pos);

src/lua/fileffi.lua

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ local C = ffi.load 'SUPPORT_FILE'
2020
local function validateBuffer(buffer)
2121
if buffer:maxsize() < buffer.size then
2222
error('Invalid or corrupted LuaBuffer: claims size of ' .. buffer.size .. ' but actual size is ' ..
23-
buffer:maxsize())
23+
buffer:maxsize())
2424
end
2525
return buffer
2626
end
@@ -34,13 +34,21 @@ local function read(self, ptr, size)
3434
return validateBuffer(buf)
3535
elseif type(ptr) == 'cdata' and size == nil and ffi.typeof(ptr) == Support.File._LuaBuffer then
3636
return Support.extra.safeFFI('File::read(C.readFileBuffer)', C.readFileBuffer, self._wrapper,
37-
validateBuffer(ptr))
37+
validateBuffer(ptr))
3838
elseif type(ptr) == 'userdata' and size == nil then
3939
return Support._internal.readFileUserData(self._wrapper, ptr)
40+
elseif type(ptr) == 'table' and ptr._type == 'Slice' then
41+
return Support.extra.safeFFI('File::read(C.readFileToExistingSlice)', C.readFileToExistingSlice, self._wrapper,
42+
ptr._wrapper, size or ptr:size())
4043
end
4144
return Support.extra.safeFFI('File::read(C.readFileRawPtr)', C.readFileRawPtr, self._wrapper, ptr, size)
4245
end
4346

47+
local function readToSlice(self, size)
48+
return Support.File._createSliceWrapper(Support.extra.safeFFI('File::read(C.readFileToSlice)', C.readFileToSlice,
49+
self._wrapper, size))
50+
end
51+
4452
local function readAt(self, ptr, size, pos)
4553
if type(ptr) == 'number' and type(size) == 'number' and pos == nil then
4654
pos = size
@@ -51,40 +59,48 @@ local function readAt(self, ptr, size, pos)
5159
return validateBuffer(buf)
5260
elseif type(ptr) == 'cdata' and type(size) == 'number' and pos == nil and ffi.typeof(ptr) == LuaBuffer then
5361
return Support.extra.safeFFI('File::readAt(C.readFileAtBuffer)', C.readFileAtBuffer, self._wrapper,
54-
validateBuffer(ptr), size)
62+
validateBuffer(ptr), size)
5563
elseif type(ptr) == 'userdata' and type(size) == 'number' and pos == nil then
5664
return Support._internal.readFileAtUserData(self._wrapper, ptr, size)
65+
elseif type(ptr) == 'table' and ptr._type == 'Slice' then
66+
return Support.extra.safeFFI('File::readAt(C.readFileAtToExistingSlice)', C.readFileAtToExistingSlice,
67+
self._wrapper, ptr._wrapper, size or ptr:size(), pos)
5768
end
5869
return Support.extra.safeFFI('File::readAt(C.readFileAtRawPtr)', C.readFileAtRawPtr, self._wrapper, ptr, size, pos)
5970
end
6071

72+
local function readAtToSlice(self, size, pos)
73+
return Support.File._createSliceWrapper(Support.extra.safeFFI('File::readAt(C.readFileAtToSlice)',
74+
C.readFileAtToSlice, self._wrapper, size, pos))
75+
end
76+
6177
local function write(self, data, size)
6278
if type(data) == 'cdata' and size == nil and ffi.typeof(data) == LuaBuffer then
6379
return Support.extra.safeFFI('File::write(C.writeFileBuffer)', C.writeFileBuffer, self._wrapper,
64-
validateBuffer(data))
80+
validateBuffer(data))
6581
elseif type(data) == 'userdata' and size == nil then
6682
return Support._internal.writeFileUserData(self._wrapper, data)
6783
elseif type(size) == 'number' then
6884
return Support.extra.safeFFI('File::write(C.writeFileRawPtr)', C.writeFileRawPtr, self._wrapper, data, size)
6985
end
7086
if type(data) ~= 'string' then data = tostring(data) end
7187
return Support.extra.safeFFI('File::write(C.writeFileRawPtr)', C.writeFileRawPtr, self._wrapper, data,
72-
string.len(data))
88+
string.len(data))
7389
end
7490

7591
local function writeAt(self, data, size, pos)
7692
if type(data) == 'cdata' and type(size) == 'number' and pos == nil and ffi.typeof(data) == LuaBuffer then
7793
return Support.extra.safeFFI('File::writeAt(C.writeFileAtBuffer)', C.writeFileAtBuffer, self._wrapper,
78-
validateBuffer(data), size)
94+
validateBuffer(data), size)
7995
elseif type(data) == 'userdata' and type(size) == 'number' and pos == nil then
8096
return Support._internal.writeFileAtUserData(self._wrapper, data, size)
8197
elseif type(size) == 'number' and type(pos) == 'number' then
8298
return Support.extra.safeFFI('File::writeAt(C.writeFileAtRawPtr)', C.writeFileAtRawPtr, self._wrapper, data,
83-
size, pos)
99+
size, pos)
84100
end
85101
if type(data) ~= 'string' then data = tostring(data) end
86102
return Support.extra.safeFFI('File::writeAt(C.writeFileAtRawPtr)', C.writeFileAtRawPtr, self._wrapper, data,
87-
string.len(data), size)
103+
string.len(data), size)
88104
end
89105

90106
local function writeMoveSlice(self, slice) C.writeFileMoveSlice(self._wrapper, slice._wrapper) end
@@ -172,7 +188,9 @@ local function createFileWrapper(wrapper)
172188
_type = 'File',
173189
close = function(self) Support.extra.safeFFI('File::close', C.closeFile, self._wrapper) end,
174190
read = read,
191+
readToSlice = readToSlice,
175192
readAt = readAt,
193+
readAtToSlice = readAtToSlice,
176194
gets = function(self) return Support._internal.readFileGets(self._wrapper) end,
177195
write = write,
178196
writeAt = writeAt,
@@ -301,10 +319,10 @@ end
301319
local function ffmpegAudioFile(file, options)
302320
if type(options) ~= 'table' then options = {} end
303321
local channels, endianness, sampleFormat, frequency = options.channels, options.endianness, options.sampleFormat,
304-
options.frequency
322+
options.frequency
305323
return createFileWrapper(Support.extra.safeFFI('Support.File.ffmpegAudioFile', C.ffmpegAudioFile, file._wrapper,
306-
channels or 'Stereo', endianness or 'Little', sampleFormat or 'S16',
307-
frequency or 44100))
324+
channels or 'Stereo', endianness or 'Little', sampleFormat or 'S16',
325+
frequency or 44100))
308326
end
309327

310328
if (type(Support) ~= 'table') then Support = {} end

src/lua/luafile.cc

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ uint64_t readFileBuffer(LuaFile* wrapper, void* buffer) {
8686
uint8_t* data = reinterpret_cast<uint8_t*>(pSize + 1);
8787
return *pSize = wrapper->file->read(data, *pSize);
8888
}
89+
PCSX::Slice* readFileToSlice(LuaFile* wrapper, uint64_t size) {
90+
return new PCSX::Slice(std::move(wrapper->file->read(size)));
91+
}
92+
uint64_t readFileToExistingSlice(LuaFile* wrapper, PCSX::Slice* slice, uint64_t size) {
93+
return wrapper->file->read(slice->mutableData(), size);
94+
}
8995

9096
uint64_t writeFileRawPtr(LuaFile* wrapper, const uint8_t* data, uint64_t size) {
9197
return wrapper->file->write(data, size);
@@ -117,6 +123,12 @@ uint64_t readFileAtBuffer(LuaFile* wrapper, void* buffer, uint64_t pos) {
117123
uint8_t* data = reinterpret_cast<uint8_t*>(pSize + 1);
118124
return *pSize = wrapper->file->readAt(data, *pSize, pos);
119125
}
126+
PCSX::Slice* readFileAtToSlice(LuaFile* wrapper, uint64_t size, uint64_t pos) {
127+
return new PCSX::Slice(std::move(wrapper->file->readAt(pos, size)));
128+
}
129+
uint64_t readFileAtToExistingSlice(LuaFile* wrapper, PCSX::Slice* slice, uint64_t size, uint64_t pos) {
130+
return wrapper->file->readAt(slice->mutableData(), size, pos);
131+
}
120132

121133
uint64_t writeFileAtRawPtr(LuaFile* wrapper, const uint8_t* data, uint64_t size, uint64_t pos) {
122134
return wrapper->file->writeAt(data, size, pos);
@@ -312,6 +324,9 @@ static void registerAllSymbols(PCSX::Lua L) {
312324

313325
REGISTER(L, readFileRawPtr);
314326
REGISTER(L, readFileBuffer);
327+
REGISTER(L, readFileToSlice);
328+
REGISTER(L, readFileToExistingSlice);
329+
315330
REGISTER(L, writeFileRawPtr);
316331
REGISTER(L, writeFileBuffer);
317332
REGISTER(L, writeFileMoveSlice);
@@ -325,6 +340,8 @@ static void registerAllSymbols(PCSX::Lua L) {
325340

326341
REGISTER(L, readFileAtRawPtr);
327342
REGISTER(L, readFileAtBuffer);
343+
REGISTER(L, readFileAtToSlice);
344+
REGISTER(L, readFileAtToExistingSlice);
328345

329346
REGISTER(L, writeFileAtRawPtr);
330347
REGISTER(L, writeFileAtBuffer);

0 commit comments

Comments
 (0)