mirror of
https://github.com/suchmememanyskill/TegraExplorer.git
synced 2024-11-26 05:42:07 +00:00
add dicts
This commit is contained in:
parent
0bef41c033
commit
8c6e70b63d
8 changed files with 97 additions and 3 deletions
|
@ -145,6 +145,7 @@
|
||||||
<ClCompile Include="ABadIdeaVersion3.c" />
|
<ClCompile Include="ABadIdeaVersion3.c" />
|
||||||
<ClCompile Include="arrayClass.c" />
|
<ClCompile Include="arrayClass.c" />
|
||||||
<ClCompile Include="arrayReferenceClass.c" />
|
<ClCompile Include="arrayReferenceClass.c" />
|
||||||
|
<ClCompile Include="dictionaryClass.c" />
|
||||||
<ClCompile Include="else.c" />
|
<ClCompile Include="else.c" />
|
||||||
<ClCompile Include="eval.c" />
|
<ClCompile Include="eval.c" />
|
||||||
<ClCompile Include="functionClass.c" />
|
<ClCompile Include="functionClass.c" />
|
||||||
|
|
|
@ -87,6 +87,9 @@
|
||||||
<ClCompile Include="else.c">
|
<ClCompile Include="else.c">
|
||||||
<Filter>Source Files\Classes\Elseable</Filter>
|
<Filter>Source Files\Classes\Elseable</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="dictionaryClass.c">
|
||||||
|
<Filter>Source Files\Classes\Dictionary</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="compat.h">
|
<ClInclude Include="compat.h">
|
||||||
|
|
50
source/script/dictionaryClass.c
Normal file
50
source/script/dictionaryClass.c
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
#include "dictionaryClass.h"
|
||||||
|
#include <string.h>
|
||||||
|
#include "garbageCollector.h"
|
||||||
|
|
||||||
|
u8 dictOneStrOneAll[] = { StringClass, VARARGCOUNT };
|
||||||
|
|
||||||
|
Dict_t* getEntry(Vector_t *v, char* name) {
|
||||||
|
vecForEach(Dict_t*, dict, v) {
|
||||||
|
if (!strcmp(name, dict->name)) {
|
||||||
|
return dict;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassFunction(dictSet) {
|
||||||
|
addPendingReference(args[1]);
|
||||||
|
char* arg = CpyStr(args[0]->string.value);
|
||||||
|
Dict_t* possibleEntry = getEntry(&caller->dictionary.vector, arg);
|
||||||
|
if (possibleEntry == NULL) {
|
||||||
|
Dict_t a = { .name = arg, .var = args[1] };
|
||||||
|
vecAdd(&caller->dictionary.vector, a);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
possibleEntry->var = args[1];
|
||||||
|
free(arg);
|
||||||
|
}
|
||||||
|
return &emptyClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassFunctionTableEntry_t dictFunctions[] = {
|
||||||
|
{"set", dictSet, 2, dictOneStrOneAll},
|
||||||
|
};
|
||||||
|
|
||||||
|
Variable_t getDictMember(Variable_t* var, char* memberName) {
|
||||||
|
if (!strcmp(memberName, "set"))
|
||||||
|
return getGenericFunctionMember(var, memberName, dictFunctions, ARRAY_SIZE(dictFunctions));
|
||||||
|
|
||||||
|
vecForEach(Dict_t*, dict, (&var->dictionary.vector)) {
|
||||||
|
if (!strcmp(dict->name, memberName)) {
|
||||||
|
Variable_t a = { 0 };
|
||||||
|
a.variableType = ReferenceType;
|
||||||
|
a.referenceType = dict->var;
|
||||||
|
addPendingReference(dict->var);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Variable_t) { 0 };
|
||||||
|
}
|
|
@ -1,3 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "model.h"
|
#include "model.h"
|
||||||
#include "genericClass.h"
|
#include "genericClass.h"
|
||||||
|
#include "compat.h"
|
||||||
|
|
||||||
|
Variable_t getDictMember(Variable_t* var, char* memberName);
|
|
@ -187,6 +187,9 @@ void runtimeVariableEdit(Callback_SetVar_t* set, Variable_t* curRes) {
|
||||||
callMemberFunctionDirect(set->setVar, "set", args, 2);
|
callMemberFunctionDirect(set->setVar, "set", args, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
removePendingReference(curRes);
|
||||||
|
removePendingReference(set->setVar);
|
||||||
|
|
||||||
// TODO: add non-top level sets
|
// TODO: add non-top level sets
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include "saveClass.h"
|
#include "saveClass.h"
|
||||||
#include "unsolvedArrayClass.h"
|
#include "unsolvedArrayClass.h"
|
||||||
#include "else.h"
|
#include "else.h"
|
||||||
|
#include "dictionaryClass.h"
|
||||||
|
|
||||||
Variable_t* copyVariableToPtr(Variable_t var) {
|
Variable_t* copyVariableToPtr(Variable_t var) {
|
||||||
Variable_t* a = malloc(sizeof(Variable_t));
|
Variable_t* a = malloc(sizeof(Variable_t));
|
||||||
|
@ -31,12 +32,12 @@ MemberGetters_t memberGetters[] = {
|
||||||
{SolvedArrayReferenceClass, getArrayReferenceMember},
|
{SolvedArrayReferenceClass, getArrayReferenceMember},
|
||||||
{UnresolvedArrayClass, getUnsolvedArrayMember},
|
{UnresolvedArrayClass, getUnsolvedArrayMember},
|
||||||
{ElseClass, getElseMember},
|
{ElseClass, getElseMember},
|
||||||
|
{DictionaryClass, getDictMember},
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
{SaveClass, getSaveMember},
|
{SaveClass, getSaveMember},
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
Variable_t* genericGet(Variable_t* var, CallArgs_t* ref) {
|
Variable_t* genericGet(Variable_t* var, CallArgs_t* ref) {
|
||||||
if (ref->extraAction == ActionExtraMemberName) {
|
if (ref->extraAction == ActionExtraMemberName) {
|
||||||
for (u32 i = 0; i < ARRAY_SIZE(memberGetters); i++) {
|
for (u32 i = 0; i < ARRAY_SIZE(memberGetters); i++) {
|
||||||
|
@ -45,6 +46,10 @@ Variable_t* genericGet(Variable_t* var, CallArgs_t* ref) {
|
||||||
if (member.variableType == None)
|
if (member.variableType == None)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (member.variableType == ReferenceType) {
|
||||||
|
return member.referenceType;
|
||||||
|
}
|
||||||
|
|
||||||
addPendingReference(var); // So caller doesn't fall out of scope. Don't forget to free!
|
addPendingReference(var); // So caller doesn't fall out of scope. Don't forget to free!
|
||||||
return copyVariableToPtr(member);
|
return copyVariableToPtr(member);
|
||||||
}
|
}
|
||||||
|
@ -186,6 +191,7 @@ Variable_t* genericCall(Variable_t* var, CallArgs_t* ref) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: add staticStorage
|
||||||
Variable_t getGenericFunctionMember(Variable_t* var, char* memberName, ClassFunctionTableEntry_t* entries, u8 len) {
|
Variable_t getGenericFunctionMember(Variable_t* var, char* memberName, ClassFunctionTableEntry_t* entries, u8 len) {
|
||||||
Variable_t newVar = {.readOnly = 1, .variableType = FunctionClass};
|
Variable_t newVar = {.readOnly = 1, .variableType = FunctionClass};
|
||||||
newVar.function.origin = var;
|
newVar.function.origin = var;
|
||||||
|
@ -213,7 +219,12 @@ Variable_t* callMemberFunction(Variable_t* var, char* memberName, CallArgs_t* ar
|
||||||
if (funcRef.variableType == None)
|
if (funcRef.variableType == None)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return genericCall(&funcRef, args);
|
Variable_t* ptr = &funcRef;
|
||||||
|
if (funcRef.variableType == ReferenceType) {
|
||||||
|
ptr = funcRef.referenceType;
|
||||||
|
}
|
||||||
|
|
||||||
|
return genericCall(ptr, args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,7 +239,12 @@ Variable_t* callMemberFunctionDirect(Variable_t* var, char* memberName, Variable
|
||||||
SCRIPT_FATAL_ERR("Did not find member '%s'", memberName);
|
SCRIPT_FATAL_ERR("Did not find member '%s'", memberName);
|
||||||
}
|
}
|
||||||
|
|
||||||
return genericCallDirect(&funcRef, args, argsLen);
|
Variable_t* ptr = &funcRef;
|
||||||
|
if (funcRef.variableType == ReferenceType) {
|
||||||
|
ptr = funcRef.referenceType;
|
||||||
|
}
|
||||||
|
|
||||||
|
return genericCallDirect(ptr, args, argsLen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,6 +267,13 @@ void freeVariableInternal(Variable_t* referencedTarget) {
|
||||||
case IntArrayClass:
|
case IntArrayClass:
|
||||||
vecFree(referencedTarget->solvedArray.vector);
|
vecFree(referencedTarget->solvedArray.vector);
|
||||||
break;
|
break;
|
||||||
|
case DictionaryClass:;
|
||||||
|
vecForEach(Dict_t*, dict, (&referencedTarget->dictionary.vector)) {
|
||||||
|
modReference(dict->var, 0);
|
||||||
|
free(dict->name);
|
||||||
|
}
|
||||||
|
FREE(referencedTarget->dictionary.vector.data);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ typedef enum {
|
||||||
SolvedArrayReferenceClass,
|
SolvedArrayReferenceClass,
|
||||||
SaveClass,
|
SaveClass,
|
||||||
ElseClass,
|
ElseClass,
|
||||||
|
ReferenceType,
|
||||||
} VariableType_t;
|
} VariableType_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -176,6 +177,7 @@ typedef struct _Variable_t {
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
SaveClass_t *save;
|
SaveClass_t *save;
|
||||||
#endif
|
#endif
|
||||||
|
struct _Variable_t* referenceType;
|
||||||
};
|
};
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
|
|
|
@ -79,6 +79,13 @@ ClassFunction(stdBreak) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClassFunction(stdDict) {
|
||||||
|
Variable_t a = { 0 };
|
||||||
|
a.variableType = DictionaryClass;
|
||||||
|
a.dictionary.vector = newVec(sizeof(Dict_t), 0);
|
||||||
|
return copyVariableToPtr(a);
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
ClassFunction(stdMountSysmmc){
|
ClassFunction(stdMountSysmmc){
|
||||||
if (connectMMC(MMC_CONN_EMMC))
|
if (connectMMC(MMC_CONN_EMMC))
|
||||||
|
@ -121,6 +128,7 @@ enum standardFunctionIndexes {
|
||||||
STD_MOUNTSAVE,
|
STD_MOUNTSAVE,
|
||||||
STD_EXIT,
|
STD_EXIT,
|
||||||
STD_BREAK,
|
STD_BREAK,
|
||||||
|
STD_DICT,
|
||||||
};
|
};
|
||||||
|
|
||||||
u8 oneIntoneFunction[] = { IntClass, FunctionClass };
|
u8 oneIntoneFunction[] = { IntClass, FunctionClass };
|
||||||
|
@ -135,6 +143,7 @@ ClassFunctionTableEntry_t standardFunctionDefenitions[] = {
|
||||||
[STD_MOUNTSAVE] = {"readsave", stdMountSave, 1, oneStringArgStd},
|
[STD_MOUNTSAVE] = {"readsave", stdMountSave, 1, oneStringArgStd},
|
||||||
[STD_EXIT] = {"exit", stdExit, 0, 0},
|
[STD_EXIT] = {"exit", stdExit, 0, 0},
|
||||||
[STD_BREAK] = {"break", stdBreak, 0, 0},
|
[STD_BREAK] = {"break", stdBreak, 0, 0},
|
||||||
|
[STD_DICT] = {"dict", stdDict, 0, 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
ClassFunctionTableEntry_t* searchStdLib(char* funcName) {
|
ClassFunctionTableEntry_t* searchStdLib(char* funcName) {
|
||||||
|
|
Loading…
Reference in a new issue