7 #if defined(__GNUC__) || defined(__WATCOMC__) || defined(__WIN32__)
14 #if defined(__unix__) || defined(__APPLE__)
21 #if defined(__WIN32__)
22 #define WIN32_LEAN_AND_MEAN
32 typedef unsigned char byte;
33 typedef unsigned short uint16;
34 typedef unsigned int uint;
35 typedef unsigned int FileSize;
36 typedef unsigned long long uint64;
41 #define null ((void *)0)
43 #define MAX_LOCATION 797
44 #define MAX_FILENAME 274
45 #define MAX_EXTENSION 17
47 void __ecereNameSpace__ecere__com__eSystem_Delete(void * memory);
48 void * __ecereNameSpace__ecere__com__eSystem_New0(unsigned int size);
49 void * __ecereNameSpace__ecere__com__eSystem_Renew(void * memory, unsigned int size);
50 void * __ecereNameSpace__ecere__com__eSystem_Renew0(void * memory, unsigned int size);
51 unsigned short * __ecereNameSpace__ecere__sys__UTF8toUTF16(char * source, int * wordCount);
52 unsigned short * __ecereNameSpace__ecere__sys__UTF8toUTF16Buffer(char * source, uint16 * dest, int max);
53 char * __ecereNameSpace__ecere__sys__UTF16toUTF8(uint16 * source);
54 char * __ecereNameSpace__ecere__sys__UTF16toUTF8Buffer(uint16 * source, byte * dest, int max);
56 #define eSystem_Delete __ecereNameSpace__ecere__com__eSystem_Delete
57 #define eSystem_New0 __ecereNameSpace__ecere__com__eSystem_New0
58 #define eSystem_Renew __ecereNameSpace__ecere__com__eSystem_Renew
59 #define eSystem_Renew0 __ecereNameSpace__ecere__com__eSystem_Renew0
60 #define UTF8toUTF16 __ecereNameSpace__ecere__sys__UTF8toUTF16
61 #define UTF8toUTF16Buffer __ecereNameSpace__ecere__sys__UTF8toUTF16Buffer
62 #define UTF16toUTF8 __ecereNameSpace__ecere__sys__UTF16toUTF8
63 #define UTF16toUTF8Buffer __ecereNameSpace__ecere__sys__UTF16toUTF8Buffer
66 static char exeLocation[MAX_LOCATION];
69 int __ecereNameSpace__ecere__sys__Tokenize(char * string, int maxTokens, char* tokens[], bool escapeBackSlashes);
70 char * __ecereNameSpace__ecere__sys__RSearchString(char * buffer, char * subStr, int maxLen, bool matchCase, bool matchWord);
71 char * __ecereNameSpace__ecere__sys__GetLastDirectory(char * string, char * output);
72 char * __ecereNameSpace__ecere__sys__PathCat(char * string, char * addedPath);
73 char * __ecereNameSpace__ecere__sys__GetExtension(char * string, char * output);
75 #define Tokenize __ecereNameSpace__ecere__sys__Tokenize
76 #define RSearchString __ecereNameSpace__ecere__sys__RSearchString
77 #define GetLastDirectory __ecereNameSpace__ecere__sys__GetLastDirectory
78 #define PathCat __ecereNameSpace__ecere__sys__PathCat
79 #define GetExtension __ecereNameSpace__ecere__sys__GetExtension
81 extern struct __ecereNameSpace__ecere__com__Instance * __thisModule;
83 typedef enum { unknown, win32, tux, apple } Platform;
85 #if defined(__WIN32__)
86 Platform runtimePlatform = win32;
87 #elif defined(__APPLE__)
88 Platform runtimePlatform = apple;
89 #elif defined(__linux__)
90 Platform runtimePlatform = tux;
92 Platform runtimePlatform = unknown;
95 bool Instance_LocateModule(char * name, char * fileName)
97 #if defined(__WIN32__)
98 HMODULE hModule = null;
101 uint16 _wmoduleName[MAX_LOCATION];
102 UTF8toUTF16Buffer(name, _wmoduleName, MAX_LOCATION);
103 hModule = GetModuleHandle(_wmoduleName);
106 wcscat(_wmoduleName, L".exe");
107 hModule = GetModuleHandle(_wmoduleName);
111 uint16 _wfileName[MAX_LOCATION];
112 GetModuleFileNameW(hModule, _wfileName, MAX_LOCATION);
113 UTF16toUTF8Buffer(_wfileName, (byte *)fileName, MAX_LOCATION);
119 uint16 _wfileName[MAX_LOCATION];
120 GetModuleFileNameW(null, _wfileName, MAX_LOCATION);
121 UTF16toUTF8Buffer(_wfileName, (byte *)fileName, MAX_LOCATION);
124 #elif defined(__APPLE__)
127 int imageCount = _dyld_image_count();
129 int nameLen = strlen(name);
130 for(c = 0; c<imageCount; c++)
132 struct mach_header * header = _dyld_get_image_header(c);
133 char * path = _dyld_get_image_name(c);
134 int pathLen = strlen(path);
135 char * subStr = RSearchString(path, name, pathLen, false, false);
138 if(( *(subStr-1) == '/' || !strncmp(subStr - 4, "/lib", 4)) &&
139 (!subStr[nameLen] || !strncmp(subStr + nameLen, ".dylib", 6)))
141 strcpy(fileName, path);
149 int size = MAX_LOCATION;
150 _NSGetExecutablePath(fileName, &size);
153 #elif defined(__unix__)
154 //File f = FileOpen("/proc/self/maps", read);
156 char exeName[MAX_FILENAME];
158 #if defined(__linux__)
159 f = fopen("/proc/self/status", "r");
161 f = fopen("/proc/curproc/status", "r");
166 while(fgets(line, sizeof(line), f))
168 char * name = strstr(line, "Name:\t");
173 nameLen = strlen(name);
175 strcpy(exeName, name);
181 #if defined(__linux__)
182 f = fopen("/proc/self/maps", "r");
184 f = fopen("/proc/curproc/map", "r");
189 //while(f.GetLine(line, sizeof(line)))
190 while(fgets(line, sizeof(line), f))
192 char * path = strstr(line, "/");
195 int pathLen = strlen(path);
199 int nameLen = strlen(name);
201 subStr = RSearchString(path, name, pathLen, false, false);
204 if(( *(subStr-1) == '/' || !strncmp(subStr - 4, "/lib", 4)) &&
205 (!subStr[nameLen] || !strncmp(subStr + nameLen, ".so", 3)))
207 char * space = strchr(path, ' ');
208 if(space) *space = 0;
209 strcpy(fileName, path);
217 char name[MAX_FILENAME];
218 GetLastDirectory(path, name);
219 if(!exeName[0] || !strcmp(name, exeName))
221 char * space = strchr(path, ' ');
222 if(space) *space = 0;
223 strcpy(fileName, path);
232 if(!name || !name[0])
234 strcpy(fileName, exeLocation);
241 void Instance_COM_Initialize(int argc, char ** argv, char ** parsedCommand, int * argcPtr, char *** argvPtr)
243 #if !defined(__WIN32__)
244 // Disable stdout buffering on Unix
245 setvbuf(stdout, null, _IONBF, 0);
247 #if defined(__WIN32__)
248 *parsedCommand = UTF16toUTF8(GetCommandLineW());
249 *argvPtr = eSystem_New0(sizeof(char *) * 512);
250 *argcPtr = Tokenize(*parsedCommand, 512,(void*)(char **)(*argvPtr), false);
255 #if defined(__unix__)
256 if(!__thisModule && argv)
258 getcwd(exeLocation, MAX_LOCATION);
259 PathCat(exeLocation, argv[0]);
264 void * Instance_Module_Load(char * name, void ** Load, void ** Unload)
266 char fileName[MAX_LOCATION];
267 char extension[MAX_EXTENSION];
268 void * library = null;
273 #if defined(__WIN32__)
274 strcpy(fileName, name);
275 GetExtension(fileName, extension);
277 strcat(fileName, ".dll");
280 uint16 _wfileName[MAX_LOCATION];
281 UTF8toUTF16Buffer(fileName, _wfileName, MAX_LOCATION);
282 library = LoadLibraryW(_wfileName);
286 *Load = (void *)GetProcAddress(library, "__ecereDll_Load@4");
287 *Unload = (void *)GetProcAddress(library, "__ecereDll_Unload@4");
289 FreeLibrary(library);
291 #elif defined(__unix__) || defined(__APPLE__)
292 #if defined(__ANDROID__)
293 sprintf(fileName, "/data/data/com.ecere.%s/lib/lib", name);
295 strcpy(fileName, "lib");
297 strcat(fileName, name);
298 GetExtension(fileName, extension);
300 #if defined(__APPLE__)
301 strcat(fileName, ".dylib");
303 strcat(fileName, ".so");
306 library = dlopen(fileName, RTLD_LAZY);
309 #ifdef DEB_HOST_MULTIARCH
310 strcpy(fileName, DEB_HOST_MULTIARCH);
311 strcat(fileName, "/ec/lib");
313 strcpy(fileName, "/usr/lib/ec/lib");
315 strcat(fileName, name);
316 GetExtension(fileName, extension);
318 #if defined(__APPLE__)
319 strcat(fileName, ".dylib");
321 strcat(fileName, ".so");
323 library = dlopen(fileName, RTLD_LAZY);
328 *Load = dlsym(library, "__ecereDll_Load");
329 *Unload = dlsym(library, "__ecereDll_Unload");
333 #elif defined(__APPLE__)
334 strcpy(fileName, "lib");
335 strcat(fileName, name);
336 GetExtension(fileName, extension);
338 strcat(fileName, ".dylib");
340 NSObjectFileImage *fileImage;
341 NSObjectFileImageReturnCode returnCode = NSCreateObjectFileImageFromFile(fileName, &fileImage);
343 if(returnCode == NSObjectFileImageSuccess)
345 printf("NSObjectFileImageSuccess!\n");
346 library = NSLinkModule(fileImage,fileName,
347 NSLINKMODULE_OPTION_RETURN_ON_ERROR
348 | NSLINKMODULE_OPTION_PRIVATE);
349 // NSDestroyObjectFileImage(fileImage);
352 *Load = NSAddressOfSymbol(NSLookupSymbolInModule(library, "__ecereDll_Load"));
353 *Unload = NSAddressOfSymbol(NSLookupSymbolInModule(library, "__ecereDll_Unload"));
356 NSUnLinkModule(library, 0);
359 printf("Found Load!\n");
363 printf("No Success :(\n");
369 void Instance_Module_Free(void * library)
371 #if defined(__WIN32__)
373 FreeLibrary(library);
374 #elif defined(__unix__) || defined(__APPLE__)