| /* -*-c-*- */ | |
| #include "ffitest.h" | |
| #include <complex.h> | |
| static _Complex T_C_TYPE return_c(_Complex T_C_TYPE c) | |
| { | |
| printf ("%f,%fi\n", T_CONV creal (c), T_CONV cimag (c)); | |
| return 2 * c; | |
| } | |
| int main (void) | |
| { | |
| ffi_cif cif; | |
| ffi_type *args[MAX_ARGS]; | |
| void *values[MAX_ARGS]; | |
| _Complex T_C_TYPE c, rc, rc2; | |
| T_C_TYPE cr, ci; | |
| args[0] = &T_FFI_TYPE; | |
| values[0] = &c; | |
| /* Initialize the cif */ | |
| CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, | |
| &T_FFI_TYPE, args) == FFI_OK); | |
| for (cr = -127.0; cr < 127; cr++) | |
| { | |
| ci = 1000.0 - cr; | |
| c = cr + ci * I; | |
| ffi_call(&cif, FFI_FN(return_c), &rc, values); | |
| rc2 = return_c(c); | |
| printf ("%f,%fi vs %f,%fi\n", | |
| T_CONV creal (rc), T_CONV cimag (rc), | |
| T_CONV creal (rc2), T_CONV cimag (rc2)); | |
| CHECK(rc == 2 * c); | |
| } | |
| exit(0); | |
| } |