From 9b1573be9d3df518ee8b485dc68dfa6184e712e5 Mon Sep 17 00:00:00 2001 From: JailDoctor Date: Wed, 15 Dec 2021 19:24:56 +0100 Subject: [PATCH] Code editor WIP --- ascii.cpp | 1 + ascii.h | 2 + lua.cpp | 5 -- main.cpp | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 153 insertions(+), 7 deletions(-) diff --git a/ascii.cpp b/ascii.cpp index a5101e7..8290d5d 100644 --- a/ascii.cpp +++ b/ascii.cpp @@ -215,6 +215,7 @@ int main(int argc,char*argv[]) { //lua_call_init(); } } else if (mini_eve.key.keysym.scancode == SDL_SCANCODE_F5) { + execute_run(); lua_quit(); reinit(); lua_init(lua_filename); diff --git a/ascii.h b/ascii.h index e022431..5a8ffc4 100644 --- a/ascii.h +++ b/ascii.h @@ -128,6 +128,8 @@ #define COLOR_WHITE 15 void loop(); +void execute_run(); + const char* get_filename(); void cls(uint8_t value=32); diff --git a/lua.cpp b/lua.cpp index b157ef3..d7b021d 100644 --- a/lua.cpp +++ b/lua.cpp @@ -420,7 +420,6 @@ void lua_init(const char* filename, const bool start_playing) { debug("BOOT ERROR:", false); debug(lua_tostring(L, -1)); lua_pop(L,1); - setmode(0); file_loaded = false; } } else { @@ -428,7 +427,6 @@ void lua_init(const char* filename, const bool start_playing) { debug("ERROR LOADING GAME:",false); debug(lua_tostring(L, -1)); lua_pop(L,1); - setmode(0); file_loaded = false; } } @@ -618,7 +616,6 @@ void lua_init(const char* filename, const bool start_playing) { debug("RUNTIME ERROR:", false); debug(lua_tostring(L, -1)); lua_pop(L,1); - setmode(0); return; } @@ -663,7 +660,6 @@ void lua_call_init() { debug("RUNTIME ERROR:",false); debug(lua_tostring(L, -1)); lua_pop(L,1); - setmode(0); lua_state = STATE_STOPPED; } } @@ -676,7 +672,6 @@ void lua_call_update() { debug("RUNTIME ERROR:",false); debug(lua_tostring(L, -1)); lua_pop(L,1); - setmode(0); lua_state = STATE_STOPPED; } } else { diff --git a/main.cpp b/main.cpp index f9aaf6f..1069cf8 100644 --- a/main.cpp +++ b/main.cpp @@ -12,6 +12,7 @@ void do_terminal(); void init_code_editor(); void do_code_editor(); +void save_code(); void loop() { if (btnp(KEY_TAB)) { @@ -35,6 +36,10 @@ void loop() { } } +void execute_run() { + if (current_editor == 1) save_code(); +} + uint8_t get_char(uint8_t key) { SDL_Keymod mods = SDL_GetModState(); if (key != KEY_UNKNOWN) { @@ -93,6 +98,15 @@ void do_terminal() { } } +void save_code() { + const char* file = get_filename(); + FILE *f = fopen(file, "w"); + for (std::list::iterator it = code.begin(); it != code.end(); it++) { + fprintf(f, "%s\n", (*it).c_str()); + } + fclose(f); +} + void load_code() { const char* file = get_filename(); FILE *f = fopen(file, "rb"); @@ -114,7 +128,7 @@ void load_code() { buffer[pos]='\0'; code.push_back(&buffer[start]); start=pos+1; - if (buffer[start] == '\n') start++; + if (buffer[start] == '\n') {pos++; start++;} } } @@ -127,6 +141,117 @@ static int line = 0; bool cursor_inverted = false; int blink_wait = 30; +#define PARSER_NOTHING 0 +#define PARSER_NUMBER 1 +#define PARSER_IDENTIFIER 2 +#define PARSER_STRING 3 +#define PARSER_COMMENT 4 +#define PARSER_FUNCTION 5 + +uint16_t parser_offset = 0; +uint8_t parser_pos = 0; +uint8_t parser_start=0; +void parser_setup(uint16_t address) { + parser_offset = address; + parser_pos = 0; + parser_start = 0; +} +const uint8_t parser_get_char(uint8_t offset=0) { + if ((parser_pos+offset) >= 80) return 0; + return peek(parser_offset+parser_pos+offset); +} +char alpha[80] = ""; +uint8_t alpha_pos = 0; +void parser_next(const bool keep=false) { + if (keep) { alpha[alpha_pos++] = parser_get_char(); alpha[alpha_pos]=0; } else { alpha[0]=alpha_pos=0; } + if (parser_pos < 80) parser_pos++; +} + +#define ISZERO (parser_get_char()=='0') +#define ISX (parser_get_char()=='z' || parser_get_char()=='Z') +#define ISDIGIT (parser_get_char()>='0' && parser_get_char() <='9') +#define WILLBEDIGIT (parser_get_char(1)>='0' && parser_get_char(1) <='9') +#define ISPOINT (parser_get_char()=='.') +#define ISALPHA (parser_get_char()>='_' || (parser_get_char()>='a' && parser_get_char()<='z') || (parser_get_char()>='A' && parser_get_char()<='Z')) +#define ISQUOTES (parser_get_char()=='"' || parser_get_char()=='\'') +#define ISMINUS (parser_get_char()=='-') +#define WILLBEMINUS (parser_get_char(1)=='-') +#define ISPAREN (parser_get_char()=='(') +#define ENDED (parser_get_char()==0) + +const char* keywords[] = { "and", "break", "do", "else", "elseif", "end", "false", "for", "function", "goto", "if", "in", "local", "nil", "not", "or", "repeat", "return", "then", "true", "until", "while" }; + +const bool is_keyword() { + for (int i=0;i<22;++i) if (strcmp(alpha, keywords[i]) == 0) return true; + return false; +} + +void parser_do_color(uint8_t type) { + uint8_t color = COLOR_WHITE; + switch (type) { + case PARSER_NUMBER: color = COLOR_LIGHT_GREEN; break; + case PARSER_COMMENT: color = COLOR_LIGHT_GRAY; break; + case PARSER_STRING: color = COLOR_RED; break; + case PARSER_IDENTIFIER: if (is_keyword()) color = COLOR_MAGENTA; break; + case PARSER_FUNCTION: color = COLOR_YELLOW; break; + }; + color = (color&0x0f)+(0x10); + for (int i=parser_start;i