blob: 5eb1f97abcca82cf2404108e6953f41935be6703 [file] [log] [blame]
#include <stdio.h>
#include <stdarg.h>
/* 5 bytes. */
typedef struct DWordS_struct { int i; char c; } DWordS;
/* 12 bytes if d is 4-byte aligned; 16 bytes if d is 8-byte aligned. */
typedef struct QuadWordS_struct { int i; double d; } QuadWordS;
/* 20 bytes if d is 4-byte aligned; 28 bytes if d is 8-byte aligned
* (assuming pointer size is 4 bytes and 8 bytes respectively). */
typedef struct LargeS_struct { int i; double d; DWordS* ptr; int j; } LargeS;
void test(char *fmt, ...) {
va_list ap, aq;
int d;
char c, *s;
DWordS dw;
QuadWordS qw;
LargeS ls;
va_start(ap, fmt);
va_copy(aq, ap); /* test va_copy */
va_end(aq);
while (*fmt)
switch(*fmt++) {
case 's': /* string */
s = va_arg(ap, char *);
printf("string %s\n", s);
break;
case 'i': /* int */
d = va_arg(ap, int);
printf("int %d\n", d);
break;
case 'd':
printf("double %f\n", va_arg(ap, double));
break;
case 'l':
printf("long long %lld\n", va_arg(ap, long long));
break;
case 'c': /* char */
/* need a cast here since va_arg only
takes fully promoted types */
c = (char) va_arg(ap, int);
printf("char %c\n", c);
break;
case 'D':
dw = va_arg(ap, DWordS);
printf("DWord { %d, %c }\n", dw.i, dw.c);
break;
case 'Q':
qw = va_arg(ap, QuadWordS);
printf("QuadWord { %d, %f }\n", qw.i, qw.d);
break;
case 'L':
ls = va_arg(ap, LargeS);
printf("LargeS { %d, %f, 0x%d, %d }\n", ls.i, ls.d, ls.ptr != 0, ls.j);
break;
}
va_end(ap);
}
int main() {
DWordS dw = { 18, 'a' };
QuadWordS qw = { 19, 20.0 };
LargeS ls = { 21, 22.0, &dw, 23 };
test("ssiciiiiis", "abc", "def", -123, 'a', 123, 6, 7, 8, 9, "10 args done!");
/* test promotion & 64-bit types */
test("ddil", 1.0, 2.0f, (short)32764, 12345677823423LL);
/* test passing structs by value to varargs */
test("DQL", dw, qw, ls);
return 0;
}