github.com/Konstantin8105/c4go@v0.0.0-20240505174241-768bb1c65a51/tests/ap.c (about)

     1  #include "tests.h"
     2  #include <stdio.h>
     3  
     4  // input argument - C-pointer
     5  void a(int* v1) { printf("a: %d\n", *v1); }
     6  
     7  // input argument - C-array
     8  void b(int v1[], int size)
     9  {
    10      for (size--; size >= 0; size--) {
    11          printf("b: %d %d\n", size, v1[size]);
    12      }
    13  }
    14  
    15  long get()
    16  {
    17      return (long)(0);
    18  }
    19  
    20  long negative()
    21  {
    22      return (long)(-1);
    23  }
    24  
    25  double global;
    26  
    27  double* get_value()
    28  {
    29      return &global;
    30  }
    31  
    32  int main()
    33  {
    34      plan(4);
    35  
    36      diag("value");
    37      int i1 = 42;
    38      a(&i1);
    39      b(&i1, 1);
    40  
    41      diag("C-array");
    42      int i2[] = { 11, 22 };
    43      a(i2);
    44      b(i2, 2);
    45  
    46      diag("C-pointer from value");
    47      int* i3 = &i1;
    48      a(i3);
    49      b(i3, 1);
    50  
    51      diag("C-pointer from array");
    52      int* i4 = i2;
    53      a(i4);
    54      b(i4, 2);
    55  
    56      diag("C-pointer from array");
    57      int* i5 = &i2[1];
    58      a(i5);
    59      b(i5, 1);
    60  
    61      diag("pointer arithmetic 1");
    62      i5 = &i2[0];
    63      int* i6 = i5 + 1;
    64      a(i6);
    65      b(i6, 1);
    66  
    67      diag("pointer arithmetic 2");
    68      int val = 2 - 2;
    69      int* i7 = 1 + (1 - 1) + val + 0 * (100 - 2) + i5 + 0 - 0 * 0;
    70      a(i7);
    71      b(i7, 1);
    72  
    73      diag("pointer arithmetic 3");
    74      int* i8 = i5 + 1 + 0;
    75      a(i8);
    76      b(i8, 1);
    77  
    78      diag("pointer arithmetic 4");
    79      int i9[] = { *i3, *(i3 + 1) };
    80      a(i9);
    81      b(i9, 1);
    82  
    83      diag("pointer arithmetic 5");
    84      int* i10 = 1 + 0 + i5 + 5 * get() + get() + (12 + 3) * get();
    85      a(i10);
    86      b(i10, 1);
    87  
    88      diag("pointer arithmetic 6");
    89      int* i11 = 1 + 0 + i5 + 5 * get() + get() - (12 + 3) * get();
    90      a(i11);
    91      b(i11, 1);
    92  
    93      diag("pointer from function");
    94      global = 42;
    95      double* i12 = get_value();
    96      is_eq(*i12, global);
    97  
    98      diag("pointer for some type");
    99      typedef int NUMBER;
   100      typedef int* POINTER;
   101      NUMBER num;
   102      POINTER pnt;
   103      int num_value = 56;
   104      num = num_value;
   105      pnt = &num;
   106      is_eq(*pnt, num_value);
   107      *pnt = 123;
   108      is_eq(*pnt, 123);
   109      is_eq(num, 123);
   110  
   111      // TODO: test for negative index
   112      //   diag("pointer arithmetic 7");
   113      //   int* tmp_i2 = i2 + 1;
   114      //   int* i13 = tmp_i2 + negative();
   115      //   a(i13);
   116      //   b(i13, 1);
   117  
   118      done_testing();
   119  }