annotate tangotests/vararg3.d @ 228:52d1e9d27dc6 trunk

[svn r244] added another asm test.
author lindquist
date Sat, 07 Jun 2008 19:20:15 +0200
parents a58d8f4b84df
children a9dae3da4e87
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
214
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
1 // tries to implement a fairly complete variadic print function
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
2 module tangotests.vararg3;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
3
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
4 extern(C) int printf(char*, ...);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
5
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
6 struct User
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
7 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
8 char[] name;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
9 char[] nick;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
10 uint age;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
11
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
12 char[] toString()
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
13 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
14 return nick ~ "(" ~ name ~ ")";
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
15 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
16 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
17
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
18 struct Infidel
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
19 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
20 char[] whocares;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
21 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
22
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
23 class Obj
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
24 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
25 private char[] ty;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
26
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
27 this(char[] t)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
28 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
29 ty = t;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
30 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
31
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
32 char[] toString()
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
33 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
34 return "Obj(" ~ ty ~ ")";
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
35 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
36 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
37
215
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
38 struct TLA
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
39 {
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
40 char[3] acronym;
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
41
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
42 char[] toString()
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
43 {
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
44 return acronym;
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
45 }
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
46 }
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
47
214
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
48 void main()
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
49 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
50 User user = User("Bob Doe", "bd", 47);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
51 char[] str = user.toString();
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
52 printf("Direct call:\n%.*s\nBy typeinfo:\n", str.length, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
53 print(user, '\n');
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
54
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
55 print("Without toString:\n");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
56 Infidel inf = Infidel("not me");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
57 print(inf, '\n');
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
58
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
59 print("Character arrays:\n");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
60 print("hello world\n");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
61
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
62 print("Signed integers:\n");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
63 print(cast(byte)byte.max,' ',cast(short)short.max,' ',cast(int)int.max,' ',cast(long)long.max,'\n');
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
64
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
65 print("Unsigned integers:\n");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
66 print(cast(ubyte)ubyte.max,' ',cast(ushort)ushort.max,' ',cast(uint)uint.max,' ',cast(ulong)ulong.max,'\n');
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
67
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
68 print("Floating point:\n");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
69 print(cast(float)1.273f, ' ', cast(double)3.412367, ' ', cast(real)142.96731112, '\n');
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
70
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
71 print("Arrays:\n");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
72 int[] ia1 = [1,2,3,4,5,6,7,8,9];
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
73 print(ia1, '\n');
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
74 float[] fa1 = [0.1f, 0.15f, 0.2f, 0.25f, 0.3f];
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
75 print(fa1, '\n');
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
76
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
77 print("Pointers:\n");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
78 print(&user,'\n');
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
79 print(&inf,'\n');
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
80 print(&ia1,'\n');
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
81 print(&fa1,'\n');
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
82
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
83 print("Static arrays:\n");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
84 int[5] isa1 = [1,2,4,8,16];
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
85 print(isa1,'\n');
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
86
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
87 print("Classes:\n");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
88 Obj o = new Obj("foo");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
89 print(o, '\n');
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
90
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
91 print("Mixed:\n");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
92 print(123, ' ', 42.536f, " foobar ", ia1, ' ', user, '\n');
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
93 print(42, ' ', cast(byte)12, ' ', user, ' ', cast(short)1445, " foo\n");
215
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
94
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
95 print("International:\n");
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
96 print('æ','ø','å','\n');
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
97 print('Æ','Ø','Å','\n');
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
98 print("rød grød med fløde\n");
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
99 print("Heiße\n");
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
100
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
101 print("TLAs:\n");
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
102 TLA tla1 = TLA("FBI");
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
103 TLA tla2 = TLA("CIA");
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
104 TLA tla3 = TLA("TLA");
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
105 print(tla1);
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
106 print(tla2);
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
107 print(tla3, '\n');
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
108 print(tla1, tla2, tla3, '\n');
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
109 print(TLA("FBI"), TLA("CIA"), TLA("TLA"), '\n');
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
110
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 214
diff changeset
111 print("Done!\n");
214
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
112 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
113
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
114 private void* get_va_arg(TypeInfo ti, ref void* vp)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
115 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
116 auto tisize = ti.tsize;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
117 assert(tisize);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
118 size_t size = tisize > size_t.sizeof ? size_t.sizeof : tisize;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
119 void* vptmp = cast(void*)((cast(size_t)vp + size - 1) & ~(size - 1));
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
120 vp = vptmp + tisize;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
121 return vptmp;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
122 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
123
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
124 void print(TypeInfo ti, void* arg)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
125 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
126 if (ti == typeid(byte))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
127 printf("%d", *cast(byte*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
128 else if (ti == typeid(short))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
129 printf("%d", *cast(short*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
130 else if (ti == typeid(int))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
131 printf("%d", *cast(int*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
132 else if (ti == typeid(long))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
133 printf("%lld", *cast(long*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
134
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
135 else if (ti == typeid(ubyte))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
136 printf("%u", *cast(ubyte*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
137 else if (ti == typeid(ushort))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
138 printf("%u", *cast(ushort*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
139 else if (ti == typeid(uint))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
140 printf("%u", *cast(uint*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
141 else if (ti == typeid(ulong))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
142 printf("%llu", *cast(ulong*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
143
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
144 else if (ti == typeid(float))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
145 printf("%f", *cast(float*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
146 else if (ti == typeid(double))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
147 printf("%f", *cast(double*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
148 else if (ti == typeid(real)) // FIXME: 80bit?
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
149 printf("%f", *cast(real*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
150
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
151 else if (ti == typeid(char))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
152 printf("%.*s", 1, arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
153 else if (ti == typeid(wchar))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
154 printf("%.*s", 2, arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
155 else if (ti == typeid(dchar))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
156 printf("%.*s", 4, arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
157
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
158 else if (ti == typeid(char[]))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
159 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
160 char[] str = *cast(char[]*)arg;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
161 printf("%.*s", str.length, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
162 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
163 else if (ti == typeid(wchar[]))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
164 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
165 wchar[] str = *cast(wchar[]*)arg;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
166 printf("%.*s", str.length*2, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
167 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
168 else if (ti == typeid(dchar[]))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
169 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
170 dchar[] str = *cast(dchar[]*)arg;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
171 printf("%.*s", str.length*4, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
172 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
173
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
174 else if (auto pti = cast(TypeInfo_Pointer)ti)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
175 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
176 printf("%p", *cast(void**)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
177 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
178
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
179 else if (auto sti = cast(TypeInfo_Struct)ti)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
180 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
181 if (sti.xtoString !is null)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
182 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
183 char[] str = sti.xtoString(arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
184 printf("%.*s", str.length, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
185 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
186 else
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
187 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
188 char[] str = sti.toString();
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
189 printf("%.*s", str.length, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
190 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
191 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
192
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
193 else if (auto ati = cast(TypeInfo_Array)ti)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
194 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
195 auto tnext = ati.next;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
196 size_t len = *cast(size_t*)arg;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
197 void* ptr = *(cast(void**)arg + 1);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
198 printf("[");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
199 for(auto i=0; i<len; ++i)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
200 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
201 print(tnext, get_va_arg(tnext, ptr));
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
202 if (i < len-1)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
203 printf(",");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
204 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
205 printf("]");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
206 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
207
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
208 else if (auto cti = cast(TypeInfo_Class)ti)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
209 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
210 auto o = *cast(Object*)arg;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
211 char[] str = o.toString();
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
212 printf("%.*s", str.length, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
213 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
214
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
215 // static arrays are converted to dynamic arrays when passed to variadic functions
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
216 else if (auto sati = cast(TypeInfo_StaticArray)ti)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
217 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
218 assert(0, "static arrays not supported");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
219 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
220
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
221 else if (auto aati = cast(TypeInfo_AssociativeArray)ti)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
222 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
223 assert(0, "associative array not supported");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
224 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
225
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
226 else
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
227 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
228 char[] str = ti.toString();
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
229 printf("typeinfo: %.*s\n", str.length, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
230 str = ti.classinfo.name;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
231 printf("typeinfo.classinfo: %.*s\n", str.length, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
232 assert(0, "unsupported type ^");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
233 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
234 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
235
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
236 void print(...)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
237 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
238 void* argptr = _argptr;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
239 assert(argptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
240
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
241 foreach(i,ti; _arguments)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
242 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
243 void* arg = get_va_arg(ti, argptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
244 assert(arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
245 print(ti, arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
246 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
247 }