mirror of
https://github.com/suchmememanyskill/TegraExplorer.git
synced 2024-11-22 11:56:42 +00:00
untested, added dict_t as a var type in tscript
This commit is contained in:
parent
853cf4f5cf
commit
3a1f8d4243
7 changed files with 69 additions and 2 deletions
|
@ -123,6 +123,24 @@ Variable_t getVarFromToken(scriptCtx_t* ctx, lexarToken_t* tokens, int* index, u
|
||||||
return ErrValue(ERRINVALIDTYPE);
|
return ErrValue(ERRINVALIDTYPE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ELIFTX(MemberVariable){
|
||||||
|
Variable_t* var = dictVectorFind(&ctx->varDict, tokens[i].text);
|
||||||
|
i++;
|
||||||
|
|
||||||
|
if (var == NULL)
|
||||||
|
return ErrValue(ERRNOVAR);
|
||||||
|
|
||||||
|
if (tokens[i].token == MemberVariable){
|
||||||
|
return ErrValue(ERRINVALIDTYPE); // Recursive members currently not supported!
|
||||||
|
}
|
||||||
|
|
||||||
|
Variable_t *find = dictVectorFind(&var->vectorType, tokens[i].text);
|
||||||
|
if (find == NULL)
|
||||||
|
return ErrValue(ERRNOVAR); // No member with that variable was found
|
||||||
|
|
||||||
|
val = *find;
|
||||||
|
val.free = 0;
|
||||||
|
}
|
||||||
ELIFTX(Function) {
|
ELIFTX(Function) {
|
||||||
i += 2;
|
i += 2;
|
||||||
|
|
||||||
|
|
|
@ -422,6 +422,22 @@ scriptFunction(funcLaunchPayload){
|
||||||
return varInt(launch_payload(vars[0].stringType));
|
return varInt(launch_payload(vars[0].stringType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
scriptFunction(funcNewDict){
|
||||||
|
Variable_t dict = {0};
|
||||||
|
dict.varType = DictionaryType;
|
||||||
|
dict.free = 1;
|
||||||
|
dict.vectorType = newVec(sizeof(dict_t), 4);
|
||||||
|
dict.vectorPtr = &dict.vectorType;
|
||||||
|
return dict;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Args: Dict, Str, Var
|
||||||
|
scriptFunction(funcAddToDict){
|
||||||
|
Variable_t copy = copyVariable(vars[2]);
|
||||||
|
dictVectorAdd(vars[0].vectorPtr, newDict(CpyStr(vars[1].stringType), copy));
|
||||||
|
return NullVar;
|
||||||
|
}
|
||||||
|
|
||||||
u8 fiveInts[] = {IntType, IntType, IntType, IntType, IntType};
|
u8 fiveInts[] = {IntType, IntType, IntType, IntType, IntType};
|
||||||
u8 singleIntArray[] = { IntArrayType };
|
u8 singleIntArray[] = { IntArrayType };
|
||||||
u8 singleInt[] = { IntType };
|
u8 singleInt[] = { IntType };
|
||||||
|
@ -432,6 +448,7 @@ u8 StrByteVec[] = { StringType, ByteArrayType};
|
||||||
u8 MenuArgs[] = { StringArrayType, IntType, StringArrayType, IntArrayType};
|
u8 MenuArgs[] = { StringArrayType, IntType, StringArrayType, IntArrayType};
|
||||||
u8 twoStrings[] = { StringType, StringType };
|
u8 twoStrings[] = { StringType, StringType };
|
||||||
u8 mmcReadWrite[] = { StringType, StringType, IntType};
|
u8 mmcReadWrite[] = { StringType, StringType, IntType};
|
||||||
|
u8 dictAdd[] = {DictionaryType, StringType, varArgs};
|
||||||
|
|
||||||
functionStruct_t scriptFunctions[] = {
|
functionStruct_t scriptFunctions[] = {
|
||||||
{"if", funcIf, 1, singleInt},
|
{"if", funcIf, 1, singleInt},
|
||||||
|
@ -476,6 +493,8 @@ functionStruct_t scriptFunctions[] = {
|
||||||
{"saveSign", funcSignSave, 1, singleStr},
|
{"saveSign", funcSignSave, 1, singleStr},
|
||||||
{"timerMs", funcGetMs, 0, NULL},
|
{"timerMs", funcGetMs, 0, NULL},
|
||||||
{"launchPayload", funcLaunchPayload, 1, singleStr},
|
{"launchPayload", funcLaunchPayload, 1, singleStr},
|
||||||
|
{"dict", funcNewDict, 0, NULL},
|
||||||
|
{"dictAdd", funcAddToDict, 3, dictAdd},
|
||||||
// Left from old: keyboard(?)
|
// Left from old: keyboard(?)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -161,6 +161,10 @@ Vector_t runLexer(const char* in, u32 len) {
|
||||||
|
|
||||||
vecAddElement(&vec, makeLexarToken(LSBracket, 0));
|
vecAddElement(&vec, makeLexarToken(LSBracket, 0));
|
||||||
}
|
}
|
||||||
|
ELIFC('.'){
|
||||||
|
if (lx[vec.count - 1].token == Variable)
|
||||||
|
lx[vec.count - 1].token = MemberVariable;
|
||||||
|
}
|
||||||
ELIFC('=') { // Do we need to keep = if the vars are assignments anyway?
|
ELIFC('=') { // Do we need to keep = if the vars are assignments anyway?
|
||||||
if (in[1] == '='){
|
if (in[1] == '='){
|
||||||
vecAddElement(&vec, makeLexarToken(EqualEqual, 0));
|
vecAddElement(&vec, makeLexarToken(EqualEqual, 0));
|
||||||
|
|
|
@ -7,6 +7,7 @@ enum Tokens {
|
||||||
Invalid = 0,
|
Invalid = 0,
|
||||||
Variable = 1,
|
Variable = 1,
|
||||||
ArrayVariable,
|
ArrayVariable,
|
||||||
|
MemberVariable,
|
||||||
Function,
|
Function,
|
||||||
LBracket,
|
LBracket,
|
||||||
StrLit,
|
StrLit,
|
||||||
|
@ -70,6 +71,7 @@ enum Variables {
|
||||||
IntArrayType,
|
IntArrayType,
|
||||||
StringArrayType,
|
StringArrayType,
|
||||||
ByteArrayType,
|
ByteArrayType,
|
||||||
|
DictionaryType,
|
||||||
JumpType,
|
JumpType,
|
||||||
DictType,
|
DictType,
|
||||||
NullType,
|
NullType,
|
||||||
|
@ -103,6 +105,7 @@ typedef struct {
|
||||||
char* stringType;
|
char* stringType;
|
||||||
Vector_t vectorType;
|
Vector_t vectorType;
|
||||||
};
|
};
|
||||||
|
Vector_t *vectorPtr;
|
||||||
} Variable_t;
|
} Variable_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <mem/heap.h>
|
#include <mem/heap.h>
|
||||||
|
#include "../utils/utils.h"
|
||||||
|
|
||||||
void freeVariable(Variable_t dv) {
|
void freeVariable(Variable_t dv) {
|
||||||
if (!dv.free)
|
if (!dv.free)
|
||||||
|
@ -22,9 +23,27 @@ void freeVariable(Variable_t dv) {
|
||||||
case ByteArrayType:
|
case ByteArrayType:
|
||||||
vecFree(dv.vectorType);
|
vecFree(dv.vectorType);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DictionaryType:
|
||||||
|
freeDictVector(&dv.vectorType);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Variable_t copyVariable(Variable_t copy){
|
||||||
|
switch (copy.varType){
|
||||||
|
case IntType:
|
||||||
|
return copy;
|
||||||
|
case StringType:
|
||||||
|
return newVar(StringType, 1, .stringType = CpyStr(copy.stringType));
|
||||||
|
case IntArrayType:
|
||||||
|
case StringArrayType:
|
||||||
|
return newVar(copy.varType, 1, .vectorType = vecCopy(©.vectorType));
|
||||||
|
}
|
||||||
|
|
||||||
|
return NullVar; // Other types are not supported or whatever
|
||||||
|
}
|
||||||
|
|
||||||
void freeVariableVector(Vector_t *v) {
|
void freeVariableVector(Vector_t *v) {
|
||||||
Variable_t* vars = vecGetArrayPtr(v, Variable_t*);
|
Variable_t* vars = vecGetArrayPtr(v, Variable_t*);
|
||||||
for (int i = 0; i < v->count; i++) {
|
for (int i = 0; i < v->count; i++) {
|
||||||
|
@ -69,6 +88,10 @@ void dictVectorAdd(Vector_t* v, dict_t add) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
vecAddElement(v, add);
|
vecAddElement(v, add);
|
||||||
|
dict_t *dict = vecGetArrayPtr(v, dict_t*);
|
||||||
|
for (int i = 0; i < v->count; i++){
|
||||||
|
dict[i].value.vectorPtr = &dict[i].value.vectorType;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ void freeDictVector(Vector_t* v);
|
||||||
void freeVariableVector(Vector_t* v);
|
void freeVariableVector(Vector_t* v);
|
||||||
void freeVariable(Variable_t dv);
|
void freeVariable(Variable_t dv);
|
||||||
scriptCtx_t createScriptCtx();
|
scriptCtx_t createScriptCtx();
|
||||||
|
Variable_t copyVariable(Variable_t copy);
|
||||||
|
|
||||||
u8 setIndentInstruction(scriptCtx_t* ctx, u8 level, u8 skip, u8 func, int jumpLoc);
|
u8 setIndentInstruction(scriptCtx_t* ctx, u8 level, u8 skip, u8 func, int jumpLoc);
|
||||||
indentInstructor_t* getCurIndentInstruction(scriptCtx_t* ctx);
|
indentInstructor_t* getCurIndentInstruction(scriptCtx_t* ctx);
|
||||||
|
|
|
@ -56,5 +56,4 @@ Vector_t vecCopyOffset(Vector_t* orig, u32 offset) {
|
||||||
|
|
||||||
Vector_t vecCopy(Vector_t* orig) {
|
Vector_t vecCopy(Vector_t* orig) {
|
||||||
return vecCopyOffset(orig, 0);
|
return vecCopyOffset(orig, 0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue