98 lines
2.0 KiB
C
98 lines
2.0 KiB
C
/* Test variable number of arguments passed to functions. For now this is
|
|
just a simple test to see if it's working. */
|
|
|
|
#include <stdarg.h>
|
|
#include "defines.h"
|
|
|
|
|
|
#define ARG_INT 1
|
|
#define ARG_DOUBLE 2
|
|
#define ARG_POINTER 3
|
|
|
|
union types
|
|
{
|
|
int ivalue;
|
|
double dvalue;
|
|
void *pvalue;
|
|
};
|
|
|
|
struct arg
|
|
{
|
|
int type;
|
|
union types value;
|
|
};
|
|
|
|
struct arg *arglist;
|
|
|
|
/* This tests the argumentlist to see if it matches the format string which
|
|
is printf-like. Nothing will be printed of course. It can handle ints,
|
|
doubles and void pointers. The given value will be tested against the
|
|
values given in arglist.
|
|
This test only assures that the variable argument passing is working.
|
|
No attempt is made to see if argument passing is done the right way.
|
|
Since the ABI doesn't say how it's done, checking this is not really
|
|
relevant. */
|
|
void
|
|
my_noprintf (char *format, ...)
|
|
{
|
|
va_list va_arglist;
|
|
char *c;
|
|
|
|
int ivalue;
|
|
double dvalue;
|
|
void *pvalue;
|
|
struct arg *argp = arglist;
|
|
|
|
va_start (va_arglist, format);
|
|
for (c = format; *c; c++)
|
|
if (*c == '%')
|
|
{
|
|
switch (*++c)
|
|
{
|
|
case 'd':
|
|
assert (argp->type == ARG_INT);
|
|
ivalue = va_arg (va_arglist, int);
|
|
assert (argp->value.ivalue == ivalue);
|
|
break;
|
|
case 'f':
|
|
assert (argp->type == ARG_DOUBLE);
|
|
dvalue = va_arg (va_arglist, double);
|
|
assert (argp->value.dvalue == dvalue);
|
|
break;
|
|
case 'p':
|
|
assert (argp->type == ARG_POINTER);
|
|
pvalue = va_arg (va_arglist, void *);
|
|
assert (argp->value.pvalue == pvalue);
|
|
break;
|
|
default:
|
|
abort ();
|
|
}
|
|
|
|
argp++;
|
|
}
|
|
}
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
#ifdef CHECK_VARARGS
|
|
struct arg al[5];
|
|
|
|
al[0].type = ARG_INT;
|
|
al[0].value.ivalue = 256;
|
|
al[1].type = ARG_DOUBLE;
|
|
al[1].value.dvalue = 257.0;
|
|
al[2].type = ARG_POINTER;
|
|
al[2].value.pvalue = al;
|
|
al[3].type = ARG_DOUBLE;
|
|
al[3].value.dvalue = 258.0;
|
|
al[4].type = ARG_INT;
|
|
al[4].value.ivalue = 259;
|
|
|
|
arglist = al;
|
|
my_noprintf("%d%f%p%f%d", 256, 257.0, al, 258.0, 259);
|
|
#endif
|
|
|
|
return 0;
|
|
}
|