:- use_module(library(os)).
:- use_module(library(ffi)).

test :- 
    read(Body),
    term_variables(Body, [LIB]),
    Body,   
    use_foreign_module(LIB, [
        'ffi_return_values_true'([], bool), 
        'ffi_return_values_false'([], bool), 
        'ffi_return_values_i8'([], sint8),
        'ffi_return_values_u8'([], uint8),
        'ffi_return_values_i16'([], sint16),
        'ffi_return_values_u16'([], uint16),
        'ffi_return_values_i32'([], sint32),
        'ffi_return_values_u32'([], uint32),
        'ffi_return_values_i64'([], sint64),
        'ffi_return_values_u64'([], uint64),
        'ffi_return_values_f32'([], f32),
        'ffi_return_values_f64'([], f64)
    ]),
    ffi:'ffi_return_values_true',
    (\+ ffi:'ffi_return_values_false'),
    ffi:'ffi_return_values_i8'(I8),
    ffi:'ffi_return_values_u8'(U8),
    ffi:'ffi_return_values_i16'(I16),
    ffi:'ffi_return_values_u16'(U16),
    ffi:'ffi_return_values_i32'(I32),
    ffi:'ffi_return_values_u32'(U32),
    ffi:'ffi_return_values_i64'(I64),
    ffi:'ffi_return_values_u64'(U64),
    ffi:'ffi_return_values_f32'(F32),
    ffi:'ffi_return_values_f64'(F64),
    write((i8-I8, u8-U8, i16-I16, u16-U16, i32-I32, u32-U32, i64-I64, u64-U64, f32-F32, f64-F64)).

:- initialization(test).
