aboutsummaryrefslogtreecommitdiff
path: root/interface.c
diff options
context:
space:
mode:
authorCamil Staps2016-01-31 14:46:55 +0100
committerCamil Staps2016-01-31 14:46:55 +0100
commit2fb8dc632b4c007033d9a40c6d6ab060d1ea1fe3 (patch)
tree1877df4581887fd0e79aa396b64e61b28ada87a3 /interface.c
parentMakefile (diff)
Working version
Diffstat (limited to 'interface.c')
-rw-r--r--interface.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/interface.c b/interface.c
new file mode 100644
index 0000000..c520521
--- /dev/null
+++ b/interface.c
@@ -0,0 +1,87 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <inttypes.h>
+
+#include <ffi.h>
+#include "hacking.h"
+
+#include "Clean.h"
+#include "cleanstring.h"
+
+void* parameters[100];
+ffi_type* parameter_types[100];
+uint8_t param_ptr = 0;
+
+ffi_type* return_type;
+void* return_val;
+
+void cleanInit(void) {
+ parameters[0] = NULL;
+ param_ptr = 0;
+}
+
+void cleanPuti(long i) {
+ parameters[param_ptr] = malloc(sizeof(long));
+ *((long*)parameters[param_ptr]) = i;
+ parameter_types[param_ptr] = &ffi_type_slong;
+ param_ptr++;
+}
+
+void cleanPuts(CleanString s) {
+ char** csptr = malloc(sizeof(char**));
+ *csptr = cleantocstring(s);
+ parameters[param_ptr] = csptr;
+ parameter_types[param_ptr] = &ffi_type_pointer;
+ param_ptr++;
+}
+
+void cleanPutr(double r) {
+ parameters[param_ptr] = malloc(sizeof(double));
+ *((double*)parameters[param_ptr]) = r;
+ parameter_types[param_ptr] = &ffi_type_double;
+ param_ptr++;
+}
+
+void cleanSetReturnType(long i) {
+ switch (i) {
+ case 0:
+ return_type = &ffi_type_slong;
+ return_val = calloc(sizeof(long), 1);
+ break;
+ case 1:
+ return_type = &ffi_type_pointer;
+ return_val = calloc(sizeof(char*), 1);
+ break;
+ case 2:
+ return_type = &ffi_type_double;
+ return_val = calloc(sizeof(double), 1);
+ break;
+ }
+}
+
+void cleanCall(CleanString fname) {
+ char*cfname = cleantocstring(fname);
+
+ Callable *callable = funcnameToCallable(cfname,
+ param_ptr, parameter_types, return_type);
+
+ if (callable != NULL)
+ call(callable, parameters, return_val);
+
+ for (; param_ptr != 0; param_ptr--)
+ free(parameters[param_ptr - 1]);
+}
+
+CleanString* cleanGets(void) {
+ return (CleanString*) ctocleanstring(*((char**)return_val));
+}
+
+long cleanGeti(void) {
+ return (long) *((long*) return_val);
+}
+
+double cleanGetr(void) {
+ return (double) *((double*) return_val);
+}
+