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