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