plugin_api.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #pragma once
  2. #include <string.h>
  3. #include <stdbool.h>
  4. #include "quickjs.h"
  5. #include "quickjs-libc.h"
  6. extern JSRuntime *js_runtime;
  7. extern JSContext *js_ctx;
  8. float js_eval(const char *s);
  9. char *js_call(void *p);
  10. JSValue js_call_arg(void *p, int argc, void *argv);
  11. // ██████╗ ███████╗███████╗██╗███╗ ██╗███████╗███████╗
  12. // ██╔══██╗██╔════╝██╔════╝██║████╗ ██║██╔════╝██╔════╝
  13. // ██║ ██║█████╗ █████╗ ██║██╔██╗ ██║█████╗ ███████╗
  14. // ██║ ██║██╔══╝ ██╔══╝ ██║██║╚██╗██║██╔══╝ ╚════██║
  15. // ██████╔╝███████╗██║ ██║██║ ╚████║███████╗███████║
  16. // ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚══════╝
  17. #define FN(name)\
  18. static JSValue js_##name(JSContext *ctx, JSValue this_val, int argc, JSValue *argv)
  19. #define VOID_FN(name)\
  20. void name();\
  21. FN(name) {\
  22. name();\
  23. return JS_UNDEFINED;\
  24. }
  25. #define PTR_FN(name)\
  26. void *name();\
  27. FN(name) {\
  28. uint64_t result = (uint64_t)name();\
  29. return JS_NewBigUint64(ctx, result);\
  30. }
  31. #define VOID_FN_STR(name)\
  32. void name(char *s);\
  33. FN(name) {\
  34. char *s = (char *)JS_ToCString(ctx, argv[0]);\
  35. name(s);\
  36. return JS_UNDEFINED;\
  37. }
  38. #define VOID_FN_PTR_STR(name)\
  39. void name(void *p, char *s);\
  40. FN(name) {\
  41. uint64_t p;\
  42. JS_ToBigUint64(ctx, &p, argv[0]);\
  43. char *s = (char *)JS_ToCString(ctx, argv[1]);\
  44. name((void *)p, s);\
  45. return JS_UNDEFINED;\
  46. }
  47. #define VOID_FN_CB(name)\
  48. void name(void *p);\
  49. FN(name) {\
  50. JSValue dup = JS_DupValue(ctx, argv[0]);\
  51. if (JS_IsNull(dup)) { name(NULL); return JS_UNDEFINED; } \
  52. JSValue *p = malloc(sizeof(JSValue));\
  53. memcpy(p, &dup, sizeof(JSValue));\
  54. name(p);\
  55. return JS_UNDEFINED;\
  56. }
  57. #define VOID_FN_PTR_CB(name)\
  58. void name(void *p0, void *p1);\
  59. FN(name) {\
  60. uint64_t p0;\
  61. JS_ToBigUint64(ctx, &p0, argv[0]);\
  62. JSValue *p1 = malloc(sizeof(JSValue));\
  63. JSValue dup = JS_DupValue(ctx, argv[1]);\
  64. memcpy(p1, &dup, sizeof(JSValue));\
  65. name((void *)p0, p1);\
  66. return JS_UNDEFINED;\
  67. }
  68. #define BIND(name, argc)\
  69. JS_SetPropertyStr(js_ctx, global_obj, #name, JS_NewCFunction(js_ctx, js_##name, #name, argc))