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