annotate tangotests/vararg3.d @ 270:d9d5d59873d8 trunk

[svn r291] Fixed a bunch of the old Phobos tests to work with Tango. Branch statements now emit a new block after it. Fixed the _adSort runtime function had a bad signature. Added a missing dot prefix on compiler generated string tables for string switch. Fixed, PTRSIZE seems like it was wrong on 64bit, now it definitely gets set properly.
author lindquist
date Mon, 16 Jun 2008 16:01:19 +0200
parents 23d0d9855cad
children
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 {
264
a9dae3da4e87 [svn r285] Fixed D -> bool LLVM helper for floating point values.
lindquist
parents: 215
diff changeset
116 void* arg = vp;
a9dae3da4e87 [svn r285] Fixed D -> bool LLVM helper for floating point values.
lindquist
parents: 215
diff changeset
117 vp = vp + ( ( ti.tsize + size_t.sizeof - 1 ) & ~( size_t.sizeof - 1 ) );
a9dae3da4e87 [svn r285] Fixed D -> bool LLVM helper for floating point values.
lindquist
parents: 215
diff changeset
118 return arg;
214
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
119 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
120
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
121 void print(TypeInfo ti, void* arg)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
122 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
123 if (ti == typeid(byte))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
124 printf("%d", *cast(byte*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
125 else if (ti == typeid(short))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
126 printf("%d", *cast(short*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
127 else if (ti == typeid(int))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
128 printf("%d", *cast(int*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
129 else if (ti == typeid(long))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
130 printf("%lld", *cast(long*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
131
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
132 else if (ti == typeid(ubyte))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
133 printf("%u", *cast(ubyte*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
134 else if (ti == typeid(ushort))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
135 printf("%u", *cast(ushort*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
136 else if (ti == typeid(uint))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
137 printf("%u", *cast(uint*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
138 else if (ti == typeid(ulong))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
139 printf("%llu", *cast(ulong*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
140
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
141 else if (ti == typeid(float))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
142 printf("%f", *cast(float*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
143 else if (ti == typeid(double))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
144 printf("%f", *cast(double*)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
145 else if (ti == typeid(real)) // FIXME: 80bit?
268
23d0d9855cad [svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents: 264
diff changeset
146 {
23d0d9855cad [svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents: 264
diff changeset
147 version(LLVM_X86_FP80)
23d0d9855cad [svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents: 264
diff changeset
148 printf("%llf", *cast(real*)arg);
23d0d9855cad [svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents: 264
diff changeset
149 else
23d0d9855cad [svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents: 264
diff changeset
150 printf("%f", *cast(real*)arg);
23d0d9855cad [svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents: 264
diff changeset
151 }
214
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
152
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
153 else if (ti == typeid(char))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
154 printf("%.*s", 1, arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
155 else if (ti == typeid(wchar))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
156 printf("%.*s", 2, arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
157 else if (ti == typeid(dchar))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
158 printf("%.*s", 4, arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
159
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
160 else if (ti == typeid(char[]))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
161 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
162 char[] str = *cast(char[]*)arg;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
163 printf("%.*s", str.length, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
164 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
165 else if (ti == typeid(wchar[]))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
166 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
167 wchar[] str = *cast(wchar[]*)arg;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
168 printf("%.*s", str.length*2, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
169 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
170 else if (ti == typeid(dchar[]))
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
171 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
172 dchar[] str = *cast(dchar[]*)arg;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
173 printf("%.*s", str.length*4, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
174 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
175
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
176 else if (auto pti = cast(TypeInfo_Pointer)ti)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
177 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
178 printf("%p", *cast(void**)arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
179 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
180
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
181 else if (auto sti = cast(TypeInfo_Struct)ti)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
182 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
183 if (sti.xtoString !is null)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
184 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
185 char[] str = sti.xtoString(arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
186 printf("%.*s", str.length, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
187 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
188 else
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
189 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
190 char[] str = sti.toString();
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
191 printf("%.*s", str.length, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
192 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
193 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
194
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
195 else if (auto ati = cast(TypeInfo_Array)ti)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
196 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
197 auto tnext = ati.next;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
198 size_t len = *cast(size_t*)arg;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
199 void* ptr = *(cast(void**)arg + 1);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
200 printf("[");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
201 for(auto i=0; i<len; ++i)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
202 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
203 print(tnext, get_va_arg(tnext, ptr));
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
204 if (i < len-1)
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 printf("]");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
208 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
209
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
210 else if (auto cti = cast(TypeInfo_Class)ti)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
211 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
212 auto o = *cast(Object*)arg;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
213 char[] str = o.toString();
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
214 printf("%.*s", str.length, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
215 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
216
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
217 // static arrays are converted to dynamic arrays when passed to variadic functions
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
218 else if (auto sati = cast(TypeInfo_StaticArray)ti)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
219 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
220 assert(0, "static arrays not supported");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
221 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
222
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
223 else if (auto aati = cast(TypeInfo_AssociativeArray)ti)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
224 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
225 assert(0, "associative array not supported");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
226 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
227
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
228 else
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
229 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
230 char[] str = ti.toString();
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
231 printf("typeinfo: %.*s\n", str.length, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
232 str = ti.classinfo.name;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
233 printf("typeinfo.classinfo: %.*s\n", str.length, str.ptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
234 assert(0, "unsupported type ^");
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
235 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
236 }
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 print(...)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
239 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
240 void* argptr = _argptr;
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
241 assert(argptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
242
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
243 foreach(i,ti; _arguments)
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
244 {
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
245 void* arg = get_va_arg(ti, argptr);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
246 assert(arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
247 print(ti, arg);
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
248 }
629cfc1e7b77 [svn r230] Added vararg3 sample tangotest.
lindquist
parents:
diff changeset
249 }