annotate tangotests/vararg3.d @ 286:a3b7c19c866c trunk

[svn r307] Fixed: multidimensional new expressions now work. Eg.: auto ma = new int[][] (3,9);
author lindquist
date Sat, 21 Jun 2008 04:47:14 +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 }