1 /* varargs.c - 2 * (Added as part of fix for bug 15306 - "call" to varargs functions fails) 3 * This program is intended to let me try out "call" to varargs functions 4 * with varying numbers of declared args and various argument types. 5 * - RT 9/27/95 6 */ 7 8 #include <stdio.h> 9 #include <stdarg.h> 10 11 int find_max1(int, ...); 12 int find_max2(int, int, ...); 13 double find_max_double(int, double, ...); 14 15 char ch; 16 unsigned char uc; 17 short s; 18 unsigned short us; 19 int a,b,c,d; 20 int max_val; 21 long long ll; 22 float fa,fb,fc,fd; 23 double da,db,dc,dd; 24 double dmax_val; 25 26 #ifdef TEST_COMPLEX 27 extern float crealf (float _Complex); 28 extern double creal (double _Complex); 29 extern long double creall (long double _Complex); 30 31 float _Complex fc1 = 1.0F + 1.0iF; 32 float _Complex fc2 = 2.0F + 2.0iF; 33 float _Complex fc3 = 3.0F + 3.0iF; 34 float _Complex fc4 = 4.0F + 4.0iF; 35 36 double _Complex dc1 = 1.0 + 1.0i; 37 double _Complex dc2 = 2.0 + 2.0i; 38 double _Complex dc3 = 3.0 + 3.0i; 39 double _Complex dc4 = 4.0 + 4.0i; 40 41 long double _Complex ldc1 = 1.0L + 1.0Li; 42 long double _Complex ldc2 = 2.0L + 2.0Li; 43 long double _Complex ldc3 = 3.0L + 3.0Li; 44 long double _Complex ldc4 = 4.0L + 4.0Li; 45 46 #endif 47 48 int main() { 49 c = -1; 50 uc = 1; 51 s = -2; 52 us = 2; 53 a = 1; 54 b = 60; 55 max_val = find_max1(1, 60); 56 max_val = find_max1(a, b); 57 a = 3; 58 b = 1; 59 c = 4; 60 d = 2; 61 max_val = find_max1(3, 1, 4, 2); 62 max_val = find_max2(a, b, c, d); 63 da = 3.0; 64 db = 1.0; 65 dc = 4.0; 66 dd = 2.0; 67 dmax_val = find_max_double(3, 1.0, 4.0, 2.0); 68 dmax_val = find_max_double(a, db, dc, dd); 69 70 return 0; 71 } 72 73 /* Integer varargs, 1 declared arg */ 74 75 int find_max1(int num_vals, ...) { 76 int max_val = 0; 77 int x; 78 int i; 79 va_list argp; 80 va_start(argp, num_vals); 81 printf("find_max(%d,", num_vals); 82 for (i = 0; i < num_vals; i++) { 83 x = va_arg(argp, int); 84 if (max_val < x) max_val = x; 85 if (i < num_vals - 1) 86 printf(" %d,", x); 87 else 88 printf(" %d)", x); 89 } 90 printf(" returns %d\n", max_val); 91 return max_val; 92 } 93 94 /* Integer varargs, 2 declared args */ 95 96 int find_max2(int num_vals, int first_val, ...) { 97 int max_val = 0; 98 int x; 99 int i; 100 va_list argp; 101 va_start(argp, first_val); 102 x = first_val; 103 if (max_val < x) max_val = x; 104 printf("find_max(%d, %d", num_vals, first_val); 105 for (i = 1; i < num_vals; i++) { 106 x = va_arg(argp, int); 107 if (max_val < x) max_val = x; 108 printf(", %d", x); 109 } 110 printf(") returns %d\n", max_val); 111 return max_val; 112 } 113 114 /* Double-float varargs, 2 declared args */ 115 116 double find_max_double(int num_vals, double first_val, ...) { 117 double max_val = 0; 118 double x; 119 int i; 120 va_list argp; 121 va_start(argp, first_val); 122 x = first_val; 123 if (max_val < x) max_val = x; 124 printf("find_max(%d, %f", num_vals, first_val); 125 for (i = 1; i < num_vals; i++) { 126 x = va_arg(argp, double); 127 if (max_val < x) max_val = x; 128 printf(", %f", x); 129 } 130 printf(") returns %f\n", max_val); 131 return max_val; 132 } 133 134 135 #ifdef TEST_COMPLEX 136 float _Complex 137 find_max_float_real (int num_vals, ...) 138 { 139 float _Complex max = 0.0F + 0.0iF; 140 float _Complex x; 141 va_list argp; 142 int i; 143 144 va_start(argp, num_vals); 145 for (i = 0; i < num_vals; i++) 146 { 147 x = va_arg (argp, float _Complex); 148 if (crealf (max) < crealf (x)) max = x; 149 } 150 151 return max; 152 } 153 154 double _Complex 155 find_max_double_real (int num_vals, ...) 156 { 157 double _Complex max = 0.0 + 0.0i; 158 double _Complex x; 159 va_list argp; 160 int i; 161 162 va_start(argp, num_vals); 163 for (i = 0; i < num_vals; i++) 164 { 165 x = va_arg (argp, double _Complex); 166 if (creal (max) < creal (x)) max = x; 167 } 168 169 return max; 170 } 171 172 long double _Complex 173 find_max_long_double_real (int num_vals, ...) 174 { 175 long double _Complex max = 0.0L + 0.0iL; 176 long double _Complex x; 177 va_list argp; 178 int i; 179 180 va_start(argp, num_vals); 181 for (i = 0; i < num_vals; i++) 182 { 183 x = va_arg (argp, long double _Complex); 184 if (creall (max) < creal (x)) max = x; 185 } 186 187 return max; 188 } 189 190 191 #endif /* TEST_COMPLEX */ 192