1*b725ae77Skettenis /* varargs.c -
2*b725ae77Skettenis * (Added as part of fix for bug 15306 - "call" to varargs functions fails)
3*b725ae77Skettenis * This program is intended to let me try out "call" to varargs functions
4*b725ae77Skettenis * with varying numbers of declared args and various argument types.
5*b725ae77Skettenis * - RT 9/27/95
6*b725ae77Skettenis */
7*b725ae77Skettenis
8*b725ae77Skettenis #include <stdio.h>
9*b725ae77Skettenis #include <stdarg.h>
10*b725ae77Skettenis
11*b725ae77Skettenis int find_max1(int, ...);
12*b725ae77Skettenis int find_max2(int, int, ...);
13*b725ae77Skettenis double find_max_double(int, double, ...);
14*b725ae77Skettenis
15*b725ae77Skettenis char ch;
16*b725ae77Skettenis unsigned char uc;
17*b725ae77Skettenis short s;
18*b725ae77Skettenis unsigned short us;
19*b725ae77Skettenis int a,b,c,d;
20*b725ae77Skettenis int max_val;
21*b725ae77Skettenis long long ll;
22*b725ae77Skettenis float fa,fb,fc,fd;
23*b725ae77Skettenis double da,db,dc,dd;
24*b725ae77Skettenis double dmax_val;
25*b725ae77Skettenis
main()26*b725ae77Skettenis int main() {
27*b725ae77Skettenis c = -1;
28*b725ae77Skettenis uc = 1;
29*b725ae77Skettenis s = -2;
30*b725ae77Skettenis us = 2;
31*b725ae77Skettenis a = 1;
32*b725ae77Skettenis b = 60;
33*b725ae77Skettenis max_val = find_max1(1, 60);
34*b725ae77Skettenis max_val = find_max1(a, b);
35*b725ae77Skettenis a = 3;
36*b725ae77Skettenis b = 1;
37*b725ae77Skettenis c = 4;
38*b725ae77Skettenis d = 2;
39*b725ae77Skettenis max_val = find_max1(3, 1, 4, 2);
40*b725ae77Skettenis max_val = find_max2(a, b, c, d);
41*b725ae77Skettenis da = 3.0;
42*b725ae77Skettenis db = 1.0;
43*b725ae77Skettenis dc = 4.0;
44*b725ae77Skettenis dd = 2.0;
45*b725ae77Skettenis dmax_val = find_max_double(3, 1.0, 4.0, 2.0);
46*b725ae77Skettenis dmax_val = find_max_double(a, db, dc, dd);
47*b725ae77Skettenis
48*b725ae77Skettenis return 0;
49*b725ae77Skettenis }
50*b725ae77Skettenis
51*b725ae77Skettenis /* Integer varargs, 1 declared arg */
52*b725ae77Skettenis
find_max1(int num_vals,...)53*b725ae77Skettenis int find_max1(int num_vals, ...) {
54*b725ae77Skettenis int max_val = 0;
55*b725ae77Skettenis int x;
56*b725ae77Skettenis int i;
57*b725ae77Skettenis va_list argp;
58*b725ae77Skettenis va_start(argp, num_vals);
59*b725ae77Skettenis printf("find_max(%d,", num_vals);
60*b725ae77Skettenis for (i = 0; i < num_vals; i++) {
61*b725ae77Skettenis x = va_arg(argp, int);
62*b725ae77Skettenis if (max_val < x) max_val = x;
63*b725ae77Skettenis if (i < num_vals - 1)
64*b725ae77Skettenis printf(" %d,", x);
65*b725ae77Skettenis else
66*b725ae77Skettenis printf(" %d)", x);
67*b725ae77Skettenis }
68*b725ae77Skettenis printf(" returns %d\n", max_val);
69*b725ae77Skettenis return max_val;
70*b725ae77Skettenis }
71*b725ae77Skettenis
72*b725ae77Skettenis /* Integer varargs, 2 declared args */
73*b725ae77Skettenis
find_max2(int num_vals,int first_val,...)74*b725ae77Skettenis int find_max2(int num_vals, int first_val, ...) {
75*b725ae77Skettenis int max_val = 0;
76*b725ae77Skettenis int x;
77*b725ae77Skettenis int i;
78*b725ae77Skettenis va_list argp;
79*b725ae77Skettenis va_start(argp, first_val);
80*b725ae77Skettenis x = first_val;
81*b725ae77Skettenis if (max_val < x) max_val = x;
82*b725ae77Skettenis printf("find_max(%d, %d", num_vals, first_val);
83*b725ae77Skettenis for (i = 1; i < num_vals; i++) {
84*b725ae77Skettenis x = va_arg(argp, int);
85*b725ae77Skettenis if (max_val < x) max_val = x;
86*b725ae77Skettenis printf(", %d", x);
87*b725ae77Skettenis }
88*b725ae77Skettenis printf(") returns %d\n", max_val);
89*b725ae77Skettenis return max_val;
90*b725ae77Skettenis }
91*b725ae77Skettenis
92*b725ae77Skettenis /* Double-float varargs, 2 declared args */
93*b725ae77Skettenis
find_max_double(int num_vals,double first_val,...)94*b725ae77Skettenis double find_max_double(int num_vals, double first_val, ...) {
95*b725ae77Skettenis double max_val = 0;
96*b725ae77Skettenis double x;
97*b725ae77Skettenis int i;
98*b725ae77Skettenis va_list argp;
99*b725ae77Skettenis va_start(argp, first_val);
100*b725ae77Skettenis x = first_val;
101*b725ae77Skettenis if (max_val < x) max_val = x;
102*b725ae77Skettenis printf("find_max(%d, %f", num_vals, first_val);
103*b725ae77Skettenis for (i = 1; i < num_vals; i++) {
104*b725ae77Skettenis x = va_arg(argp, double);
105*b725ae77Skettenis if (max_val < x) max_val = x;
106*b725ae77Skettenis printf(", %f", x);
107*b725ae77Skettenis }
108*b725ae77Skettenis printf(") returns %f\n", max_val);
109*b725ae77Skettenis return max_val;
110*b725ae77Skettenis }
111*b725ae77Skettenis
112