#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;
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;
}