diff options
| author | physick <mynameisgennadiy@vk.com> | 2026-07-15 17:46:13 +0500 |
|---|---|---|
| committer | physick <mynameisgennadiy@vk.com> | 2026-07-15 17:46:13 +0500 |
| commit | 8b79b8149d1e23d90b5871f980aec65d8aa7ae23 (patch) | |
| tree | 88a8788b75270dba53a15cbc2b6e0916f05301c6 /src/wren_inter | |
| parent | f314b56da42e1ead200e2373e9b214f77290d03b (diff) | |
Puzzle infrastructure pt 1.
Diffstat (limited to 'src/wren_inter')
| -rw-r--r-- | src/wren_inter/wren_inter.c | 70 | ||||
| -rw-r--r-- | src/wren_inter/wren_inter.h | 6 |
2 files changed, 47 insertions, 29 deletions
diff --git a/src/wren_inter/wren_inter.c b/src/wren_inter/wren_inter.c index 69df112..10ecc93 100644 --- a/src/wren_inter/wren_inter.c +++ b/src/wren_inter/wren_inter.c @@ -1,51 +1,42 @@ #include "wren_inter.h" #include "../utils/stringBuilder.h" +#include <stddef.h> #include <string.h> #include <raylib.h> #include <stdio.h> #include <wren.h> -StringBuilder stdout_sb = {0}; - void writeFn(WrenVM* vm, const char* text) { - AppendStringBuilder(&stdout_sb, text, '\n'); + StringBuilder* sb = (StringBuilder*)wrenGetUserData(vm); + AppendStringBuilder(sb, text); } - + void errorFn(WrenVM* vm, WrenErrorType errorType, const char* module, const int line, const char* msg) { + StringBuilder* sb = (StringBuilder*)wrenGetUserData(vm); switch (errorType) { case WREN_ERROR_COMPILE: - { - // TraceLog(LOG_ERROR, "[%s line %d] [Error] %s", module, line, msg); - AppendStringBuilder(&stdout_sb, "Comptime error: ", '\n'); - AppendStringBuilder(&stdout_sb, msg, ' '); - } break; + AppendStringBuilder(sb, "Comptime error: "); + AppendStringBuilder(sb, msg); + break; case WREN_ERROR_STACK_TRACE: - { - AppendStringBuilder(&stdout_sb, "Stack trace: ", '\n'); - AppendStringBuilder(&stdout_sb, msg, ' '); - // TraceLog(LOG_ERROR, "[%s line %d] in %s", module, line, msg); - } break; + AppendStringBuilder(sb, "Stack trace: "); + AppendStringBuilder(sb, msg); + break; case WREN_ERROR_RUNTIME: - { - AppendStringBuilder(&stdout_sb, "Runtime error: ", '\n'); - AppendStringBuilder(&stdout_sb, msg, ' '); - // TraceLog(LOG_ERROR, "[Runtime Error] %s", msg); - } break; + AppendStringBuilder(sb, "Runtime error: "); + AppendStringBuilder(sb, msg); + break; } } char *EvaluateScript(char *script) { TraceLog(LOG_INFO, "Evaluating %s...", script); - WrenConfiguration config; - wrenInitConfiguration(&config); - config.writeFn = writeFn; - config.errorFn = errorFn; + WrenVM *vm = InterpreterPrepareMachine(); - WrenVM* vm = wrenNewVM(&config); if (vm == NULL) { TraceLog(LOG_ERROR, "Failed to initialize a wren vm"); return NULL; @@ -57,11 +48,32 @@ char *EvaluateScript(char *script) { case WREN_RESULT_COMPILE_ERROR: break; case WREN_RESULT_RUNTIME_ERROR: break; } - printf("Wren outp: %s", stdout_sb.val); - wrenFreeVM(vm); - if (stdout_sb.val == NULL) return NULL; - char *outp = strdup(stdout_sb.val); - FreeStringBuilder(&stdout_sb); + char *outp = GetMachineOutput(vm); + InterpreterFreeMachine(vm); + return outp; } + +WrenVM *InterpreterPrepareMachine() { + WrenConfiguration config; + wrenInitConfiguration(&config); + config.writeFn = writeFn; + config.errorFn = errorFn; + + StringBuilder *stdout_sb = calloc(1, sizeof(StringBuilder)); + config.userData = stdout_sb; + return wrenNewVM(&config); +} + +char *GetMachineOutput(WrenVM *vm) { + StringBuilder* sb = (StringBuilder*)wrenGetUserData(vm); + if (sb == NULL || sb->val == NULL) return NULL; + return strdup(sb->val); +} + +void InterpreterFreeMachine(WrenVM *vm) { + StringBuilder* sb = (StringBuilder*)wrenGetUserData(vm); + if (sb != NULL && sb->val != NULL) free(sb); + wrenFreeVM(vm); +} diff --git a/src/wren_inter/wren_inter.h b/src/wren_inter/wren_inter.h index 981a606..100f946 100644 --- a/src/wren_inter/wren_inter.h +++ b/src/wren_inter/wren_inter.h @@ -1,6 +1,12 @@ #ifndef WREN_INTER_H #define WREN_INTER_H +#include <wren.h> + char *EvaluateScript(char *script); +WrenVM *InterpreterPrepareMachine(); +char *GetMachineOutput(WrenVM *vm); +void InterpreterFreeMachine(WrenVM *vm); + #endif // WREN_INTER_H |
