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 }