Files
armorpaint/base/plugins/plugin_api.h
T
2025-02-27 16:12:24 +01:00

81 lines
2.7 KiB
C

#pragma once
#include <string.h>
#include <stdbool.h>
#include "quickjs/quickjs.h"
#include "quickjs/quickjs-libc.h"
extern JSRuntime *js_runtime;
extern JSContext *js_ctx;
void js_eval(const char *s);
void js_call(void *p);
void js_call_arg(void *p, int argc, void *argv);
// ██████╗ ███████╗███████╗██╗███╗ ██╗███████╗███████╗
// ██╔══██╗██╔════╝██╔════╝██║████╗ ██║██╔════╝██╔════╝
// ██║ ██║█████╗ █████╗ ██║██╔██╗ ██║█████╗ ███████╗
// ██║ ██║██╔══╝ ██╔══╝ ██║██║╚██╗██║██╔══╝ ╚════██║
// ██████╔╝███████╗██║ ██║██║ ╚████║███████╗███████║
// ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚══════╝
#define FN(name)\
static JSValue js_##name(JSContext *ctx, JSValue this_val, int argc, JSValue *argv)
#define VOID_FN(name)\
void name();\
FN(name) {\
name();\
return JS_UNDEFINED;\
}
#define PTR_FN(name)\
void *name();\
FN(name) {\
int64_t result = (int64_t)name();\
return JS_NewInt64(ctx, result);\
}
#define VOID_FN_STR(name)\
void name(char *s);\
FN(name) {\
char *s = (char *)JS_ToCString(ctx, argv[0]);\
name(s);\
return JS_UNDEFINED;\
}
#define VOID_FN_PTR_STR(name)\
void name(void *p, char *s);\
FN(name) {\
int64_t p;\
JS_ToInt64(ctx, &p, argv[0]);\
char *s = (char *)JS_ToCString(ctx, argv[1]);\
name((void *)p, s);\
return JS_UNDEFINED;\
}
#define VOID_FN_CB(name)\
void name(void *p);\
FN(name) {\
JSValue dup = JS_DupValue(ctx, argv[0]);\
if (JS_IsNull(dup)) { name(NULL); return JS_UNDEFINED; } \
JSValue *p = malloc(sizeof(JSValue));\
memcpy(p, &dup, sizeof(JSValue));\
name(p);\
return JS_UNDEFINED;\
}
#define VOID_FN_PTR_CB(name)\
void name(void *p0, void *p1);\
FN(name) {\
int64_t p0;\
JS_ToInt64(ctx, &p0, argv[0]);\
JSValue *p1 = malloc(sizeof(JSValue));\
JSValue dup = JS_DupValue(ctx, argv[1]);\
memcpy(p1, &dup, sizeof(JSValue));\
name((void *)p0, p1);\
return JS_UNDEFINED;\
}
#define BIND(name, argc)\
JS_SetPropertyStr(js_ctx, global_obj, #name, JS_NewCFunction(js_ctx, js_##name, #name, argc))