lindquist@341: // tries to implement a fairly complete variadic print function lindquist@341: module tangotests.vararg3; lindquist@341: lindquist@341: extern(C) int printf(char*, ...); lindquist@341: lindquist@341: struct User lindquist@341: { lindquist@341: char[] name; lindquist@341: char[] nick; lindquist@341: uint age; lindquist@341: lindquist@341: char[] toString() lindquist@341: { lindquist@341: return nick ~ "(" ~ name ~ ")"; lindquist@341: } lindquist@341: } lindquist@341: lindquist@341: struct Infidel lindquist@341: { lindquist@341: char[] whocares; lindquist@341: } lindquist@341: lindquist@341: class Obj lindquist@341: { lindquist@341: private char[] ty; lindquist@341: lindquist@341: this(char[] t) lindquist@341: { lindquist@341: ty = t; lindquist@341: } lindquist@341: lindquist@341: char[] toString() lindquist@341: { lindquist@341: return "Obj(" ~ ty ~ ")"; lindquist@341: } lindquist@341: } lindquist@341: lindquist@341: struct TLA lindquist@341: { lindquist@341: char[3] acronym; lindquist@341: lindquist@341: char[] toString() lindquist@341: { lindquist@341: return acronym; lindquist@341: } lindquist@341: } lindquist@341: lindquist@341: void main() lindquist@341: { lindquist@341: User user = User("Bob Doe", "bd", 47); lindquist@341: char[] str = user.toString(); lindquist@341: printf("Direct call:\n%.*s\nBy typeinfo:\n", str.length, str.ptr); lindquist@341: print(user, '\n'); lindquist@341: lindquist@341: print("Without toString:\n"); lindquist@341: Infidel inf = Infidel("not me"); lindquist@341: print(inf, '\n'); lindquist@341: lindquist@341: print("Character arrays:\n"); lindquist@341: print("hello world\n"); lindquist@341: lindquist@341: print("Signed integers:\n"); lindquist@341: print(cast(byte)byte.max,' ',cast(short)short.max,' ',cast(int)int.max,' ',cast(long)long.max,'\n'); lindquist@341: lindquist@341: print("Unsigned integers:\n"); lindquist@341: print(cast(ubyte)ubyte.max,' ',cast(ushort)ushort.max,' ',cast(uint)uint.max,' ',cast(ulong)ulong.max,'\n'); lindquist@341: lindquist@341: print("Floating point:\n"); lindquist@341: print(cast(float)1.273f, ' ', cast(double)3.412367, ' ', cast(real)142.96731112, '\n'); lindquist@341: lindquist@341: print("Arrays:\n"); lindquist@341: int[] ia1 = [1,2,3,4,5,6,7,8,9]; lindquist@341: print(ia1, '\n'); lindquist@341: float[] fa1 = [0.1f, 0.15f, 0.2f, 0.25f, 0.3f]; lindquist@341: print(fa1, '\n'); lindquist@341: lindquist@341: print("Pointers:\n"); lindquist@341: print(&user,'\n'); lindquist@341: print(&inf,'\n'); lindquist@341: print(&ia1,'\n'); lindquist@341: print(&fa1,'\n'); lindquist@341: lindquist@341: print("Static arrays:\n"); lindquist@341: int[5] isa1 = [1,2,4,8,16]; lindquist@341: print(isa1,'\n'); lindquist@341: lindquist@341: print("Classes:\n"); lindquist@341: Obj o = new Obj("foo"); lindquist@341: print(o, '\n'); lindquist@341: lindquist@341: print("Mixed:\n"); lindquist@341: print(123, ' ', 42.536f, " foobar ", ia1, ' ', user, '\n'); lindquist@341: print(42, ' ', cast(byte)12, ' ', user, ' ', cast(short)1445, " foo\n"); lindquist@341: lindquist@341: print("International:\n"); lindquist@341: print('æ','ø','å','\n'); lindquist@341: print('Æ','Ø','Å','\n'); lindquist@341: print("rød grød med fløde\n"); lindquist@341: print("Heiße\n"); lindquist@341: lindquist@341: print("TLAs:\n"); lindquist@341: TLA tla1 = TLA("FBI"); lindquist@341: TLA tla2 = TLA("CIA"); lindquist@341: TLA tla3 = TLA("TLA"); lindquist@341: print(tla1); lindquist@341: print(tla2); lindquist@341: print(tla3, '\n'); lindquist@341: print(tla1, tla2, tla3, '\n'); lindquist@341: print(TLA("FBI"), TLA("CIA"), TLA("TLA"), '\n'); lindquist@341: lindquist@341: print("Done!\n"); lindquist@341: } lindquist@341: lindquist@341: private void* get_va_arg(TypeInfo ti, ref void* vp) lindquist@341: { lindquist@341: void* arg = vp; lindquist@341: vp = vp + ( ( ti.tsize + size_t.sizeof - 1 ) & ~( size_t.sizeof - 1 ) ); lindquist@341: return arg; lindquist@341: } lindquist@341: lindquist@341: void print(TypeInfo ti, void* arg) lindquist@341: { lindquist@341: if (ti == typeid(byte)) lindquist@341: printf("%d", *cast(byte*)arg); lindquist@341: else if (ti == typeid(short)) lindquist@341: printf("%d", *cast(short*)arg); lindquist@341: else if (ti == typeid(int)) lindquist@341: printf("%d", *cast(int*)arg); lindquist@341: else if (ti == typeid(long)) lindquist@341: printf("%lld", *cast(long*)arg); lindquist@341: lindquist@341: else if (ti == typeid(ubyte)) lindquist@341: printf("%u", *cast(ubyte*)arg); lindquist@341: else if (ti == typeid(ushort)) lindquist@341: printf("%u", *cast(ushort*)arg); lindquist@341: else if (ti == typeid(uint)) lindquist@341: printf("%u", *cast(uint*)arg); lindquist@341: else if (ti == typeid(ulong)) lindquist@341: printf("%llu", *cast(ulong*)arg); lindquist@341: lindquist@341: else if (ti == typeid(float)) lindquist@341: printf("%f", *cast(float*)arg); lindquist@341: else if (ti == typeid(double)) lindquist@341: printf("%f", *cast(double*)arg); lindquist@341: else if (ti == typeid(real)) // FIXME: 80bit? lindquist@341: { lindquist@341: version(LLVM_X86_FP80) lindquist@341: printf("%llf", *cast(real*)arg); lindquist@341: else lindquist@341: printf("%f", *cast(real*)arg); lindquist@341: } lindquist@341: lindquist@341: else if (ti == typeid(char)) lindquist@341: printf("%.*s", 1, arg); lindquist@341: else if (ti == typeid(wchar)) lindquist@341: printf("%.*s", 2, arg); lindquist@341: else if (ti == typeid(dchar)) lindquist@341: printf("%.*s", 4, arg); lindquist@341: lindquist@341: else if (ti == typeid(char[])) lindquist@341: { lindquist@341: char[] str = *cast(char[]*)arg; lindquist@341: printf("%.*s", str.length, str.ptr); lindquist@341: } lindquist@341: else if (ti == typeid(wchar[])) lindquist@341: { lindquist@341: wchar[] str = *cast(wchar[]*)arg; lindquist@341: printf("%.*s", str.length*2, str.ptr); lindquist@341: } lindquist@341: else if (ti == typeid(dchar[])) lindquist@341: { lindquist@341: dchar[] str = *cast(dchar[]*)arg; lindquist@341: printf("%.*s", str.length*4, str.ptr); lindquist@341: } lindquist@341: lindquist@341: else if (auto pti = cast(TypeInfo_Pointer)ti) lindquist@341: { lindquist@341: printf("%p", *cast(void**)arg); lindquist@341: } lindquist@341: lindquist@341: else if (auto sti = cast(TypeInfo_Struct)ti) lindquist@341: { lindquist@341: if (sti.xtoString !is null) lindquist@341: { lindquist@341: char[] str = sti.xtoString(arg); lindquist@341: printf("%.*s", str.length, str.ptr); lindquist@341: } lindquist@341: else lindquist@341: { lindquist@341: char[] str = sti.toString(); lindquist@341: printf("%.*s", str.length, str.ptr); lindquist@341: } lindquist@341: } lindquist@341: lindquist@341: else if (auto ati = cast(TypeInfo_Array)ti) lindquist@341: { lindquist@341: auto tnext = ati.next; lindquist@341: size_t len = *cast(size_t*)arg; lindquist@341: void* ptr = *(cast(void**)arg + 1); lindquist@341: printf("["); lindquist@341: for(auto i=0; i