19
19
//!
20
20
//! let mut file = std::fs::File::open("../mp4parse/tests/minimal.mp4").unwrap();
21
21
//! let io = mp4parse_capi::mp4parse_io {
22
- //! read: buf_read,
22
+ //! read: Some( buf_read) ,
23
23
//! userdata: &mut file as *mut _ as *mut std::os::raw::c_void
24
24
//! };
25
25
//! unsafe {
@@ -261,7 +261,7 @@ impl mp4parse_parser {
261
261
#[ repr( C ) ]
262
262
#[ derive( Clone ) ]
263
263
pub struct mp4parse_io {
264
- pub read : extern fn ( buffer : * mut u8 , size : usize , userdata : * mut std:: os:: raw:: c_void ) -> isize ,
264
+ pub read : Option < extern fn ( buffer : * mut u8 , size : usize , userdata : * mut std:: os:: raw:: c_void ) -> isize > ,
265
265
pub userdata : * mut std:: os:: raw:: c_void ,
266
266
}
267
267
@@ -270,7 +270,7 @@ impl Read for mp4parse_io {
270
270
if buf. len ( ) > isize:: max_value ( ) as usize {
271
271
return Err ( std:: io:: Error :: new ( std:: io:: ErrorKind :: Other , "buf length overflow in mp4parse_io Read impl" ) ) ;
272
272
}
273
- let rv = ( self . read ) ( buf. as_mut_ptr ( ) , buf. len ( ) , self . userdata ) ;
273
+ let rv = self . read . unwrap ( ) ( buf. as_mut_ptr ( ) , buf. len ( ) , self . userdata ) ;
274
274
if rv >= 0 {
275
275
Ok ( rv as usize )
276
276
} else {
@@ -287,12 +287,7 @@ pub unsafe extern fn mp4parse_new(io: *const mp4parse_io) -> *mut mp4parse_parse
287
287
if io. is_null ( ) || ( * io) . userdata . is_null ( ) {
288
288
return std:: ptr:: null_mut ( ) ;
289
289
}
290
- // is_null() isn't available on a fn type because it can't be null (in
291
- // Rust) by definition. But since this value is coming from the C API,
292
- // it *could* be null. Ideally, we'd wrap it in an Option to represent
293
- // reality, but this causes rusty-cheddar to emit the wrong type
294
- // (https://github.com/Sean1708/rusty-cheddar/issues/30).
295
- if ( ( * io) . read as * mut std:: os:: raw:: c_void ) . is_null ( ) {
290
+ if ( * io) . read . is_none ( ) {
296
291
return std:: ptr:: null_mut ( ) ;
297
292
}
298
293
let parser = Box :: new ( mp4parse_parser ( Wrap {
@@ -1156,7 +1151,7 @@ extern fn valid_read(buf: *mut u8, size: usize, userdata: *mut std::os::raw::c_v
1156
1151
fn new_parser ( ) {
1157
1152
let mut dummy_value: u32 = 42 ;
1158
1153
let io = mp4parse_io {
1159
- read : panic_read,
1154
+ read : Some ( panic_read) ,
1160
1155
userdata : & mut dummy_value as * mut _ as * mut std:: os:: raw:: c_void ,
1161
1156
} ;
1162
1157
unsafe {
@@ -1195,19 +1190,19 @@ fn arg_validation() {
1195
1190
let null_mut: * mut std:: os:: raw:: c_void = std:: ptr:: null_mut ( ) ;
1196
1191
1197
1192
// Passing an mp4parse_io with null members is an error.
1198
- let io = mp4parse_io { read : std :: mem :: transmute ( null_mut ) ,
1193
+ let io = mp4parse_io { read : None ,
1199
1194
userdata : null_mut } ;
1200
1195
let parser = mp4parse_new ( & io) ;
1201
1196
assert ! ( parser. is_null( ) ) ;
1202
1197
1203
- let io = mp4parse_io { read : panic_read,
1198
+ let io = mp4parse_io { read : Some ( panic_read) ,
1204
1199
userdata : null_mut } ;
1205
1200
let parser = mp4parse_new ( & io) ;
1206
1201
assert ! ( parser. is_null( ) ) ;
1207
1202
1208
1203
let mut dummy_value = 42 ;
1209
1204
let io = mp4parse_io {
1210
- read : std :: mem :: transmute ( null_mut ) ,
1205
+ read : None ,
1211
1206
userdata : & mut dummy_value as * mut _ as * mut std:: os:: raw:: c_void ,
1212
1207
} ;
1213
1208
let parser = mp4parse_new ( & io) ;
@@ -1246,7 +1241,7 @@ fn arg_validation_with_parser() {
1246
1241
unsafe {
1247
1242
let mut dummy_value = 42 ;
1248
1243
let io = mp4parse_io {
1249
- read : error_read,
1244
+ read : Some ( error_read) ,
1250
1245
userdata : & mut dummy_value as * mut _ as * mut std:: os:: raw:: c_void ,
1251
1246
} ;
1252
1247
let parser = mp4parse_new ( & io) ;
@@ -1295,7 +1290,7 @@ fn get_track_count_poisoned_parser() {
1295
1290
unsafe {
1296
1291
let mut dummy_value = 42 ;
1297
1292
let io = mp4parse_io {
1298
- read : error_read,
1293
+ read : Some ( error_read) ,
1299
1294
userdata : & mut dummy_value as * mut _ as * mut std:: os:: raw:: c_void ,
1300
1295
} ;
1301
1296
let parser = mp4parse_new ( & io) ;
@@ -1314,7 +1309,7 @@ fn get_track_count_poisoned_parser() {
1314
1309
fn arg_validation_with_data ( ) {
1315
1310
unsafe {
1316
1311
let mut file = std:: fs:: File :: open ( "../mp4parse/tests/minimal.mp4" ) . unwrap ( ) ;
1317
- let io = mp4parse_io { read : valid_read,
1312
+ let io = mp4parse_io { read : Some ( valid_read) ,
1318
1313
userdata : & mut file as * mut _ as * mut std:: os:: raw:: c_void } ;
1319
1314
let parser = mp4parse_new ( & io) ;
1320
1315
assert ! ( !parser. is_null( ) ) ;
0 commit comments