Path: blob/master/waterbox/libc/functions/_PDCLIB/stdarg.c
2 views
/* stdarg12This file is part of the Public Domain C Library (PDCLib).3Permission is granted to use, modify, and / or redistribute at will.4*/56#include <stdarg.h>7#include <limits.h>8#include <float.h>9#ifdef TEST1011#include "_PDCLIB_test.h"1213typedef int (*intfunc_t)( void );1415enum tag_t16{17TAG_END,18TAG_INT,19TAG_LONG,20TAG_LLONG,21TAG_DBL,22TAG_LDBL,23TAG_INTPTR,24TAG_LDBLPTR,25TAG_FUNCPTR26};2728static int dummy( void )29{30return INT_MAX;31}3233static int test( enum tag_t s, ... )34{35enum tag_t tag = s;36va_list ap;37va_start( ap, s );38for (;;)39{40switch ( tag )41{42case TAG_INT:43{44TESTCASE( va_arg( ap, int ) == INT_MAX );45tag = va_arg( ap, enum tag_t );46break;47}48case TAG_LONG:49{50TESTCASE( va_arg( ap, long ) == LONG_MAX );51tag = va_arg( ap, enum tag_t );52break;53}54case TAG_LLONG:55{56TESTCASE( va_arg( ap, long long ) == LLONG_MAX );57tag = va_arg( ap, enum tag_t );58break;59}60case TAG_DBL:61{62TESTCASE( va_arg( ap, double ) == DBL_MAX );63tag = va_arg( ap, enum tag_t );64break;65}66case TAG_LDBL:67{68TESTCASE( va_arg( ap, long double ) == LDBL_MAX );69tag = va_arg( ap, enum tag_t );70break;71}72case TAG_INTPTR:73{74TESTCASE( *( va_arg( ap, int * ) ) == INT_MAX );75tag = va_arg( ap, enum tag_t );76break;77}78case TAG_LDBLPTR:79{80TESTCASE( *( va_arg( ap, long double * ) ) == LDBL_MAX );81tag = va_arg( ap, enum tag_t );82break;83}84case TAG_FUNCPTR:85{86intfunc_t function;87TESTCASE( ( function = va_arg( ap, intfunc_t ) ) == dummy );88TESTCASE( function() == INT_MAX );89tag = va_arg( ap, enum tag_t );90break;91}92case TAG_END:93{94va_end( ap );95return 0;96}97}98}99}100101int main( void )102{103int x = INT_MAX;104long double d = LDBL_MAX;105test( TAG_END );106test( TAG_INT, INT_MAX, TAG_END );107test( TAG_LONG, LONG_MAX, TAG_LLONG, LLONG_MAX, TAG_END );108test( TAG_DBL, DBL_MAX, TAG_LDBL, LDBL_MAX, TAG_END );109test( TAG_INTPTR, &x, TAG_LDBLPTR, &d, TAG_FUNCPTR, dummy, TAG_END );110return TEST_RESULTS;111}112#endif113114115