@@ -20,7 +20,7 @@ local C = ffi.load 'SUPPORT_FILE'
20
20
local function validateBuffer (buffer )
21
21
if buffer :maxsize () < buffer .size then
22
22
error (' Invalid or corrupted LuaBuffer: claims size of ' .. buffer .size .. ' but actual size is ' ..
23
- buffer :maxsize ())
23
+ buffer :maxsize ())
24
24
end
25
25
return buffer
26
26
end
@@ -34,13 +34,21 @@ local function read(self, ptr, size)
34
34
return validateBuffer (buf )
35
35
elseif type (ptr ) == ' cdata' and size == nil and ffi .typeof (ptr ) == Support .File ._LuaBuffer then
36
36
return Support .extra .safeFFI (' File::read(C.readFileBuffer)' , C .readFileBuffer , self ._wrapper ,
37
- validateBuffer (ptr ))
37
+ validateBuffer (ptr ))
38
38
elseif type (ptr ) == ' userdata' and size == nil then
39
39
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 ())
40
43
end
41
44
return Support .extra .safeFFI (' File::read(C.readFileRawPtr)' , C .readFileRawPtr , self ._wrapper , ptr , size )
42
45
end
43
46
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
+
44
52
local function readAt (self , ptr , size , pos )
45
53
if type (ptr ) == ' number' and type (size ) == ' number' and pos == nil then
46
54
pos = size
@@ -51,40 +59,48 @@ local function readAt(self, ptr, size, pos)
51
59
return validateBuffer (buf )
52
60
elseif type (ptr ) == ' cdata' and type (size ) == ' number' and pos == nil and ffi .typeof (ptr ) == LuaBuffer then
53
61
return Support .extra .safeFFI (' File::readAt(C.readFileAtBuffer)' , C .readFileAtBuffer , self ._wrapper ,
54
- validateBuffer (ptr ), size )
62
+ validateBuffer (ptr ), size )
55
63
elseif type (ptr ) == ' userdata' and type (size ) == ' number' and pos == nil then
56
64
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 )
57
68
end
58
69
return Support .extra .safeFFI (' File::readAt(C.readFileAtRawPtr)' , C .readFileAtRawPtr , self ._wrapper , ptr , size , pos )
59
70
end
60
71
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
+
61
77
local function write (self , data , size )
62
78
if type (data ) == ' cdata' and size == nil and ffi .typeof (data ) == LuaBuffer then
63
79
return Support .extra .safeFFI (' File::write(C.writeFileBuffer)' , C .writeFileBuffer , self ._wrapper ,
64
- validateBuffer (data ))
80
+ validateBuffer (data ))
65
81
elseif type (data ) == ' userdata' and size == nil then
66
82
return Support ._internal .writeFileUserData (self ._wrapper , data )
67
83
elseif type (size ) == ' number' then
68
84
return Support .extra .safeFFI (' File::write(C.writeFileRawPtr)' , C .writeFileRawPtr , self ._wrapper , data , size )
69
85
end
70
86
if type (data ) ~= ' string' then data = tostring (data ) end
71
87
return Support .extra .safeFFI (' File::write(C.writeFileRawPtr)' , C .writeFileRawPtr , self ._wrapper , data ,
72
- string.len (data ))
88
+ string.len (data ))
73
89
end
74
90
75
91
local function writeAt (self , data , size , pos )
76
92
if type (data ) == ' cdata' and type (size ) == ' number' and pos == nil and ffi .typeof (data ) == LuaBuffer then
77
93
return Support .extra .safeFFI (' File::writeAt(C.writeFileAtBuffer)' , C .writeFileAtBuffer , self ._wrapper ,
78
- validateBuffer (data ), size )
94
+ validateBuffer (data ), size )
79
95
elseif type (data ) == ' userdata' and type (size ) == ' number' and pos == nil then
80
96
return Support ._internal .writeFileAtUserData (self ._wrapper , data , size )
81
97
elseif type (size ) == ' number' and type (pos ) == ' number' then
82
98
return Support .extra .safeFFI (' File::writeAt(C.writeFileAtRawPtr)' , C .writeFileAtRawPtr , self ._wrapper , data ,
83
- size , pos )
99
+ size , pos )
84
100
end
85
101
if type (data ) ~= ' string' then data = tostring (data ) end
86
102
return Support .extra .safeFFI (' File::writeAt(C.writeFileAtRawPtr)' , C .writeFileAtRawPtr , self ._wrapper , data ,
87
- string.len (data ), size )
103
+ string.len (data ), size )
88
104
end
89
105
90
106
local function writeMoveSlice (self , slice ) C .writeFileMoveSlice (self ._wrapper , slice ._wrapper ) end
@@ -172,7 +188,9 @@ local function createFileWrapper(wrapper)
172
188
_type = ' File' ,
173
189
close = function (self ) Support .extra .safeFFI (' File::close' , C .closeFile , self ._wrapper ) end ,
174
190
read = read ,
191
+ readToSlice = readToSlice ,
175
192
readAt = readAt ,
193
+ readAtToSlice = readAtToSlice ,
176
194
gets = function (self ) return Support ._internal .readFileGets (self ._wrapper ) end ,
177
195
write = write ,
178
196
writeAt = writeAt ,
@@ -301,10 +319,10 @@ end
301
319
local function ffmpegAudioFile (file , options )
302
320
if type (options ) ~= ' table' then options = {} end
303
321
local channels , endianness , sampleFormat , frequency = options .channels , options .endianness , options .sampleFormat ,
304
- options .frequency
322
+ options .frequency
305
323
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 ))
308
326
end
309
327
310
328
if (type (Support ) ~= ' table' ) then Support = {} end
0 commit comments