add scripts to the main menu, fix script parser reading beyond EOF
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user