From c3af14ae9bbae9e602c795c1548d239c864ded79 Mon Sep 17 00:00:00 2001 From: Markus Gustavsson Date: Thu, 25 Feb 2016 16:38:16 +0100 Subject: [PATCH] Exporting builtins and loading crt manually for carp imports. --- shared/platform.h | 14 ++++++++- shared/shared.h | 79 +++++++++++++++++++++++++++-------------------- shared/types.h | 2 +- 3 files changed, 60 insertions(+), 35 deletions(-) diff --git a/shared/platform.h b/shared/platform.h index b84c15b6..47cd6460 100644 --- a/shared/platform.h +++ b/shared/platform.h @@ -89,6 +89,10 @@ char* carp_get_load_library_error() { return dlerror(); } +void carp_sleep(int millis) { +#error implement me? +} + #endif #if defined(WIN32) @@ -107,6 +111,7 @@ typedef struct module_list { LARGE_INTEGER carp_perf_freq; HMODULE carp_main_module = INVALID_HANDLE_VALUE; +HMODULE carp_msvcrt_module = INVALID_HANDLE_VALUE; module_list_t carp_loaded_modules = NULL; module_list_t new_module_list_node() { @@ -152,12 +157,15 @@ void free_all_modules_and_destroy_module_list(module_list_t lst) { void carp_platform_init() { QueryPerformanceFrequency(&carp_perf_freq); carp_main_module = GetModuleHandle(NULL); + carp_msvcrt_module = LoadLibrary("msvcrt.dll"); carp_loaded_modules = new_module_list_node(); + add_module_to_list(carp_loaded_modules, carp_msvcrt_module); } void carp_platform_shutdown() { - carp_main_module = INVALID_HANDLE_VALUE; free_all_modules_and_destroy_module_list(carp_loaded_modules); + carp_main_module = INVALID_HANDLE_VALUE; + carp_msvcrt_module = INVALID_HANDLE_VALUE; carp_loaded_modules = NULL; } @@ -269,4 +277,8 @@ char* carp_get_load_library_error() { return error_buf; } +void carp_sleep(int millis) { + Sleep(millis); +} + #endif diff --git a/shared/shared.h b/shared/shared.h index 11367a85..e08c3aa3 100644 --- a/shared/shared.h +++ b/shared/shared.h @@ -11,71 +11,78 @@ #include "platform.h" #endif +#ifdef WIN32 +#define EXPORT __declspec(dllexport) +#else +#define EXPORT +#endif + typedef int unknown; typedef void* typevar; typedef void* any; typedef char* string; -int intsqrt(int x) { return (int)sqrt(x); } -float itof(int x) { return (float)x; } +EXPORT int intsqrt(int x) { return (int)sqrt(x); } +EXPORT float itof(int x) { return (float)x; } -#ifndef max -int max(int x, int y) { +#ifdef max +#undef max +EXPORT int max(int x, int y) { return x > y ? x : y; } #endif -string itos(int x) { +EXPORT string itos(int x) { char *s = malloc(sizeof(char) * 32); snprintf(s, 32, "%d", x); return s; } -bool nullQMARK(void *p) { +EXPORT bool nullQMARK(void *p) { return p == NULL; } -bool not(bool x) { +EXPORT bool not(bool x) { return !x; } -void panic(string msg) { +EXPORT void panic(string msg) { printf("Error: %s\n", msg); exit(1); } -void print(string msg) { +EXPORT void print(string msg) { printf("%s", msg); } -void println(string msg) { +EXPORT void println(string msg) { printf("%s\n", msg); } -int* fake() { +EXPORT int* fake() { return (int*)123; } -void fake2(string *s) { +EXPORT void fake2(string *s) { } -void eat_string(char *s) { +EXPORT void eat_string(char *s) { free(s); } -void eat_void(void *nothing) { +EXPORT void eat_void(void *nothing) { // nothing! } -char *string_copy(char *s) { +EXPORT char *string_copy(char *s) { return strdup(s); } -char *string_append(char *s1, char *s2) { +EXPORT char *string_append(char *s1, char *s2) { char *new_str = malloc(strlen(s1) + strlen(s2) + 1); new_str[0] = '\0'; strcat(new_str, s1); @@ -83,14 +90,14 @@ char *string_append(char *s1, char *s2) { return new_str; } -bool file_existsQMARK(char *filename) { +EXPORT bool file_existsQMARK(char *filename) { FILE *f = fopen(filename, "r"); return f != NULL; } typedef string* string_array; -string_array string_array_new(int size) { +EXPORT string_array string_array_new(int size) { string_array a = calloc(size + 1, sizeof(string)); for(int i = 0; i < size; i++) { a[i] = strdup(""); @@ -98,7 +105,7 @@ string_array string_array_new(int size) { return a; } -int string_array_count(string_array array) { +EXPORT int string_array_count(string_array array) { int i = 0; string_array p = array; while(*p) { @@ -108,18 +115,18 @@ int string_array_count(string_array array) { return i; } -string string_array_get(string_array array, int pos) { +EXPORT string string_array_get(string_array array, int pos) { return strdup(array[pos]); } -string_array string_array_set(string_array array, int pos, string new_value) { +EXPORT string_array string_array_set(string_array array, int pos, string new_value) { array[pos] = strdup(new_value); return array; } typedef string (*string_to_string_fn)(string); -string_array string_array_map(string_to_string_fn f, string_array array) { +EXPORT string_array string_array_map(string_to_string_fn f, string_array array) { string_array p = array; while(*p) { string old_string = *p; @@ -130,17 +137,17 @@ string_array string_array_map(string_to_string_fn f, string_array array) { return array; } -int inc(x) { return x + 1; } -int dec(x) { return x - 1; } +EXPORT int inc(x) { return x + 1; } +EXPORT int dec(x) { return x - 1; } -void async(void *f) { +EXPORT void async(void *f) { printf("Async starting.\n"); carp_thread_t th = carp_thread_create(f, "Async"); carp_thread_destroy(th); printf("Async done.\n"); } -int last_index_of(string s, char c) { +EXPORT int last_index_of(string s, char c) { int len = (int)strlen(s); for(int i = len - 1; i >= 0; i--) { if(s[i] == c) { @@ -150,7 +157,7 @@ int last_index_of(string s, char c) { return -1; } -string substring(string s, int index) { +EXPORT string substring(string s, int index) { if(index >= strlen(s)) { panic("substring out of bounds"); } @@ -158,32 +165,38 @@ string substring(string s, int index) { return strdup(sub); } -string file_path_component(string s) { +EXPORT string file_path_component(string s) { int i = last_index_of(s, '/'); return substring(s, i + 1); } -string get_input() { +EXPORT string get_input() { char in[1024]; fgets(in, 1024, stdin); return strdup(in); } -void call(void *f()) { +EXPORT void call(void *f()) { f(); } -void call1(void *f(int)) { +EXPORT void call1(void *f(int)) { f(1); } -void calls(void *f(char*)) { +EXPORT void calls(void *f(char*)) { f("hejsan"); } -void printret(int (*f)()) { +EXPORT void printret(int (*f)()) { int x = f(); printf("ret = %d\n", x); } +#ifdef WIN32 +EXPORT void sleep(int millis) { + carp_sleep(millis); +} +#endif + #endif diff --git a/shared/types.h b/shared/types.h index 05dde4ae..87e2c61a 100644 --- a/shared/types.h +++ b/shared/types.h @@ -5,4 +5,4 @@ typedef void(*carp_thread_routine)(void* arg); typedef struct carp_library* carp_library_t; - +void carp_sleep(int millis);