1 module m3.File;
2 
3 private:
4 
5 static import m3.m3;
6 
7 enum char[1] READ = "r";
8 enum char[1] WRITE = "w";
9 enum char[2] READ_BINARY = "rb";
10 enum char[2] WRITE_BINARY = "wb";
11 
12 public:
13 
14 @nogc
15 char[] read(const string filename) nothrow {
16     import std.c.stdio : FILE, SEEK_END, SEEK_SET, fopen, fclose, fseek, ftell, fread;
17 
18     FILE* f = fopen(filename.ptr, READ_BINARY);
19     assert(f, "File can not be opened.");
20     scope(exit) fclose(f);
21     
22     fseek(f, 0, SEEK_END);
23     immutable size_t fsize = ftell(f);
24     fseek(f, 0, SEEK_SET);
25 
26     char[] str = m3.m3.make!(char[])(fsize);
27     if (str.length)
28         fread(str.ptr, fsize, 1, f);
29 
30     return str;
31 }
32 
33 @nogc
34 void write(T)(const string filename, const T[] content) nothrow {
35     import std.c.stdio : FILE, fopen, fclose, fwrite;
36 
37     FILE* f = fopen(filename.ptr, WRITE_BINARY);
38     assert(f, "File can not be opened.");
39     scope(exit) fclose(f);
40     
41     enum size_t size = m3.m3.SizeOf!(U);
42     fwrite(content.ptr, size, content.length * size, f);
43 }
44 
45 @nogc
46 @property
47 wchar[] toUTF16(const char[] s) {
48     wchar[] r = m3.m3.make!(wchar[])(s.length); // r will never be longer than s
49     if (!r.length)
50         return null;
51 
52     foreach (immutable size_t i, wchar c; s) {
53         r[i] = c;
54     }
55 
56     return r;
57 }
58 
59 @nogc
60 @property
61 dchar[] toUTF32(const char[] s) {
62     dchar[] r = m3.m3.make!(dchar[])(s.length); // r will never be longer than s
63     if (!r.length)
64         return null;
65     
66     foreach (immutable size_t i, dchar c; s) {
67         r[i] = c;
68     }
69 
70     return r;
71 }
72 
73 @nogc
74 unittest {
75     char[] str = read("test_file.txt");
76     scope(exit) m3.m3.destruct(str);
77 
78     dchar[] str2 = str.toUTF32;
79     wchar[] str3 = str.toUTF16;
80 
81     scope(exit) m3.m3.destruct(str2);
82     scope(exit) m3.m3.destruct(str3);
83 
84     assert(195 == cast(int) str[0]);
85     assert(228 == cast(int) str2[0]);
86     assert(228 == cast(int) str3[0]);
87 
88     assert(char.sizeof == 1);
89     assert(wchar.sizeof == 2);
90     assert(dchar.sizeof == 4);
91 }