]> pd.if.org Git - pdclib/blob - functions/_PDCLIB/stdarg.c
e187c76e8dda8360fb02c9cd7ecf5e61243623e8
[pdclib] / functions / _PDCLIB / stdarg.c
1 /* $Id$ */
2
3 /* stdarg
4
5    This file is part of the Public Domain C Library (PDCLib).
6    Permission is granted to use, modify, and / or redistribute at will.
7 */
8
9 #include <stdarg.h>
10 #include <limits.h>
11 #include <float.h>
12
13 #include <_PDCLIB_test.h>
14
15 typedef int (*intfunc_t)( void );
16
17 enum tag_t
18 {
19     TAG_END,
20     TAG_INT,
21     TAG_LONG,
22     TAG_LLONG,
23     TAG_DBL,
24     TAG_LDBL,
25     TAG_INTPTR,
26     TAG_LDBLPTR,
27     TAG_FUNCPTR
28 };
29
30 static int test( enum tag_t s, ... )
31 {
32     enum tag_t tag = s;
33     va_list ap;
34     va_start( ap, s );
35     for (;;)
36     {
37         switch ( tag )
38         {
39             case TAG_INT:
40             {
41                 TESTCASE( va_arg( ap, int ) == INT_MAX );
42                 tag = va_arg( ap, enum tag_t );
43                 break;
44             }
45             case TAG_LONG:
46             {
47                 TESTCASE( va_arg( ap, long ) == LONG_MAX );
48                 tag = va_arg( ap, enum tag_t );
49                 break;
50             }
51             case TAG_LLONG:
52             {
53                 TESTCASE( va_arg( ap, long long ) == LLONG_MAX );
54                 tag = va_arg( ap, enum tag_t );
55                 break;
56             }
57             case TAG_DBL:
58             {
59                 TESTCASE( va_arg( ap, double ) == DBL_MAX );
60                 tag = va_arg( ap, enum tag_t );
61                 break;
62             }
63             case TAG_LDBL:
64             {
65                 TESTCASE( va_arg( ap, long double ) == LDBL_MAX );
66                 tag = va_arg( ap, enum tag_t );
67                 break;
68             }
69             case TAG_INTPTR:
70             {
71                 TESTCASE( *( va_arg( ap, int * ) ) == INT_MAX );
72                 tag = va_arg( ap, enum tag_t );
73                 break;
74             }
75             case TAG_LDBLPTR:
76             {
77                 TESTCASE( *( va_arg( ap, long double * ) ) == LDBL_MAX );
78                 tag = va_arg( ap, enum tag_t );
79                 break;
80             }
81             case TAG_FUNCPTR:
82             {
83                 TESTCASE( (va_arg( ap, intfunc_t ))() == INT_MAX );
84                 tag = va_arg( ap, enum tag_t );
85                 break;
86             }
87             case TAG_END:
88             {
89                 va_end( ap );
90                 return 0;
91             }
92         }
93     }
94 }
95
96 static int dummy( void )
97 {
98     return INT_MAX;
99 }
100
101 int main( void )
102 {
103     int x = INT_MAX;
104     long double d = LDBL_MAX;
105     test( TAG_END );
106     test( TAG_INT, INT_MAX, TAG_END );
107     test( TAG_LONG, LONG_MAX, TAG_LLONG, LLONG_MAX, TAG_END );
108     test( TAG_DBL, DBL_MAX, TAG_LDBL, LDBL_MAX, TAG_END );
109     test( TAG_INTPTR, &x, TAG_LDBLPTR, &d, TAG_FUNCPTR, dummy, TAG_END );
110     return TEST_RESULTS;
111 }