#include "wren_inter.h" #include "../utils/stringBuilder.h" #include #include #include #include #include void writeFn(WrenVM* vm, const char* text) { 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: AppendStringBuilder(sb, "Comptime error: "); AppendStringBuilder(sb, msg); break; case WREN_ERROR_STACK_TRACE: AppendStringBuilder(sb, "Stack trace: "); AppendStringBuilder(sb, msg); break; case WREN_ERROR_RUNTIME: AppendStringBuilder(sb, "Runtime error: "); AppendStringBuilder(sb, msg); break; } } // Obsolete char *EvaluateScript(char *script) { TraceLog(LOG_INFO, "Evaluating %s...", script); WrenVM *vm = InterpreterPrepareMachine(); if (vm == NULL) { TraceLog(LOG_ERROR, "Failed to initialize a wren vm"); return NULL; } WrenInterpretResult result = wrenInterpret(vm, "main", script); switch (result) { case WREN_RESULT_SUCCESS: break; case WREN_RESULT_COMPILE_ERROR: break; case WREN_RESULT_RUNTIME_ERROR: break; } 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); }