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

     1  /* Area:	ffi_call
     2     Purpose:	Check strlen function call with additional arguments.
     3     Limitations:	none.
     4     PR:		none.
     5     Originator:	From the original ffitest.c  */
     6  
     7  /* { dg-do run } */
     8  
     9  #include "ffitest.h"
    10  
    11  static size_t ABI_ATTR my_f(float a, char *s)
    12  {
    13    return (size_t) ((int) strlen(s) + (int) a);
    14  }
    15  
    16  int main (void)
    17  {
    18    ffi_cif cif;
    19    ffi_type *args[MAX_ARGS];
    20    void *values[MAX_ARGS];
    21    ffi_arg rint;
    22    char *s;
    23    float v2;
    24    args[1] = &ffi_type_pointer;
    25    args[0] = &ffi_type_float;
    26    values[1] = (void*) &s;
    27    values[0] = (void*) &v2;
    28    
    29    /* Initialize the cif */
    30    CHECK(ffi_prep_cif(&cif, ABI_NUM, 2,
    31  		       &ffi_type_sint, args) == FFI_OK);
    32    
    33    s = "a";
    34    v2 = 0.0;
    35    ffi_call(&cif, FFI_FN(my_f), &rint, values);
    36    CHECK(rint == 1);
    37    
    38    s = "1234567";
    39    v2 = -1.0;
    40    ffi_call(&cif, FFI_FN(my_f), &rint, values);
    41    CHECK(rint == 6);
    42    
    43    s = "1234567890123456789012345";
    44    v2 = 1.0;
    45    ffi_call(&cif, FFI_FN(my_f), &rint, values);
    46    CHECK(rint == 26);
    47    
    48    exit(0);
    49  }