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