1*1fd5a2e1SPrashanth Swaminathan/* -*-c-*-*/ 2*1fd5a2e1SPrashanth Swaminathan#include "ffitest.h" 3*1fd5a2e1SPrashanth Swaminathan#include <complex.h> 4*1fd5a2e1SPrashanth Swaminathan 5*1fd5a2e1SPrashanth Swaminathanstatic _Complex T_C_TYPE f_complex(_Complex T_C_TYPE c, int x, int *py) 6*1fd5a2e1SPrashanth Swaminathan{ 7*1fd5a2e1SPrashanth Swaminathan c = -(2 * creal (c)) + (cimag (c) + 1)* I; 8*1fd5a2e1SPrashanth Swaminathan *py += x; 9*1fd5a2e1SPrashanth Swaminathan 10*1fd5a2e1SPrashanth Swaminathan return c; 11*1fd5a2e1SPrashanth Swaminathan} 12*1fd5a2e1SPrashanth Swaminathan 13*1fd5a2e1SPrashanth Swaminathanint main (void) 14*1fd5a2e1SPrashanth Swaminathan{ 15*1fd5a2e1SPrashanth Swaminathan ffi_cif cif; 16*1fd5a2e1SPrashanth Swaminathan ffi_type *args[MAX_ARGS]; 17*1fd5a2e1SPrashanth Swaminathan void *values[MAX_ARGS]; 18*1fd5a2e1SPrashanth Swaminathan 19*1fd5a2e1SPrashanth Swaminathan _Complex T_C_TYPE tc_arg; 20*1fd5a2e1SPrashanth Swaminathan _Complex T_C_TYPE tc_result; 21*1fd5a2e1SPrashanth Swaminathan int tc_int_arg_x; 22*1fd5a2e1SPrashanth Swaminathan int tc_y; 23*1fd5a2e1SPrashanth Swaminathan int *tc_ptr_arg_y = &tc_y; 24*1fd5a2e1SPrashanth Swaminathan 25*1fd5a2e1SPrashanth Swaminathan args[0] = &T_FFI_TYPE; 26*1fd5a2e1SPrashanth Swaminathan args[1] = &ffi_type_sint; 27*1fd5a2e1SPrashanth Swaminathan args[2] = &ffi_type_pointer; 28*1fd5a2e1SPrashanth Swaminathan values[0] = &tc_arg; 29*1fd5a2e1SPrashanth Swaminathan values[1] = &tc_int_arg_x; 30*1fd5a2e1SPrashanth Swaminathan values[2] = &tc_ptr_arg_y; 31*1fd5a2e1SPrashanth Swaminathan 32*1fd5a2e1SPrashanth Swaminathan /* Initialize the cif */ 33*1fd5a2e1SPrashanth Swaminathan CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, 34*1fd5a2e1SPrashanth Swaminathan &T_FFI_TYPE, args) == FFI_OK); 35*1fd5a2e1SPrashanth Swaminathan 36*1fd5a2e1SPrashanth Swaminathan tc_arg = 1 + 7 * I; 37*1fd5a2e1SPrashanth Swaminathan tc_int_arg_x = 1234; 38*1fd5a2e1SPrashanth Swaminathan tc_y = 9876; 39*1fd5a2e1SPrashanth Swaminathan ffi_call(&cif, FFI_FN(f_complex), &tc_result, values); 40*1fd5a2e1SPrashanth Swaminathan 41*1fd5a2e1SPrashanth Swaminathan printf ("%f,%fi %f,%fi, x %d 1234, y %d 11110\n", 42*1fd5a2e1SPrashanth Swaminathan T_CONV creal (tc_result), T_CONV cimag (tc_result), 43*1fd5a2e1SPrashanth Swaminathan T_CONV creal (2.0), T_CONV creal (8.0), tc_int_arg_x, tc_y); 44*1fd5a2e1SPrashanth Swaminathan 45*1fd5a2e1SPrashanth Swaminathan CHECK (creal (tc_result) == -2); 46*1fd5a2e1SPrashanth Swaminathan CHECK (cimag (tc_result) == 8); 47*1fd5a2e1SPrashanth Swaminathan CHECK (tc_int_arg_x == 1234); 48*1fd5a2e1SPrashanth Swaminathan CHECK (*tc_ptr_arg_y == 11110); 49*1fd5a2e1SPrashanth Swaminathan 50*1fd5a2e1SPrashanth Swaminathan exit(0); 51*1fd5a2e1SPrashanth Swaminathan} 52