github.com/prattmic/llgo-embedded@v0.0.0-20150820070356-41cfecea0e1e/third_party/gofrontend/libffi/testsuite/libffi.complex/complex.inc (about)

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