Commit | Line | Data |
---|---|---|
c906108c SS |
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 | float fa,fb,fc,fd; | |
22 | double da,db,dc,dd; | |
23 | double dmax_val; | |
24 | ||
25 | main() { | |
26 | c = -1; | |
27 | uc = 1; | |
28 | s = -2; | |
29 | us = 2; | |
30 | a = 1; | |
31 | b = 60; | |
32 | max_val = find_max1(1, 60); | |
33 | max_val = find_max1(a, b); | |
34 | a = 3; | |
35 | b = 1; | |
36 | c = 4; | |
37 | d = 2; | |
38 | max_val = find_max1(3, 1, 4, 2); | |
39 | max_val = find_max2(a, b, c, d); | |
40 | da = 3.0; | |
41 | db = 1.0; | |
42 | dc = 4.0; | |
43 | dd = 2.0; | |
44 | dmax_val = find_max_double(3, 1.0, 4.0, 2.0); | |
45 | dmax_val = find_max_double(a, db, dc, dd); | |
46 | } | |
47 | ||
48 | /* Integer varargs, 1 declared arg */ | |
49 | ||
50 | int find_max1(int num_vals, ...) { | |
51 | int max_val = 0; | |
52 | int x; | |
53 | int i; | |
54 | va_list argp; | |
55 | va_start(argp, num_vals); | |
56 | printf("find_max(%d,", num_vals); | |
57 | for (i = 0; i < num_vals; i++) { | |
58 | x = va_arg(argp, int); | |
59 | if (max_val < x) max_val = x; | |
60 | if (i < num_vals - 1) | |
61 | printf(" %d,", x); | |
62 | else | |
63 | printf(" %d)", x); | |
64 | } | |
65 | printf(" returns %d\n", max_val); | |
66 | return max_val; | |
67 | } | |
68 | ||
69 | /* Integer varargs, 2 declared args */ | |
70 | ||
71 | int find_max2(int num_vals, int first_val, ...) { | |
72 | int max_val = 0; | |
73 | int x; | |
74 | int i; | |
75 | va_list argp; | |
76 | va_start(argp, first_val); | |
77 | x = first_val; | |
78 | if (max_val < x) max_val = x; | |
79 | printf("find_max(%d, %d", num_vals, first_val); | |
80 | for (i = 1; i < num_vals; i++) { | |
81 | x = va_arg(argp, int); | |
82 | if (max_val < x) max_val = x; | |
83 | printf(", %d", x); | |
84 | } | |
85 | printf(") returns %d\n", max_val); | |
86 | return max_val; | |
87 | } | |
88 | ||
89 | /* Double-float varargs, 2 declared args */ | |
90 | ||
91 | double find_max_double(int num_vals, double first_val, ...) { | |
92 | double max_val = 0; | |
93 | double x; | |
94 | int i; | |
95 | va_list argp; | |
96 | va_start(argp, first_val); | |
97 | x = first_val; | |
98 | if (max_val < x) max_val = x; | |
99 | printf("find_max(%f, %f", num_vals, first_val); | |
100 | for (i = 1; i < num_vals; i++) { | |
101 | x = va_arg(argp, double); | |
102 | if (max_val < x) max_val = x; | |
103 | printf(", %f", x); | |
104 | } | |
105 | printf(") returns %f\n", max_val); | |
106 | return max_val; | |
107 | } | |
108 |