#477 script config moved to TIC module

This commit is contained in:
BADIM-PC\Vadim 2017-12-21 10:28:14 +03:00
parent b26eb6bd1c
commit 1280a1291a
6 changed files with 199 additions and 162 deletions

View File

@ -194,79 +194,7 @@ static inline bool islineend(char c) {return c == '\n' || c == '\0';}
static inline bool isalpha_(char c) {return isalpha(c) || c == '_';}
static inline bool isalnum_(char c) {return isalnum(c) || c == '_';}
typedef struct
{
const char* blockCommentStart;
const char* blockCommentEnd;
const char* blockStringStart;
const char* blockStringEnd;
const char* singleCommentStart;
const char* const * keywords;
s32 keywordsCount;
} SyntaxConfig;
static const char* const LuaKeywords [] =
{
"and", "break", "do", "else", "elseif",
"end", "false", "for", "function", "goto", "if",
"in", "local", "nil", "not", "or", "repeat",
"return", "then", "true", "until", "while"
};
static const SyntaxConfig LuaSyntaxConfig =
{
.blockCommentStart = "--[[",
.blockCommentEnd = "]]",
.singleCommentStart = "--",
.blockStringStart = "[[",
.blockStringEnd = "]]",
.keywords = LuaKeywords,
.keywordsCount = COUNT_OF(LuaKeywords),
};
static const char* const MoonKeywords [] =
{
"false", "true", "nil", "return",
"break", "continue", "for", "while",
"if", "else", "elseif", "unless", "switch",
"when", "and", "or", "in", "do",
"not", "super", "try", "catch",
"with", "export", "import", "then",
"from", "class", "extends", "new"
};
static const SyntaxConfig MoonSyntaxConfig =
{
.blockCommentStart = NULL,
.blockCommentEnd = NULL,
.blockStringStart = NULL,
.blockStringEnd = NULL,
.singleCommentStart = "--",
.keywords = MoonKeywords,
.keywordsCount = COUNT_OF(MoonKeywords),
};
static const char* const JsKeywords [] =
{
"break", "do", "instanceof", "typeof", "case", "else", "new",
"var", "catch", "finally", "return", "void", "continue", "for",
"switch", "while", "debugger", "function", "this", "with",
"default", "if", "throw", "delete", "in", "try", "const"
};
static const SyntaxConfig JsSyntaxConfig =
{
.blockCommentStart = "/*",
.blockCommentEnd = "*/",
.blockStringStart = NULL,
.blockStringEnd = NULL,
.singleCommentStart = "//",
.keywords = JsKeywords,
.keywordsCount = COUNT_OF(JsKeywords),
};
static void parse(const char* start, u8* color, const SyntaxConfig* config)
static void parse(const char* start, u8* color, const tic_script_config* config)
{
const char* ptr = start;
@ -412,10 +340,10 @@ static void parse(const char* start, u8* color, const SyntaxConfig* config)
ptr++;
continue;
}
else if(config->singleCommentStart && memcmp(ptr, config->singleCommentStart, strlen(config->singleCommentStart)) == 0)
else if(config->singleComment && memcmp(ptr, config->singleComment, strlen(config->singleComment)) == 0)
{
singleCommentStart = ptr;
ptr += strlen(config->singleCommentStart);
ptr += strlen(config->singleComment);
continue;
}
else if(isalpha_(c))
@ -444,12 +372,9 @@ static void parseSyntaxColor(Code* code)
{
memset(code->colorBuffer, getConfig()->theme.code.var, sizeof(code->colorBuffer));
switch(code->tic->api.get_script(code->tic))
{
case tic_script_moon: parse(code->src, code->colorBuffer, &MoonSyntaxConfig); break;
case tic_script_lua: parse(code->src, code->colorBuffer, &LuaSyntaxConfig); break;
case tic_script_js: parse(code->src, code->colorBuffer, &JsSyntaxConfig); break;
}
tic_mem* tic = code->tic;
parse(code->src, code->colorBuffer, tic->api.get_script_config(tic));
}
static char* getLineByPos(Code* code, char* pos)
@ -1124,7 +1049,7 @@ static void setOutlineMode(Code* code)
code->outline.index = 0;
memset(code->outline.items, 0, OUTLINE_ITEMS_SIZE);
code->tic->api.get_script(code->tic) == tic_script_moon
code->tic->api.get_script_config(code->tic)->lang == tic_script_moon
? setMoonscriptOutlineMode(code)
: setLuaOutlineMode(code);
@ -1158,7 +1083,10 @@ static void commentLine(Code* code)
static char Comment[] = "-- ";
enum {Size = sizeof Comment-1};
strcpy(Comment, code->tic->api.get_script(code->tic) == tic_script_js ? "// " : "-- ");
tic_mem* tic = code->tic;
memcpy(Comment, tic->api.get_script_config(tic)->singleComment,
strlen(tic->api.get_script_config(tic)->singleComment));
char* line = getLine(code);

View File

@ -27,8 +27,10 @@
static const char TicMachine[] = "_TIC80";
void closeJavascript(tic_machine* machine)
static void closeJavascript(tic_mem* tic)
{
tic_machine* machine = (tic_machine*)tic;
if(machine->js)
{
duk_destroy_heap(machine->js);
@ -775,7 +777,7 @@ s32 duk_timeout_check(void* udata)
static void initDuktape(tic_machine* machine)
{
closeJavascript(machine);
closeJavascript((tic_mem*)machine);
duk_context* duk = machine->js = duk_create_heap(NULL, NULL, NULL, machine, NULL);
@ -794,8 +796,10 @@ static void initDuktape(tic_machine* machine)
}
}
bool initJavascript(tic_machine* machine, const char* code)
static bool initJavascript(tic_mem* tic, const char* code)
{
tic_machine* machine = (tic_machine*)tic;
initDuktape(machine);
duk_context* duktape = machine->js;
@ -809,8 +813,10 @@ bool initJavascript(tic_machine* machine, const char* code)
return true;
}
void callJavascriptTick(tic_machine* machine)
static void callJavascriptTick(tic_mem* tic)
{
tic_machine* machine = (tic_machine*)tic;
const char* TicFunc = ApiKeywords[0];
duk_context* duk = machine->js;
@ -832,7 +838,7 @@ void callJavascriptTick(tic_machine* machine)
}
}
void callJavascriptScanline(tic_mem* memory, s32 row, void* data)
static void callJavascriptScanline(tic_mem* memory, s32 row, void* data)
{
tic_machine* machine = (tic_machine*)memory;
duk_context* duk = machine->js;
@ -853,7 +859,7 @@ void callJavascriptScanline(tic_mem* memory, s32 row, void* data)
else duk_pop(duk);
}
void callJavascriptOverlap(tic_mem* memory, void* data)
static void callJavascriptOverlap(tic_mem* memory, void* data)
{
tic_machine* machine = (tic_machine*)memory;
duk_context* duk = machine->js;
@ -870,4 +876,36 @@ void callJavascriptOverlap(tic_mem* memory, void* data)
else duk_pop(duk);
}
else duk_pop(duk);
}
}
static const char* const JsKeywords [] =
{
"break", "do", "instanceof", "typeof", "case", "else", "new",
"var", "catch", "finally", "return", "void", "continue", "for",
"switch", "while", "debugger", "function", "this", "with",
"default", "if", "throw", "delete", "in", "try", "const"
};
static const tic_script_config JsSyntaxConfig =
{
.lang = tic_script_js,
.init = initJavascript,
.close = closeJavascript,
.tick = callJavascriptTick,
.scanline = callJavascriptScanline,
.overlap = callJavascriptOverlap,
.blockCommentStart = "/*",
.blockCommentEnd = "*/",
.blockStringStart = NULL,
.blockStringEnd = NULL,
.singleComment = "//",
.keywords = JsKeywords,
.keywordsCount = COUNT_OF(JsKeywords),
};
const tic_script_config* getJsScriptConfig()
{
return &JsSyntaxConfig;
}

View File

@ -1114,8 +1114,10 @@ static void initAPI(tic_machine* machine)
lua_sethook(machine->lua, &checkForceExit, LUA_MASKCOUNT, LUA_LOC_STACK);
}
void closeLua(tic_machine* machine)
static void closeLua(tic_mem* tic)
{
tic_machine* machine = (tic_machine*)tic;
if(machine->lua)
{
lua_close(machine->lua);
@ -1123,27 +1125,21 @@ void closeLua(tic_machine* machine)
}
}
bool initLua(tic_machine* machine, const char* code)
static bool initLua(tic_mem* tic, const char* code)
{
closeLua(machine);
tic_machine* machine = (tic_machine*)tic;
closeLua(tic);
lua_State* lua = machine->lua = luaL_newstate();
static const luaL_Reg loadedlibs[] =
{
{ "_G", luaopen_base },
//{ LUA_LOADLIBNAME, luaopen_package },
{ LUA_COLIBNAME, luaopen_coroutine },
{ LUA_TABLIBNAME, luaopen_table },
// {LUA_IOLIBNAME, luaopen_io},
// {LUA_OSLIBNAME, luaopen_os},
{ LUA_STRLIBNAME, luaopen_string },
{ LUA_MATHLIBNAME, luaopen_math },
// {LUA_UTF8LIBNAME, luaopen_utf8},
//{ LUA_DBLIBNAME, luaopen_debug },
// #if defined(LUA_COMPAT_BITLIB)
// {LUA_BITLIBNAME, luaopen_bit32},
// #endif
{ NULL, NULL }
};
@ -1181,9 +1177,10 @@ static const char* execute_moonscript_src = MOON_CODE(
return fn()
);
bool initMoonscript(tic_machine* machine, const char* code)
static bool initMoonscript(tic_mem* tic, const char* code)
{
closeLua(machine);
tic_machine* machine = (tic_machine*)tic;
closeLua(tic);
lua_State* lua = machine->lua = luaL_newstate();
@ -1245,8 +1242,10 @@ bool initMoonscript(tic_machine* machine, const char* code)
return true;
}
void callLuaTick(tic_machine* machine)
static void callLuaTick(tic_mem* tic)
{
tic_machine* machine = (tic_machine*)tic;
const char* TicFunc = ApiKeywords[0];
lua_State* lua = machine->lua;
@ -1267,7 +1266,7 @@ void callLuaTick(tic_machine* machine)
}
}
void callLuaScanline(tic_mem* memory, s32 row, void* data)
static void callLuaScanline(tic_mem* memory, s32 row, void* data)
{
tic_machine* machine = (tic_machine*)memory;
lua_State* lua = machine->lua;
@ -1287,7 +1286,7 @@ void callLuaScanline(tic_mem* memory, s32 row, void* data)
}
}
void callLuaOverlap(tic_mem* memory, void* data)
static void callLuaOverlap(tic_mem* memory, void* data)
{
tic_machine* machine = (tic_machine*)memory;
lua_State* lua = machine->lua;
@ -1306,3 +1305,70 @@ void callLuaOverlap(tic_mem* memory, void* data)
}
}
static const char* const LuaKeywords [] =
{
"and", "break", "do", "else", "elseif",
"end", "false", "for", "function", "goto", "if",
"in", "local", "nil", "not", "or", "repeat",
"return", "then", "true", "until", "while"
};
static const tic_script_config LuaSyntaxConfig =
{
.lang = tic_script_lua,
.init = initLua,
.close = closeLua,
.tick = callLuaTick,
.scanline = callLuaScanline,
.overlap = callLuaOverlap,
.blockCommentStart = "--[[",
.blockCommentEnd = "]]",
.singleComment = "--",
.blockStringStart = "[[",
.blockStringEnd = "]]",
.keywords = LuaKeywords,
.keywordsCount = COUNT_OF(LuaKeywords),
};
const tic_script_config* getLuaScriptConfig()
{
return &LuaSyntaxConfig;
}
static const char* const MoonKeywords [] =
{
"false", "true", "nil", "return",
"break", "continue", "for", "while",
"if", "else", "elseif", "unless", "switch",
"when", "and", "or", "in", "do",
"not", "super", "try", "catch",
"with", "export", "import", "then",
"from", "class", "extends", "new"
};
static const tic_script_config MoonSyntaxConfig =
{
.lang = tic_script_moon,
.init = initMoonscript,
.close = closeLua,
.tick = callLuaTick,
.scanline = callLuaScanline,
.overlap = callLuaOverlap,
.blockCommentStart = NULL,
.blockCommentEnd = NULL,
.blockStringStart = NULL,
.blockStringEnd = NULL,
.singleComment = "--",
.keywords = MoonKeywords,
.keywordsCount = COUNT_OF(MoonKeywords),
};
const tic_script_config* getMoonScriptConfig()
{
return &MoonSyntaxConfig;
}

View File

@ -82,6 +82,7 @@ typedef struct
Channel channels[TIC_SOUND_CHANNELS];
} music;
tic_tick tick;
tic_scanline scanline;
struct
@ -142,18 +143,6 @@ s32 drawText(tic_mem* memory, const char* text, s32 x, s32 y, s32 width, s32 hei
s32 drawSpriteFont(tic_mem* memory, u8 symbol, s32 x, s32 y, s32 width, s32 height, u8 chromakey, s32 scale);
s32 drawFixedSpriteFont(tic_mem* memory, u8 index, s32 x, s32 y, s32 width, s32 height, u8 chromakey, s32 scale);
void closeLua(tic_machine* machine);
void closeJavascript(tic_machine* machine);
bool initMoonscript(tic_machine* machine, const char* code);
bool initLua(tic_machine* machine, const char* code);
bool initJavascript(tic_machine* machine, const char* code);
void callLuaTick(tic_machine* machine);
void callJavascriptTick(tic_machine* machine);
void callLuaScanline(tic_mem* memory, s32 row, void* data);
void callJavascriptScanline(tic_mem* memory, s32 row, void* data);
void callLuaOverlap(tic_mem* memory, void* data);
void callJavascriptOverlap(tic_mem* memory, void* data);
const tic_script_config* getLuaScriptConfig();
const tic_script_config* getMoonScriptConfig();
const tic_script_config* getJsScriptConfig();

View File

@ -559,8 +559,10 @@ void tic_close(tic_mem* memory)
machine->state.initialized = false;
closeJavascript(machine);
closeLua(machine);
getLuaScriptConfig()->close(memory);
getMoonScriptConfig()->close(memory);
getJsScriptConfig()->close(memory);
blip_delete(machine->blip);
free(memory->samples.buffer);
@ -1500,13 +1502,19 @@ static bool isJavascript(const char* code)
return compareMetatag(code, "script", "js") || compareMetatag(code, "script", "javascript");
}
static tic_script_lang api_get_script(tic_mem* memory)
static const tic_script_config* getScriptConfig(const char* code)
{
if(isMoonscript(memory->cart.bank0.code.data)) return tic_script_moon;
if(isJavascript(memory->cart.bank0.code.data)) return tic_script_js;
return tic_script_lua;
if(isMoonscript(code)) return getMoonScriptConfig();
if(isJavascript(code)) return getJsScriptConfig();
return getLuaScriptConfig();
}
static const tic_script_config* api_get_script_config(tic_mem* memory)
{
return getScriptConfig(memory->cart.bank0.code.data);
}
static void updateSaveid(tic_mem* memory)
{
memset(memory->saveid, 0, sizeof memory->saveid);
@ -1527,9 +1535,9 @@ static void updateSaveid(tic_mem* memory)
}
}
static void api_tick(tic_mem* memory, tic_tick_data* data)
static void api_tick(tic_mem* tic, tic_tick_data* data)
{
tic_machine* machine = (tic_machine*)memory;
tic_machine* machine = (tic_machine*)tic;
machine->data = data;
@ -1544,7 +1552,7 @@ static void api_tick(tic_mem* memory, tic_tick_data* data)
for(s32 i = TIC_BANKS - 1; i >= 0; i--)
{
const char* bankCode = memory->cart.banks[i].code.data;
const char* bankCode = tic->cart.banks[i].code.data;
if(strlen(bankCode))
strcat(code, bankCode);
@ -1554,35 +1562,18 @@ static void api_tick(tic_mem* memory, tic_tick_data* data)
data->preprocessor(data->data, code);
bool done = false;
const tic_script_config* config = NULL;
if(strlen(code))
{
cart2ram(memory);
memory->input = compareMetatag(code, "input", "mouse") ? tic_mouse_input : tic_gamepad_input;
cart2ram(tic);
tic->input = compareMetatag(code, "input", "mouse") ? tic_mouse_input : tic_gamepad_input;
if(memory->input == tic_mouse_input)
memory->ram.vram.vars.mask.data = 0;
if(tic->input == tic_mouse_input)
tic->ram.vram.vars.mask.data = 0;
memory->script = tic_script_lua;
if (isMoonscript(code))
{
if(initMoonscript(machine, code))
{
memory->script = tic_script_moon;
done = true;
}
}
else if(isJavascript(code))
{
if(initJavascript(machine, code))
{
memory->script = tic_script_js;
done = true;
}
}
else if(initLua(machine, code))
done = true;
config = getScriptConfig(code);
done = config->init(tic, code);
}
else
{
@ -1595,17 +1586,17 @@ static void api_tick(tic_mem* memory, tic_tick_data* data)
{
data->start = data->counter();
machine->state.scanline = memory->script == tic_script_js ? callJavascriptScanline : callLuaScanline;
machine->state.ovr.callback = memory->script == tic_script_js ? callJavascriptOverlap : callLuaOverlap;
machine->state.tick = config->tick;
machine->state.scanline = config->scanline;
machine->state.ovr.callback = config->overlap;
machine->state.initialized = true;
}
else return;
}
}
memory->script == tic_script_js
? callJavascriptTick(machine)
: callLuaTick(machine);
machine->state.tick(tic);
}
static void api_scanline(tic_mem* memory, s32 row, void* data)
@ -1877,7 +1868,6 @@ static void initApi(tic_api* api)
INIT_API(reset);
INIT_API(pause);
INIT_API(resume);
INIT_API(get_script);
INIT_API(sync);
INIT_API(btnp);
INIT_API(load);
@ -1886,6 +1876,8 @@ static void initApi(tic_api* api)
INIT_API(tick_end);
INIT_API(blit);
INIT_API(get_script_config);
#undef INIT_API
}

View File

@ -64,9 +64,34 @@ typedef struct
} tic_tick_data;
typedef struct tic_mem tic_mem;
typedef void(*tic_tick)(tic_mem* memory);
typedef void(*tic_scanline)(tic_mem* memory, s32 row, void* data);
typedef void(*tic_overlap)(tic_mem* memory, void* data);
typedef struct
{
tic_script_lang lang;
struct
{
bool(*init)(tic_mem* memory, const char* code);
void(*close)(tic_mem* memory);
tic_tick tick;
tic_scanline scanline;
tic_overlap overlap;
};
const char* blockCommentStart;
const char* blockCommentEnd;
const char* blockStringStart;
const char* blockStringEnd;
const char* singleComment;
const char* const * keywords;
s32 keywordsCount;
} tic_script_config;
typedef struct
{
s32 (*draw_char) (tic_mem* memory, u8 symbol, s32 x, s32 y, u8 color);
@ -113,7 +138,7 @@ typedef struct
void (*tick_end) (tic_mem* memory);
void (*blit) (tic_mem* tic, tic_scanline scanline, tic_overlap overlap, void* data);
tic_script_lang (*get_script)(tic_mem* memory);
const tic_script_config* (*get_script_config)(tic_mem* memory);
} tic_api;
struct tic_mem
@ -122,7 +147,6 @@ struct tic_mem
tic_cartridge cart;
tic_cartridge config;
tic_input_method input;
tic_script_lang script;
tic_font font;
tic_api api;