1 // License: Public Domain 2 3 module wcharutil; 4 5 import std.conv : to; 6 import std.traits : isSomeChar, isStaticArray, isArray; 7 8 wchar[] toWString(S)(in S s) 9 if ((is(S C : C[]) || is(S C : C*)) && isSomeChar!C) 10 { 11 static if (!isStaticArray!S) 12 if (s is null) 13 return null; 14 size_t p; 15 static if (isArray!S) 16 p = s.length; 17 else 18 for (; s[p]; p++) {} 19 return s[0..p].to!(wchar[]); 20 } 21 22 unittest 23 { 24 import std.typetuple; 25 26 foreach (C; TypeTuple!(char, wchar, dchar)) 27 { 28 C[5] s; 29 s[] = '\0'; 30 assert(toWString(s) == "\0\0\0\0\0"w); 31 assert(toWString(s.ptr) == ""w); 32 s = "123\0" ~ "4"; 33 assert(toWString(s) == "123\0"w ~ "4"w); 34 assert(toWString(s.ptr) == "123"w); 35 s = "abcde"; 36 assert(toWString(s) == "abcde"w); 37 s = "abcd\0"; 38 assert(toWString(s.ptr) == "abcd"w); 39 40 immutable(C)[] s1 = null; 41 assert(toWString(s1) is null); 42 43 immutable(C)[] s2 = "abc"; 44 assert(toWString(s2) == "abc"w); 45 assert(toWString(s2.ptr) == "abc"w); 46 47 immutable(C)[] s3 = "абвгд"; 48 assert(toWString(s3) == "абвгд"w); 49 assert(toWString(s3.ptr) == "абвгд"w); 50 } 51 } 52 53 const(wchar)* toWStringz(S)(in S s) 54 if ((is(S C : C[]) || is(S C : C*)) && isSomeChar!C) 55 { 56 static if (!isStaticArray!S) 57 if (s is null) 58 return null; 59 size_t p; 60 static if (isArray!S) 61 for (; p < s.length && s[p]; p++) {} 62 else 63 for (; s[p]; p++) {} 64 wchar[] r = s[0..p].to!(wchar[]) ~ '\0'; 65 return r.ptr; 66 } 67 68 unittest 69 { 70 import std.typetuple; 71 72 foreach (C; TypeTuple!(char, wchar, dchar)) 73 { 74 C[5] s; 75 s[] = '\0'; 76 assert(toWStringz(s)[0] == '\0'); 77 assert(toWStringz(s.ptr)[0] == '\0'); 78 s = "123\0\0"; 79 assert(toWStringz(s)[0..4] == "123\0"w); 80 assert(toWStringz(s.ptr)[0..4] == "123\0"w); 81 82 s = "abcde"; 83 assert(toWStringz(s)[0..6] == "abcde\0"w); 84 s = "abcd\0"; 85 assert(toWStringz(s.ptr)[0..5] == "abcd\0"w); 86 87 immutable(C)[] s1 = null; 88 assert(toWStringz(s1) is null); 89 90 immutable(C)[] s2 = "abc"; 91 assert(toWStringz(s2)[0..4] == "abc\0"w); 92 assert(toWStringz(s2.ptr)[0..4] == "abc\0"w); 93 94 immutable(C)[] s3 = "абвгд"; 95 assert(toWStringz(s3)[0..6] == "абвгд\0"w); 96 assert(toWStringz(s3.ptr)[0..6] == "абвгд\0"w); 97 } 98 }