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