1 module mutils.plugin.load_lib;
2 
3 alias void* SharedLibHandle;
4 
5 import core.stdc.string;
6 
7 char[256] charBuffer;
8 
9 version(Posix) {
10 	import core.sys.posix.dlfcn;
11 	SharedLibHandle LoadSharedLib(string libName)  nothrow @nogc
12 	{
13 		assert(libName.length<charBuffer.length);
14 		charBuffer[libName.length]='\0';
15 		charBuffer[0..libName.length]=libName[0..libName.length];
16 		return dlopen(charBuffer.ptr, RTLD_LOCAL | RTLD_NOW);
17 	}
18 	
19 	void UnloadSharedLib(SharedLibHandle hlib)  nothrow @nogc
20 	{
21 		dlclose(hlib);
22 	}
23 	
24 	void* GetSymbol(SharedLibHandle hlib, string symbolName)  nothrow @nogc
25 	{
26 		assert(symbolName.length<charBuffer.length);
27 		charBuffer[symbolName.length]='\0';
28 		charBuffer[0..symbolName.length]=symbolName[0..symbolName.length];
29 		return dlsym(hlib, charBuffer.ptr);
30 	}
31 	
32 	string GetErrorStr() nothrow @nogc
33 	{
34 		
35 		char* err = cast(char*)dlerror();
36 		if(err is null)
37 			return null;
38 		
39 		return cast(string)err[0..strlen(err)];
40 	}
41 	
42 } else version(Windows){
43 	import core.sys.windows.windows;
44 
45 	SharedLibHandle LoadSharedLib(string libName)
46 	{
47 		assert(libName.length<charBuffer.length);
48 		charBuffer[libName.length]='\0';
49 		charBuffer[0..libName.length]=libName[0..libName.length];
50 		return LoadLibraryA(charBuffer.ptr);
51 	}
52 	
53 	void UnloadSharedLib(SharedLibHandle hlib)
54 	{
55 		FreeLibrary(hlib);
56 	}
57 	
58 	void* GetSymbol(SharedLibHandle hlib, string symbolName)
59 	{
60 		assert(symbolName.length<charBuffer.length);
61 		charBuffer[symbolName.length]='\0';
62 		charBuffer[0..symbolName.length]=symbolName[0..symbolName.length];
63 		return GetProcAddress(hlib, charBuffer.ptr );
64 	}
65 	
66 	string GetErrorStr()
67 	{
68 		import std.windows.syserror;
69 		return sysErrorString(GetLastError());
70 	}
71 
72 }else{
73 	static assert(false, "Platform not supported");
74 }