]>
git.proxmox.com Git - rustc.git/blob - src/test/run-pass/variadic-ffi.rs
1 // Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 // ignore-msvc -- sprintf isn't a symbol in msvcrt? maybe a #define?
13 #![feature(libc, std_misc)]
17 use std
::ffi
::{CStr, CString}
;
18 use libc
::{c_char, c_int}
;
22 fn sprintf(s
: *mut c_char
, format
: *const c_char
, ...) -> c_int
;
25 unsafe fn check
<T
, F
>(expected
: &str, f
: F
) where F
: FnOnce(*mut c_char
) -> T
{
26 let mut x
= [0 as c_char
; 50];
27 f(&mut x
[0] as *mut c_char
);
28 assert_eq
!(expected
.as_bytes(), CStr
::from_ptr(x
.as_ptr()).to_bytes());
34 // Call with just the named parameter
35 let c
= CString
::new(&b
"Hello World\n"[..]).unwrap();
36 check("Hello World\n", |s
| sprintf(s
, c
.as_ptr()));
38 // Call with variable number of arguments
39 let c
= CString
::new(&b
"%d %f %c %s\n"[..]).unwrap();
40 check("42 42.500000 a %d %f %c %s\n\n", |s
| {
41 sprintf(s
, c
.as_ptr(), 42, 42.5f64, 'a'
as c_int
, c
.as_ptr());
44 // Make a function pointer
45 let x
: unsafe extern fn(*mut c_char
, *const c_char
, ...) -> c_int
= sprintf
;
47 // A function that takes a function pointer
48 unsafe fn call(fp
: unsafe extern fn(*mut c_char
, *const c_char
, ...) -> c_int
) {
49 // Call with just the named parameter
50 let c
= CString
::new(&b
"Hello World\n"[..]).unwrap();
51 check("Hello World\n", |s
| fp(s
, c
.as_ptr()));
53 // Call with variable number of arguments
54 let c
= CString
::new(&b
"%d %f %c %s\n"[..]).unwrap();
55 check("42 42.500000 a %d %f %c %s\n\n", |s
| {
56 fp(s
, c
.as_ptr(), 42, 42.5f64, 'a'
as c_int
, c
.as_ptr());
60 // Pass sprintf directly
63 // Pass sprintf indirectly