Reworked scanf() testing. General cleanups.
[fw/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 dummy( void )
31 {
32     return INT_MAX;
33 }
34
35 static int test( enum tag_t s, ... )
36 {
37     enum tag_t tag = s;
38     va_list ap;
39     va_start( ap, s );
40     for (;;)
41     {
42         switch ( tag )
43         {
44             case TAG_INT:
45             {
46                 TESTCASE( va_arg( ap, int ) == INT_MAX );
47                 tag = va_arg( ap, enum tag_t );
48                 break;
49             }
50             case TAG_LONG:
51             {
52                 TESTCASE( va_arg( ap, long ) == LONG_MAX );
53                 tag = va_arg( ap, enum tag_t );
54                 break;
55             }
56             case TAG_LLONG:
57             {
58                 TESTCASE( va_arg( ap, long long ) == LLONG_MAX );
59                 tag = va_arg( ap, enum tag_t );
60                 break;
61             }
62             case TAG_DBL:
63             {
64                 TESTCASE( va_arg( ap, double ) == DBL_MAX );
65                 tag = va_arg( ap, enum tag_t );
66                 break;
67             }
68             case TAG_LDBL:
69             {
70                 TESTCASE( va_arg( ap, long double ) == LDBL_MAX );
71                 tag = va_arg( ap, enum tag_t );
72                 break;
73             }
74             case TAG_INTPTR:
75             {
76                 TESTCASE( *( va_arg( ap, int * ) ) == INT_MAX );
77                 tag = va_arg( ap, enum tag_t );
78                 break;
79             }
80             case TAG_LDBLPTR:
81             {
82                 TESTCASE( *( va_arg( ap, long double * ) ) == LDBL_MAX );
83                 tag = va_arg( ap, enum tag_t );
84                 break;
85             }
86             case TAG_FUNCPTR:
87             {
88                 intfunc_t function;
89                 TESTCASE( ( function = va_arg( ap, intfunc_t ) ) == dummy );
90                 TESTCASE( function() == INT_MAX );
91                 tag = va_arg( ap, enum tag_t );
92                 break;
93             }
94             case TAG_END:
95             {
96                 va_end( ap );
97                 return 0;
98             }
99         }
100     }
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 }