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