1 module derelict.angelscript.ascpp;
2 import derelict.angelscript.types;
3 
4 private {
5 	import core.stdc.config;
6 	import std.stdio;
7 	import derelict.util.loader;
8 	import derelict.util.system;
9 
10 	static if(Derelict_OS_Windows)
11 		enum libNames = "angelscript.dll";
12 	else static if(Derelict_OS_Mac)
13 		enum libNames = "libangelscript.dylib";
14 	else static if(Derelict_OS_Posix)
15 		enum libNames = "libangelscript.so,/usr/local/lib/libangelscript.so";
16 	else
17 		static assert(0, "Need to implement libangelscript libnames for this operating system.");
18 
19 	//Redfine the vtypes here, else it doesn't compile
20 	alias asBYTE = ubyte;
21 	alias asWORD = ushort;
22 	alias asUINT = uint;
23 	alias asPWORD = size_t;
24 	static if ((void*).sizeof == long.sizeof) {
25 		alias asDWORD = uint;
26 		alias asQWORD = ulong;
27 		alias asINT64 = long;
28 	} else {
29 		alias asDWORD = ulong;
30 		// TODO: Implement __GNUC__/__MWERKS__ from angelscript_c.h
31 		// TODO: Implement else part of that.
32 	}
33 }
34 
35 extern (C) @nogc nothrow {
36 	// engine
37 	alias da_asCreateScriptEngine = asIScriptEngine* function(asDWORD);
38 	alias da_asGetLibraryVersion = const(char*) function();
39 	alias da_asGetLibraryOptions = const(char*) function();
40 
41 	// context
42 	alias da_asGetActiveContext = asIScriptContext* function();
43 
44 	// threading
45 	alias da_asPrepareMultithread = int function(asIThreadManager*);
46 	alias da_asUnprepareMultithread = void function();
47 	alias da_asGetThreadManager = asIThreadManager* function();
48 	alias da_asAcquireExclusiveLock = void function();
49 	alias da_asReleaseExclusiveLock = void function();
50 	alias da_asAcquireSharedLock = void function();
51 	alias da_asReleaseSharedLock = void function();
52 	alias da_asAtomicInc = int function(ref int);
53 	alias da_asAtomicDec = int function(ref int);
54 	alias da_asThreadCleanup = int function();
55 
56 	// memory managment
57 	alias da_asSetGlobalMemoryFunctions = int function(asALLOCFUNC_t, asFREEFUNC_t);
58 	alias da_asResetGlobalMemoryFunctions = int function();
59 	alias da_asAllocMem = void* function(size_t);
60 	alias da_asFreeMem = void function(void*);
61 
62 	// aux
63 	alias da_asCreateLockableSharedBool = asILockableSharedBool* function();
64 }
65 
66 __gshared {
67 	da_asCreateScriptEngine asCreateScriptEngine;
68 	da_asGetLibraryVersion asGetLibraryVersion;
69 	da_asGetLibraryOptions asGetLibraryOptions;
70 
71 	da_asGetActiveContext asGetActiveContext;
72 
73 	da_asPrepareMultithread asPrepareMultithread;
74 	da_asUnprepareMultithread asUnprepareMultithread;
75 	da_asGetThreadManager asGetThreadManager;
76 	da_asAcquireExclusiveLock asAcquireExclusiveLock;
77 	da_asReleaseExclusiveLock asReleaseExclusiveLock;
78 	da_asAcquireSharedLock asAcquireSharedLock;
79 	da_asReleaseSharedLock asReleaseSharedLock;
80 	da_asAtomicInc asAtomicInc;
81 	da_asAtomicDec asAtomicDec;
82 	da_asThreadCleanup asThreadCleanup;
83 
84 	da_asSetGlobalMemoryFunctions asSetGlobalMemoryFunctions;
85 	da_asResetGlobalMemoryFunctions asResetGlobalMemoryFunctions;
86 	da_asAllocMem asAllocMem;
87 	da_asFreeMem asFreeMem;
88 
89 	da_asCreateLockableSharedBool asCreateLockableSharedBool;
90 }
91 
92 public class DerelictAngelscriptCPPLoader : SharedLibLoader {
93 	public this() {
94 		super(libNames);
95 	}
96 
97 	public this(string names) {
98 		super(names);
99 	}
100 
101 	protected override void loadSymbols() {
102 		bindFunc(cast(void**)&asCreateScriptEngine, "asCreateScriptEngine");
103 		bindFunc(cast(void**)&asGetLibraryVersion, "asGetLibraryVersion");
104 		bindFunc(cast(void**)&asGetLibraryOptions, "asGetLibraryOptions");
105 		bindFunc(cast(void**)&asGetActiveContext, "asGetActiveContext");
106 		bindFunc(cast(void**)&asPrepareMultithread, "asPrepareMultithread");
107 		bindFunc(cast(void**)&asUnprepareMultithread, "asUnprepareMultithread");
108 		bindFunc(cast(void**)&asGetThreadManager, "asGetThreadManager");
109 		bindFunc(cast(void**)&asAcquireExclusiveLock, "asAcquireExclusiveLock");
110 		bindFunc(cast(void**)&asReleaseExclusiveLock, "asReleaseExclusiveLock");
111 		bindFunc(cast(void**)&asAcquireSharedLock, "asAcquireSharedLock");
112 		bindFunc(cast(void**)&asReleaseSharedLock, "asReleaseSharedLock");
113 		bindFunc(cast(void**)&asAtomicInc, "asAtomicInc");
114 		bindFunc(cast(void**)&asAtomicDec, "asAtomicDec");
115 		bindFunc(cast(void**)&asThreadCleanup, "asThreadCleanup");
116 		bindFunc(cast(void**)&asSetGlobalMemoryFunctions, "asSetGlobalMemoryFunctions");
117 		bindFunc(cast(void**)&asResetGlobalMemoryFunctions, "asResetGlobalMemoryFunctions");
118 		bindFunc(cast(void**)&asAllocMem, "asAllocMem");
119 		bindFunc(cast(void**)&asFreeMem, "asFreeMem");
120 		bindFunc(cast(void**)&asCreateLockableSharedBool, "asCreateLockableSharedBool");
121 	}
122 }
123 
124 __gshared DerelictAngelscriptCPPLoader DerelictAngelscriptCPP;
125 
126 shared static this() {
127 	DerelictAngelscriptCPP = new DerelictAngelscriptCPPLoader();
128 }