1 module deimos.xdgbasedir.basedir; 2 3 package { 4 static if( __VERSION__ < 2066 ) enum nogc = 1; 5 } 6 7 struct xdgHandle { 8 void *reserved; 9 }; 10 11 extern(C) @nogc @system nothrow { 12 xdgHandle * xdgInitHandle(xdgHandle *handle); 13 14 void xdgWipeHandle(xdgHandle *handle); 15 int xdgUpdateData(xdgHandle *handle); 16 const(char)* xdgDataHome(xdgHandle *handle); 17 const(char)* xdgConfigHome(xdgHandle *handle); 18 19 const(char*)* xdgDataDirectories(xdgHandle *handle); 20 const(char*)* xdgSearchableDataDirectories(xdgHandle *handle); 21 const(char*)* xdgConfigDirectories(xdgHandle *handle); 22 const(char*)* xdgSearchableConfigDirectories(xdgHandle *handle); 23 const(char)* xdgCacheHome(xdgHandle *handle); 24 const(char)* xdgRuntimeDirectory(xdgHandle *handle); 25 } 26 27 version(XDGBasedirMainTest) 28 { 29 import std.stdio; 30 import std.process : environment; 31 import std.c.string : strlen; 32 33 @system pure inout(char)[] fromCString(inout(char)* cString) { 34 return cString ? cString[0..strlen(cString)] : null; 35 } 36 37 void printDirectories(string message, const(char*)* directories) 38 { 39 writef("%s: ", message); 40 for (; *directories != null; directories++) { 41 writef("%s;", (*directories)[0..strlen(*directories)]); 42 } 43 writeln(); 44 } 45 46 int main(string[] args) 47 { 48 xdgHandle handle; 49 if (!xdgInitHandle(&handle)) { 50 stderr.writeln("Could not initialize xdgHandle"); 51 return -1; 52 } 53 scope(exit) xdgWipeHandle(&handle); 54 55 writeln("xdgDataHome: ", xdgDataHome(&handle).fromCString); 56 writeln("xdgConfigHome: ", xdgConfigHome(&handle).fromCString); 57 58 printDirectories("Data dirs", xdgDataDirectories(&handle)); 59 printDirectories("Searchable data dirs", xdgSearchableDataDirectories(&handle)); 60 61 printDirectories("Config dirs", xdgConfigDirectories(&handle)); 62 printDirectories("Searchable config dirs", xdgSearchableConfigDirectories(&handle)); 63 64 writeln("xdgCacheHome: ", xdgCacheHome(&handle).fromCString); 65 writeln("xdgRuntimeDirectory: ", xdgRuntimeDirectory(&handle).fromCString); 66 67 environment["XDG_CONFIG_HOME"] = "config directory updated via environment"; 68 if (!xdgUpdateData(&handle)) { 69 stderr.writeln("Could not update handle"); 70 } 71 writeln("xdgConfigHome after update: ", xdgConfigHome(&handle).fromCString); 72 73 return 0; 74 } 75 }