@@ -20,7 +20,7 @@ local C = ffi.load 'SUPPORT_FILE'
2020local 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
2626end
@@ -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 )
4245end
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+
4452local 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 )
5970end
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+
6177local 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 ))
7389end
7490
7591local 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 )
88104end
89105
90106local 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
301319local 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 ))
308326end
309327
310328if (type (Support ) ~= ' table' ) then Support = {} end
0 commit comments