]> pd.if.org Git - pdclib/blob - functions/_PDCLIB/stdarg.c
PDCLib includes with quotes, not <>.
[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 #ifdef TEST
11
12 #include "_PDCLIB_test.h"
13
14 typedef int (*intfunc_t)( void );
15
16 enum tag_t
17 {
18     TAG_END,
19     TAG_INT,
20     TAG_LONG,
21     TAG_LLONG,
22     TAG_DBL,
23     TAG_LDBL,
24     TAG_INTPTR,
25     TAG_LDBLPTR,
26     TAG_FUNCPTR
27 };
28
29 static int dummy( void )
30 {
31     return INT_MAX;
32 }
33
34 static int test( enum tag_t s, ... )
35 {
36     enum tag_t tag = s;
37     va_list ap;
38     va_start( ap, s );
39     for (;;)
40     {
41         switch ( tag )
42         {
43             case TAG_INT:
44             {
45                 TESTCASE( va_arg( ap, int ) == INT_MAX );
46                 tag = va_arg( ap, enum tag_t );
47                 break;
48             }
49             case TAG_LONG:
50             {
51                 TESTCASE( va_arg( ap, long ) == LONG_MAX );
52                 tag = va_arg( ap, enum tag_t );
53                 break;
54             }
55             case TAG_LLONG:
56             {
57                 TESTCASE( va_arg( ap, long long ) == LLONG_MAX );
58                 tag = va_arg( ap, enum tag_t );
59                 break;
60             }
61             case TAG_DBL:
62             {
63                 TESTCASE( va_arg( ap, double ) == DBL_MAX );
64                 tag = va_arg( ap, enum tag_t );
65                 break;
66             }
67             case TAG_LDBL:
68             {
69                 TESTCASE( va_arg( ap, long double ) == LDBL_MAX );
70                 tag = va_arg( ap, enum tag_t );
71                 break;
72             }
73             case TAG_INTPTR:
74             {
75                 TESTCASE( *( va_arg( ap, int * ) ) == INT_MAX );
76                 tag = va_arg( ap, enum tag_t );
77                 break;
78             }
79             case TAG_LDBLPTR:
80             {
81                 TESTCASE( *( va_arg( ap, long double * ) ) == LDBL_MAX );
82                 tag = va_arg( ap, enum tag_t );
83                 break;
84             }
85             case TAG_FUNCPTR:
86             {
87                 intfunc_t function;
88                 TESTCASE( ( function = va_arg( ap, intfunc_t ) ) == dummy );
89                 TESTCASE( function() == INT_MAX );
90                 tag = va_arg( ap, enum tag_t );
91                 break;
92             }
93             case TAG_END:
94             {
95                 va_end( ap );
96                 return 0;
97             }
98         }
99     }
100 }
101
102 int main( void )
103 {
104     int x = INT_MAX;
105     long double d = LDBL_MAX;
106     test( TAG_END );
107     test( TAG_INT, INT_MAX, TAG_END );
108     test( TAG_LONG, LONG_MAX, TAG_LLONG, LLONG_MAX, TAG_END );
109     test( TAG_DBL, DBL_MAX, TAG_LDBL, LDBL_MAX, TAG_END );
110     test( TAG_INTPTR, &x, TAG_LDBLPTR, &d, TAG_FUNCPTR, dummy, TAG_END );
111     return TEST_RESULTS;
112 }
113 #endif