1 module derelict.angelscript.asc;
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 = "as_c.dll";
12 	else static if(Derelict_OS_Mac)
13 		enum libNames = "libas_c.dylib";
14 	else static if(Derelict_OS_Posix)
15 		enum libNames = "libas_c.so,/usr/local/lib/libas_c.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 	// --- script engine
37 
38 	// memory managment
39 	alias da_asEngine_AddRef = int function(asIScriptEngine*);
40 	alias da_asEngine_Release = int function(asIScriptEngine*);
41 	alias da_asEngine_ShutDownAndRelease = int function(asIScriptEngine*);
42 
43 	// engine properties
44 	alias da_asEngine_SetEngineProperty = int function(asIScriptEngine*, asEEngineProp, asPWORD);
45 	alias da_asEngine_GetEngineProperty = asPWORD function(asIScriptEngine*, asEEngineProp);
46 
47 	// compiler messages
48 	alias da_asEngine_SetMessageCallback = int function(asIScriptEngine*, asFUNCTION_t, void*, asDWORD);
49 	alias da_asEngine_ClearMessageCallback = int function(asIScriptEngine*);
50 	alias da_asEngine_WriteMessage = int function(asIScriptEngine*, const(char*), int, int, asEMsgType, const(char*));
51 
52 	// jit compiler
53 	alias da_asEngine_SetJITCompiler = int function(asIScriptEngine*, asIJITCompiler*);
54 	alias da_asEngine_GetJITCompiler = asIJITCompiler* function(asIScriptEngine*);
55 
56 	// global functions
57 	alias da_asEngine_RegisterGlobalFunction = int function(asIScriptEngine*, const(char*), asFUNCTION_t, asDWORD, void*);
58 	alias da_asEngine_GetGlobalFunctionCount = asUINT function(asIScriptEngine*);
59 	alias da_asEngine_GetGlobalFunctionByIndex = asIScriptFunction* function(asIScriptEngine*, asUINT);
60 	alias da_asEngine_GetGlobalFunctionByDecl = asIScriptFunction* function(asIScriptEngine*, const(char*));
61 
62 	alias da_asEngine_CreateContext = asIScriptContext* function(asIScriptEngine*);
63 	alias da_asEngine_GetModule = asIScriptModule* function(asIScriptEngine*, const(char*));
64 
65 	alias da_asContext_Release = int function(asIScriptContext*);
66 	alias da_asContext_Prepare = int function(asIScriptContext*, asIScriptFunction*);
67 	alias da_asContext_Execute = int function(asIScriptContext*);
68 	
69 	alias da_asModule_Release = int function(asIScriptModule*);
70 	alias da_asModule_GetFunctionByDecl = asIScriptFunction* function(asIScriptModule*, const(char*));
71 
72 	alias da_asScript_Release = int function(asIScriptFunction*);
73 	//alias da_asEngine_ExecuteString()
74 
75 	// global properties
76 	/*
77 		TODO: Define all functions
78 	alias da_asEngine_ = int function(asIScriptEngine*,);
79 	alias da_asEngine_ = asUINT function(asIScriptEngine*,);
80 	alias da_asEngine_ = int function(asIScriptEngine*,);
81 	alias da_asEngine_ = int function(asIScriptEngine*,);
82 	alias da_asEngine_ = int function(asIScriptEngine*,);
83 
84 
85 	alias da_asEngine_ = int function(asIScriptEngine*,);
86 
87 
88 
89 	alias da_as = void function();*/
90 }
91 
92 __gshared {
93 	da_asEngine_AddRef asEngine_AddRef;
94 	da_asEngine_Release asEngine_Release;
95 	da_asEngine_ShutDownAndRelease asEngine_ShutDownAndRelease;
96 
97 	da_asEngine_SetEngineProperty asEngine_SetEngineProperty;
98 	da_asEngine_GetEngineProperty asEngine_GetEngineProperty;
99 
100 	da_asEngine_SetMessageCallback asEngine_SetMessageCallback;
101 	da_asEngine_ClearMessageCallback asEngine_ClearMessageCallback;
102 	da_asEngine_WriteMessage asEngine_WriteMessage;
103 
104 	da_asEngine_SetJITCompiler asEngine_SetJITCompiler;
105 	da_asEngine_GetJITCompiler asEngine_GetJITCompiler;
106 
107 	da_asEngine_RegisterGlobalFunction asEngine_RegisterGlobalFunction;
108 	da_asEngine_GetGlobalFunctionCount asEngine_GetGlobalFunctionCount;
109 	da_asEngine_GetGlobalFunctionByIndex asEngine_GetGlobalFunctionByIndex;
110 	da_asEngine_GetGlobalFunctionByDecl asEngine_GetGlobalFunctionByDecl;
111 
112 	da_asEngine_CreateContext asEngine_CreateContext;
113 	da_asEngine_GetModule asEngine_GetModule;
114 
115 	da_asContext_Release asContext_Release;
116 	da_asContext_Prepare asContext_Prepare;
117 	da_asContext_Execute asContext_Execute;
118 
119 	da_asModule_GetFunctionByDecl asModule_GetFunctionByDecl;
120 }
121 
122 public class DerelictAngelscriptCLoader : SharedLibLoader {
123 	public this() {
124 		super(libNames);
125 	}
126 
127 	public this(string names) {
128 		super(names);
129 	}
130 
131 	protected override void loadSymbols() {
132 		bindFunc(cast(void**)&asEngine_AddRef, "asEngine_AddRef");
133 		bindFunc(cast(void**)&asEngine_Release, "asEngine_Release");
134 		bindFunc(cast(void**)&asEngine_ShutDownAndRelease, "asEngine_ShutDownAndRelease");
135 		bindFunc(cast(void**)&asEngine_SetEngineProperty, "asEngine_SetEngineProperty");
136 		bindFunc(cast(void**)&asEngine_GetEngineProperty, "asEngine_GetEngineProperty");
137 		bindFunc(cast(void**)&asEngine_SetMessageCallback, "asEngine_SetMessageCallback");
138 		bindFunc(cast(void**)&asEngine_ClearMessageCallback, "asEngine_ClearMessageCallback");
139 		bindFunc(cast(void**)&asEngine_WriteMessage, "asEngine_WriteMessage");
140 		bindFunc(cast(void**)&asEngine_SetJITCompiler, "asEngine_SetJITCompiler");
141 		bindFunc(cast(void**)&asEngine_GetJITCompiler, "asEngine_GetJITCompiler");
142 		bindFunc(cast(void**)&asEngine_RegisterGlobalFunction, "asEngine_RegisterGlobalFunction");
143 		bindFunc(cast(void**)&asEngine_GetGlobalFunctionCount, "asEngine_GetGlobalFunctionCount");
144 		bindFunc(cast(void**)&asEngine_GetGlobalFunctionByIndex, "asEngine_GetGlobalFunctionByIndex");
145 		bindFunc(cast(void**)&asEngine_GetGlobalFunctionByDecl, "asEngine_GetGlobalFunctionByDecl");
146 
147 		bindFunc(cast(void**)&asEngine_CreateContext, "asEngine_CreateContext");
148 		bindFunc(cast(void**)&asEngine_GetModule, "asEngine_GetModule");
149 
150 		bindFunc(cast(void**)&asContext_Release, "asContext_Release");
151 		bindFunc(cast(void**)&asContext_Prepare, "asContext_Prepare");
152 		bindFunc(cast(void**)&asContext_Execute, "asContext_Execute");
153 
154 		bindFunc(cast(void**)&asModule_GetFunctionByDecl, "asModule_GetFunctionByDecl");
155 	}
156 }
157 
158 __gshared DerelictAngelscriptCLoader DerelictAngelscriptC;
159 
160 shared static this() {
161 	DerelictAngelscriptC = new DerelictAngelscriptCLoader();
162 }