summaryrefslogtreecommitdiff
path: root/test/variadic/inner.c
blob: cc4426e52d28f5e3d07abc238cb80a043219b3cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

#include <stdio.h>
#include <wchar.h>
#include <stdarg.h>
#include <stddef.h>

/*   round 0:  c, s, wc, i, wi */
long inner0(char *out, ...) {
  char c = 0;
  short s = 0;
  wchar_t wc = 0;
  int i = 0;
  wint_t wi = 0;

  va_list ap;
  va_start(ap, out);
  c = va_arg(ap, int);
  s = va_arg(ap, int);
  wc = va_arg(ap, typeof(wc));
  i = va_arg(ap, typeof(i));
  wi = va_arg(ap, typeof(wi));
  va_end(ap);

  int ret = sprintf(out, "c: 0x%x s: 0x%x wc: 0x%lx i: 0x%x wi: 0x%x\n", c, s, (long)wc, i, wi);
  return ret;
}
/*   round 1: l, ll, ptr, pd, sz */
long inner1(char *out, ...) {
  long l = 0;
  long long ll = 0;
  void *ptr = NULL;
  ptrdiff_t pd = 0;
  size_t sz = 0;

  va_list ap;
  va_start(ap, out);
  l = va_arg(ap, typeof(l));
  ll = va_arg(ap, typeof(ll));
  ptr = va_arg(ap, typeof(ptr));
  pd = va_arg(ap, typeof(pd));
  sz = va_arg(ap, typeof(sz));
  va_end(ap);

  int ret = sprintf(out, "l: 0x%lx ll: 0x%llx ptr: %p pd: 0x%tx sz: 0x%zx\n", l, ll, ptr, pd, sz);
  return ret;
}