kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

stdarg_runtime.c (1168B)


      1 #include <stdarg.h>
      2 
      3 static int sum_ints_twice(int n, ...) {
      4   va_list ap;
      5   va_list copy;
      6   va_start(ap, n);
      7   va_copy(copy, ap);
      8 
      9   int local = 0;
     10   for (int i = 0; i < n; ++i) local += va_arg(ap, int);
     11 
     12   int copied = 0;
     13   for (int i = 0; i < n; ++i) copied += va_arg(copy, int);
     14 
     15   va_end(copy);
     16   va_end(ap);
     17   return local + copied;
     18 }
     19 
     20 static long sum_longs(int n, ...) {
     21   va_list ap;
     22   va_start(ap, n);
     23   long total = 0;
     24   for (int i = 0; i < n; ++i) total += va_arg(ap, long);
     25   va_end(ap);
     26   return total;
     27 }
     28 
     29 static int sum_ptrs(int n, ...) {
     30   va_list ap;
     31   va_start(ap, n);
     32   int total = 0;
     33   for (int i = 0; i < n; ++i) total += *va_arg(ap, int*);
     34   va_end(ap);
     35   return total;
     36 }
     37 
     38 static int sum_doubles(int n, ...) {
     39   va_list ap;
     40   va_start(ap, n);
     41   double total = 0.0;
     42   for (int i = 0; i < n; ++i) total += va_arg(ap, double);
     43   va_end(ap);
     44   return (int)total;
     45 }
     46 
     47 int test_main(void) {
     48   int a = 10;
     49   int b = 20;
     50   int c = 12;
     51 
     52   if (sum_ints_twice(3, 5, 7, 9) != 42) return 1;
     53   if (sum_longs(3, 10L, 20L, 12L) != 42L) return 2;
     54   if (sum_ptrs(3, &a, &b, &c) != 42) return 3;
     55   if (sum_doubles(3, 10.0, 20.0, 12.0) != 42) return 4;
     56   return 42;
     57 }