add scripts to the main menu, fix script parser reading beyond EOF

This commit is contained in:
suchmememanyskill
2021-07-18 23:51:27 +02:00
parent b06085915d
commit 3cd78d6efd
7 changed files with 94 additions and 33 deletions

View File

@@ -71,7 +71,7 @@ int main()
//parseScript("#REQUIRE VER 3.0.5\nmain = { two = 1 + 1 }");
//ParserRet_t ret = parseScript("a.b.c(1){ a.b.c() }");
ParserRet_t ret = parseScript(script);
ParserRet_t ret = parseScript(script, strlen(script));
free(script);
setStaticVars(&ret.staticVarHolder);

View File

@@ -71,6 +71,8 @@ typedef enum {
History_Array,
} StackHistory_t;
char* end;
u8 nextToken(char** inPtr, void** val) {
char* in = *inPtr;
u8 ret = Token_Err;
@@ -191,7 +193,7 @@ u8 nextToken(char** inPtr, void** val) {
ret = Token_String;
*val = storage;
}
else if (*in == '\0') {
else if (*in == '\0' || in > end) {
*inPtr = in;
return ret;
}
@@ -258,7 +260,7 @@ int isLastVarCall(Operator_t* opHolder) {
return (opHolder->token == CallArgs && getLastRef(&opHolder->callArgs)->action == ActionCall);
}
ParserRet_t parseScript(char* in) {
ParserRet_t parseScript(char* in, u32 len) {
Vector_t functionStack; // Function_t
Vector_t stackHistoryHolder; // StaticHistory_t
Vector_t staticVariableHolder; // Variable_t
@@ -275,8 +277,9 @@ ParserRet_t parseScript(char* in) {
u8 notNext = 0;
lineNumber = 1;
scriptCurrentLine = 1;
end = in + len;
while (*in) {
while (*in && in <= end) {
Function_t* lastFunc = getStackEntry(&functionStack);
StackHistory_t* lastHistory = getStackEntry(&stackHistoryHolder);

View File

@@ -10,6 +10,6 @@ typedef struct {
#define SCRIPT_PARSER_ERR(message, ...) printScriptError(SCRIPT_PARSER_FATAL, message, ##__VA_ARGS__); return (ParserRet_t){0}
ParserRet_t parseScript(char* in);
void exitStaticVars(Vector_t* v);
void exitFunction(Operator_t* start, u32 len);
void exitFunction(Operator_t* start, u32 len);
ParserRet_t parseScript(char* in, u32 len);

View File

@@ -70,6 +70,12 @@ ClassFunction(stdPrint) {
return &emptyClass;
}
ClassFunction(stdPrintLn) {
stdPrint(caller, args, argsLen);
gfx_printf("\n");
return &emptyClass;
}
ClassFunction(stdExit) {
return NULL;
}
@@ -128,33 +134,22 @@ ClassFunction(stdSetPixel) {
}
#endif
enum standardFunctionIndexes {
STD_IF = 0,
STD_WHILE,
STD_PRINT,
STD_MOUNTSYSMMC,
STD_MOUNTSAVE,
STD_EXIT,
STD_BREAK,
STD_DICT,
STD_SETPIXEL,
};
u8 oneIntoneFunction[] = { IntClass, FunctionClass };
u8 doubleFunctionClass[] = { FunctionClass, FunctionClass };
u8 oneStringArgStd[] = {StringClass};
u8 threeIntsStd[] = { IntClass, IntClass, IntClass };
ClassFunctionTableEntry_t standardFunctionDefenitions[] = {
[STD_IF] = {"if", stdIf, 2, oneIntoneFunction},
[STD_WHILE] = {"while", stdWhile, 2, doubleFunctionClass},
[STD_PRINT] = {"print", stdPrint, VARARGCOUNT, 0},
[STD_MOUNTSYSMMC] = {"mountsys", stdMountSysmmc, 1, oneStringArgStd},
[STD_MOUNTSAVE] = {"readsave", stdMountSave, 1, oneStringArgStd},
[STD_EXIT] = {"exit", stdExit, 0, 0},
[STD_BREAK] = {"break", stdBreak, 0, 0},
[STD_DICT] = {"dict", stdDict, 0, 0},
[STD_SETPIXEL] = {"setpixel", stdSetPixel, 3, threeIntsStd},
{"if", stdIf, 2, oneIntoneFunction},
{"while", stdWhile, 2, doubleFunctionClass},
{"print", stdPrint, VARARGCOUNT, 0},
{"println", stdPrintLn, VARARGCOUNT, 0},
{"mountsys", stdMountSysmmc, 1, oneStringArgStd},
{"readsave", stdMountSave, 1, oneStringArgStd},
{"exit", stdExit, 0, 0},
{"break", stdBreak, 0, 0},
{"dict", stdDict, 0, 0},
{"setpixel", stdSetPixel, 3, threeIntsStd},
};
ClassFunctionTableEntry_t* searchStdLib(char* funcName) {