0009-stdarg.c - scc - simple c99 compiler
(HTM) git clone git://git.simple-cc.org/scc
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Submodules
(DIR) README
(DIR) LICENSE
---
0009-stdarg.c (1125B)
---
1 #include <assert.h>
2 #include <stdarg.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5
6 /*
7 output:
8 testing
9 test 1
10 test 2
11 done
12 end:
13 */
14
15 void
16 vtest(char *fmt, va_list va)
17 {
18 int cnt = 1;
19 long long *p;
20
21 while (*fmt) {
22 switch (*fmt++) {
23 case 'c':
24 assert(va_arg(va, int) == cnt++);
25 break;
26 case 's':
27 assert(va_arg(va, int) == cnt++);
28 break;
29 case 'i':
30 assert(va_arg(va, int) == cnt++);
31 break;
32 case 'l':
33 assert(va_arg(va, long) == cnt++);
34 break;
35 case 'q':
36 assert(va_arg(va, long long) == cnt++);
37 break;
38 case 'p':
39 p = va_arg(va, void *);
40 assert(*p == cnt++);
41 break;
42 case 'f':
43 assert(va_arg(va, double) == cnt++);
44 break;
45 default:
46 abort();
47 }
48 }
49 }
50
51 void
52 test(char *s, char *fmt, ...)
53 {
54 va_list va, vc;
55
56 puts(s);
57 va_start(va, fmt);
58 va_copy(vc, va);
59 vtest(fmt, vc);
60 va_end(vc);
61 va_end(va);
62 }
63
64 int
65 main()
66 {
67 char c;
68 short s;
69 int i;
70 long l;
71 long long ll;
72 float f;
73
74 puts("testing");
75 c = 1;
76 i = 2;
77 l = 3;
78 ll = 4;
79 test("test 1", "cilp", c, i, l, (void *) &ll);
80
81 c = 1;
82 s = 2;
83 ll = 3;
84 f = 4.0;
85 test("test 2", "csqf", c, s, ll, f);
86 puts("done");
87
88 return 0;
89 }