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 }