summaryrefslogtreecommitdiff
path: root/src/wren_inter
diff options
context:
space:
mode:
authorphysick <mynameisgennadiy@vk.com>2026-07-15 17:46:13 +0500
committerphysick <mynameisgennadiy@vk.com>2026-07-15 17:46:13 +0500
commit8b79b8149d1e23d90b5871f980aec65d8aa7ae23 (patch)
tree88a8788b75270dba53a15cbc2b6e0916f05301c6 /src/wren_inter
parentf314b56da42e1ead200e2373e9b214f77290d03b (diff)
Puzzle infrastructure pt 1.
Diffstat (limited to 'src/wren_inter')
-rw-r--r--src/wren_inter/wren_inter.c70
-rw-r--r--src/wren_inter/wren_inter.h6
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