diff --git a/src/console.c b/src/console.c index 819c3d4..73e3b53 100644 --- a/src/console.c +++ b/src/console.c @@ -25,7 +25,6 @@ #include "config.h" #include "ext/gif.h" #include "ext/file_dialog.h" -#include "machine.h" #include #include @@ -2221,20 +2220,8 @@ static void onConsoleEvalCommand(Console* console, const char* param) { printLine(console); - tic_machine* machine = (tic_machine*)console->tic; - lua_State* lua = machine->lua; - - // TODO: check for other languages/runtimes? - if(lua) - { - if(luaL_dostring(lua, param) != LUA_OK) - { - printError(console, lua_tostring(lua, -1)); - } - lua_settop(lua, 0); - } - else - printError(console, "Lua state uninitialized.\n"); + const tic_script_config* script_config = console->tic->api.get_script_config(console->tic); + script_config->eval(console->tic, param); commandDone(console); } diff --git a/src/jsapi.c b/src/jsapi.c index 8eb7372..9a3c810 100644 --- a/src/jsapi.c +++ b/src/jsapi.c @@ -1001,6 +1001,10 @@ static const tic_outline_item* getJsOutline(const char* code, s32* size) return items; } +void evalJs(tic_mem* tic, const char* code) { + printf("TODO: JS eval not yet implemented\n."); +} + static const tic_script_config JsSyntaxConfig = { .init = initJavascript, @@ -1011,6 +1015,7 @@ static const tic_script_config JsSyntaxConfig = .getOutline = getJsOutline, .parse = parseCode, + .eval = evalJs, .blockCommentStart = "/*", .blockCommentEnd = "*/", diff --git a/src/luaapi.c b/src/luaapi.c index e3fbbcb..7ee9daa 100644 --- a/src/luaapi.c +++ b/src/luaapi.c @@ -1402,6 +1402,22 @@ static const tic_outline_item* getLuaOutline(const char* code, s32* size) return items; } +void evalLua(tic_mem* tic, const char* code) { + tic_machine* machine = (tic_machine*)tic; + lua_State* lua = machine->lua; + + lua_settop(lua, 0); + + if(luaL_loadstring(lua, code) != LUA_OK || lua_pcall(lua, 0, LUA_MULTRET, 0) != LUA_OK) + { + machine->data->error(machine->data->data, lua_tostring(lua, -1)); + } +} + +void evalPlaceholder(tic_mem* tic, const char* code) { + printf("TODO: not yet implemented\n."); +} + static const tic_script_config LuaSyntaxConfig = { .init = initLua, @@ -1412,6 +1428,7 @@ static const tic_script_config LuaSyntaxConfig = .getOutline = getLuaOutline, .parse = parseCode, + .eval = evalLua, .blockCommentStart = "--[[", .blockCommentEnd = "]]", @@ -1580,6 +1597,7 @@ static const tic_script_config MoonSyntaxConfig = .getOutline = getMoonOutline, .parse = parseCode, + .eval = evalPlaceholder, .blockCommentStart = NULL, .blockCommentEnd = NULL, @@ -1712,6 +1730,28 @@ static const tic_outline_item* getFennelOutline(const char* code, s32* size) return items; } +void evalFennel(tic_mem* tic, const char* code) { + tic_machine* machine = (tic_machine*)tic; + lua_State* fennel = machine->lua; + + lua_settop(fennel, 0); + + if (luaL_loadbuffer(fennel, execute_fennel_src, strlen(execute_fennel_src), "execute_fennel") != LUA_OK) + { + machine->data->error(machine->data->data, "failed to load fennel compiler"); + } + + lua_pushstring(fennel, code); + lua_call(fennel, 1, 1); + const char* err = lua_tostring(fennel, -1); + + if (err) + { + machine->data->error(machine->data->data, err); + } +} + + static const tic_script_config FennelSyntaxConfig = { .init = initFennel, @@ -1722,6 +1762,7 @@ static const tic_script_config FennelSyntaxConfig = .getOutline = getFennelOutline, .parse = parseCode, + .eval = evalFennel, .blockCommentStart = NULL, .blockCommentEnd = NULL, diff --git a/src/ticapi.h b/src/ticapi.h index 05c5baa..8128d9d 100644 --- a/src/ticapi.h +++ b/src/ticapi.h @@ -106,6 +106,7 @@ struct tic_script_config const tic_outline_item* (*getOutline)(const char* code, s32* size); void (*parse)(const tic_script_config* config, const char* start, u8* color, const tic_code_theme* theme); + void (*eval)(tic_mem* tic, const char* code); const char* blockCommentStart; const char* blockCommentEnd; diff --git a/src/wrenapi.c b/src/wrenapi.c index f0ae7f4..b93cda6 100644 --- a/src/wrenapi.c +++ b/src/wrenapi.c @@ -1344,6 +1344,10 @@ static const tic_outline_item* getWrenOutline(const char* code, s32* size) return items; } +void evalWren(tic_mem* tic, const char* code) { + printf("TODO: Wren eval not yet implemented\n."); +} + static const tic_script_config WrenSyntaxConfig = { .init = initWren, @@ -1354,6 +1358,7 @@ static const tic_script_config WrenSyntaxConfig = .getOutline = getWrenOutline, .parse = parseCode, + .eval = evalWren, .blockCommentStart = "/*", .blockCommentEnd = "*/",