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 }