#include #include int print9float(const char *fmt, float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9) { return printf(fmt, f1, f2, f3, f4, f5, f6, f7, f8, f9); } void test_float() { size_t i; ffi_cif cif; ffi_type *arg_types[10]; void *arg_values[10]; char *fmt = "[%f,%f,%f,%f,%f,%f,%f,%f,%f]\n"; float floatargs[9] = {1.1f,2.2f,3.3f,4.4f,5.5f,6.6f,7.7f,8.8f,9.9f}; ffi_status status; int result; arg_types[0] = &ffi_type_pointer; for(i=1 ; i<10 ; i++) { arg_types[i] = &ffi_type_float; } if((status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 10, &ffi_type_sint, arg_types)) != FFI_OK) { fprintf(stderr, "ffi_prep_cif_var() failed!\n"); return; } arg_values[0] = &fmt; for(i=1 ; i<10 ; i++) { arg_values[i] = &floatargs[i-1]; } printf("Non-variadic call:\n"); ffi_call(&cif, FFI_FN(print9float), &result, arg_values); printf("result is %i\n", result); } void test_varfloat() { size_t i; ffi_cif cif; ffi_type *arg_types[10]; void *arg_values[10]; char *fmt = "[%f,%f,%f,%f,%f,%f,%f,%f,%f]\n"; float floatargs[9] = {1.1f,2.2f,3.3f,4.4f,5.5f,6.6f,7.7f,8.8f,9.9f}; ffi_status status; int result; arg_types[0] = &ffi_type_pointer; for(i=1 ; i<10 ; i++) { arg_types[i] = &ffi_type_float; } if((status = ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 10, &ffi_type_sint, arg_types)) != FFI_OK) { fprintf(stderr, "ffi_prep_cif_var() failed!\n"); return; } arg_values[0] = &fmt; for(i=1 ; i<10 ; i++) { arg_values[i] = &floatargs[i-1]; } printf("Variadic call:\n"); ffi_call(&cif, FFI_FN(printf), &result, arg_values); printf("result is %i\n", result); } int main() { test_float(); test_varfloat(); return 0; }