1*1fd5a2e1SPrashanth Swaminathan/* -*-c-*- */ 2*1fd5a2e1SPrashanth Swaminathan#include "ffitest.h" 3*1fd5a2e1SPrashanth Swaminathan#include <complex.h> 4*1fd5a2e1SPrashanth Swaminathan 5*1fd5a2e1SPrashanth Swaminathanstatic void cls_ret_complex_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, 6*1fd5a2e1SPrashanth Swaminathan void* userdata __UNUSED__) 7*1fd5a2e1SPrashanth Swaminathan { 8*1fd5a2e1SPrashanth Swaminathan _Complex T_C_TYPE *pa; 9*1fd5a2e1SPrashanth Swaminathan _Complex T_C_TYPE *pr; 10*1fd5a2e1SPrashanth Swaminathan pa = (_Complex T_C_TYPE *)args[0]; 11*1fd5a2e1SPrashanth Swaminathan pr = (_Complex T_C_TYPE *)resp; 12*1fd5a2e1SPrashanth Swaminathan *pr = *pa; 13*1fd5a2e1SPrashanth Swaminathan 14*1fd5a2e1SPrashanth Swaminathan printf("%.6f,%.6fi: %.6f,%.6fi\n", 15*1fd5a2e1SPrashanth Swaminathan T_CONV creal (*pa), T_CONV cimag (*pa), 16*1fd5a2e1SPrashanth Swaminathan T_CONV creal (*pr), T_CONV cimag (*pr)); 17*1fd5a2e1SPrashanth Swaminathan } 18*1fd5a2e1SPrashanth Swaminathantypedef _Complex T_C_TYPE (*cls_ret_complex)(_Complex T_C_TYPE); 19*1fd5a2e1SPrashanth Swaminathan 20*1fd5a2e1SPrashanth Swaminathanint main (void) 21*1fd5a2e1SPrashanth Swaminathan{ 22*1fd5a2e1SPrashanth Swaminathan ffi_cif cif; 23*1fd5a2e1SPrashanth Swaminathan void *code; 24*1fd5a2e1SPrashanth Swaminathan ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); 25*1fd5a2e1SPrashanth Swaminathan ffi_type * cl_arg_types[2]; 26*1fd5a2e1SPrashanth Swaminathan _Complex T_C_TYPE res; 27*1fd5a2e1SPrashanth Swaminathan 28*1fd5a2e1SPrashanth Swaminathan cl_arg_types[0] = &T_FFI_TYPE; 29*1fd5a2e1SPrashanth Swaminathan cl_arg_types[1] = NULL; 30*1fd5a2e1SPrashanth Swaminathan 31*1fd5a2e1SPrashanth Swaminathan /* Initialize the cif */ 32*1fd5a2e1SPrashanth Swaminathan CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, 33*1fd5a2e1SPrashanth Swaminathan &T_FFI_TYPE, cl_arg_types) == FFI_OK); 34*1fd5a2e1SPrashanth Swaminathan 35*1fd5a2e1SPrashanth Swaminathan CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_complex_fn, NULL, code) == FFI_OK); 36*1fd5a2e1SPrashanth Swaminathan 37*1fd5a2e1SPrashanth Swaminathan res = (*((cls_ret_complex)code))(0.125 + 128.0 * I); 38*1fd5a2e1SPrashanth Swaminathan printf("res: %.6f,%.6fi\n", T_CONV creal (res), T_CONV cimag (res)); 39*1fd5a2e1SPrashanth Swaminathan CHECK (res == (0.125 + 128.0 * I)); 40*1fd5a2e1SPrashanth Swaminathan 41*1fd5a2e1SPrashanth Swaminathan exit(0); 42*1fd5a2e1SPrashanth Swaminathan} 43