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

     1  #include "tests.h"
     2  #include <assert.h>
     3  #include <stdarg.h>
     4  #include <stdio.h>
     5  
     6  #define START_TEST(t) \
     7      diag(#t);         \
     8      test_##t();
     9  
    10  void simple(const char* fmt, ...)
    11  {
    12      char buffer[155];
    13      for (int i = 0; i < 155; i++) {
    14          buffer[i] = 0;
    15      }
    16      is_streq(buffer, "");
    17  
    18      va_list args;
    19      va_start(args, fmt);
    20  
    21      char temp[100];
    22      for (int i = 0; i < 100; i++) {
    23          temp[i] = 0;
    24      }
    25  
    26      int len = 4;
    27      for (int i = 0; i < len; i++) {
    28          char f = fmt[i];
    29          if (f == 'd') {
    30              int i = va_arg(args, int);
    31              sprintf(temp, "%d ", i);
    32              strcat(buffer, temp);
    33              is_streq(buffer, "3 ")
    34          } else if (f == 'c') {
    35              // note automatic conversion to integral type
    36              int c = va_arg(args, int);
    37              sprintf(temp, "%c ", c);
    38              strcat(buffer, temp);
    39              is_streq(buffer, "3 a ")
    40          } else if (f == 'f') {
    41              double d = va_arg(args, double);
    42              sprintf(temp, "%.3f ", d);
    43              strcat(buffer, temp);
    44          }
    45      }
    46  
    47      va_end(args);
    48  
    49      is_streq(buffer, "3 a 1.999 42.500 ")
    50  }
    51  
    52  void test_va_list()
    53  {
    54      simple("dcff", 3, 'a', 1.999, 42.5);
    55  }
    56  
    57  int sum(int num_args, ...)
    58  {
    59      int val = 0;
    60      va_list ap;
    61      int i;
    62  
    63      va_start(ap, num_args);
    64      for (i = 0; i < num_args; i++) {
    65          val += va_arg(ap, int);
    66      }
    67      va_end(ap);
    68  
    69      return val;
    70  }
    71  
    72  void test_va_list2()
    73  {
    74      is_eq(sum(3, 10, 20, 30), 60);
    75  }
    76  
    77  int strange(int num_args, ...)
    78  {
    79      int val = 0;
    80      va_list ap;
    81      int i;
    82  
    83      va_start(ap, num_args);
    84      for (i = 0; i < num_args; i++) {
    85          *va_arg(ap, int*) += 2;
    86      }
    87      va_end(ap);
    88  
    89      va_start(ap, num_args);
    90      for (i = 0; i < num_args; i++) {
    91          val += *va_arg(ap, int*);
    92      }
    93      va_end(ap);
    94  
    95      return val;
    96  }
    97  
    98  void test_va_list3()
    99  {
   100      int v1 = 10;
   101      int v2 = 23;
   102      is_eq(strange(2, &v1, &v2), 10 + 2 + 23 + 2);
   103  }
   104  
   105  void out(int num_args, va_list ap)
   106  {
   107      for (int i = 0; i < num_args; i++) {
   108          int Y = va_arg(ap, int);
   109          printf("%d -> %d\n", i, Y);
   110      }
   111  }
   112  
   113  void red(int num_args, ...)
   114  {
   115      va_list ap;
   116      // base test
   117      va_start(ap, num_args);
   118      out(num_args, ap);
   119      va_end(ap);
   120      // repeat test
   121      va_start(ap, num_args);
   122      out(num_args, ap);
   123      va_end(ap);
   124  }
   125  
   126  void test_va_list4()
   127  {
   128      red(3, 12, 23, 34);
   129  }
   130  
   131  int main()
   132  {
   133      plan(6);
   134  
   135      START_TEST(va_list)
   136      START_TEST(va_list2)
   137      START_TEST(va_list3)
   138      START_TEST(va_list4)
   139  
   140      done_testing();
   141  }