diff --git a/tests/plat/bugs/bug-157-i80-varargs_c.c b/tests/plat/bugs/bug-157-i80-varargs_c.c new file mode 100644 index 000000000..5eb34ec13 --- /dev/null +++ b/tests/plat/bugs/bug-157-i80-varargs_c.c @@ -0,0 +1,81 @@ +#include +#include +#include +#include +#include +#include "test.h" + +static char buf[34]; + +char * __ultostr(unsigned long val, int radix) +{ + register char *p; + register int c; + + if( radix > 36 || radix < 2 ) return 0; + + p = buf+sizeof(buf); + *--p = '\0'; + + do + { + c = val%radix; + val/=radix; + if( c > 9 ) *--p = 'a'-10+c; else *--p = '0'+c; + } + while(val); + return p; +} + +char * __ltostr(long val, int radix) +{ + char *p; + int flg = 0; + if( val < 0 ) { flg++; val= -val; } + p = __ultostr(val, radix); + if(p && flg) *--p = '-'; + return p; +} + +void demo(int lval, va_list ap) +{ + char *ptmp = __ltostr((long) ((lval) ? + va_arg(ap, long) : + va_arg(ap, int)), 10); + ASSERT(strcmp(ptmp, "35") == 0); +} + +void demo2(int lval, va_list ap) +{ + long l; + char *ptmp; + + l = (lval) ?va_arg(ap, long) : + va_arg(ap, int); + ptmp = __ltostr(l, 10); + ASSERT(strcmp(ptmp, "35") == 0); +} + +void doit1(char *x, ...) +{ + va_list ptr; + va_start(ptr, x); + demo(0,ptr); + va_end(ptr); +} + +void doit2(char *x, ...) +{ + va_list ptr; + va_start(ptr, x); + demo2(0,ptr); + va_end(ptr); +} + +int main(int argc, char *argv[]) +{ + doit1("", 35); + doit2("", 35); + finished(); + return 0; +}