github.com/prattmic/llgo-embedded@v0.0.0-20150820070356-41cfecea0e1e/third_party/gofrontend/libffi/testsuite/libffi.call/strlen4.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, int i)
    12  {
    13    return (size_t) ((int) strlen(s) + (int) a + i);
    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    int v1;
    24    float v2;
    25    args[2] = &ffi_type_sint;
    26    args[1] = &ffi_type_pointer;
    27    args[0] = &ffi_type_float;
    28    values[2] = (void*) &v1;
    29    values[1] = (void*) &s;
    30    values[0] = (void*) &v2;
    31    
    32    /* Initialize the cif */
    33    CHECK(ffi_prep_cif(&cif, ABI_NUM, 3,
    34  		       &ffi_type_sint, args) == FFI_OK);
    35    
    36    s = "a";
    37    v1 = 1;
    38    v2 = 0.0;
    39    ffi_call(&cif, FFI_FN(my_f), &rint, values);
    40    CHECK(rint == 2);
    41    
    42    s = "1234567";
    43    v2 = -1.0;
    44    v1 = -2;
    45    ffi_call(&cif, FFI_FN(my_f), &rint, values);
    46    CHECK(rint == 4);
    47    
    48    s = "1234567890123456789012345";
    49    v2 = 1.0;
    50    v1 = 2;
    51    ffi_call(&cif, FFI_FN(my_f), &rint, values);
    52    CHECK(rint == 28);
    53    
    54    exit(0);
    55  }