diff --git a/Makefile b/Makefile index c9b3049..670b9f0 100644 --- a/Makefile +++ b/Makefile @@ -104,3 +104,6 @@ $(BUILDDIR)/$(TARGET)/%.o: $(BDKDIR)/%.c $(BUILDDIR)/$(TARGET)/%.o: $(BDKDIR)/%.S @mkdir -p "$(@D)" $(CC) $(CFLAGS) -c $< -o $@ + +$(SOURCEDIR)/script/builtin.c: scripts/*.te + @py te2c.py source/script/builtin scripts diff --git a/source/script/StringClass.c b/source/script/StringClass.c index 40e1903..c5cf5df 100644 --- a/source/script/StringClass.c +++ b/source/script/StringClass.c @@ -70,6 +70,16 @@ ClassFunction(stringIndexGet) { return newStringVariablePtr(a, 0, 0); } +ClassFunction(stringMinusInt){ + u32 baseStrLen = strlen(caller->string.value); + if (baseStrLen < args[0]->integer.value){ + SCRIPT_FATAL_ERR("Index of string out of range"); + } + char* newStr = calloc(baseStrLen - args[0]->integer.value + 1, 1); + memcpy(newStr, caller->string.value, baseStrLen - args[0]->integer.value); + return newStringVariablePtr(newStr, 0, 1); +} + u8 strOneIntArg[] = { IntClass }; u8 oneStringArg[] = { StringClass }; @@ -79,6 +89,7 @@ ClassFunctionTableEntry_t stringFunctions[] = { {"len", getStringLength, 0, 0}, {"bytes", stringBytes, 0, 0}, {"get", stringIndexGet, 1, strOneIntArg}, + {"-", stringMinusInt, 1, strOneIntArg}, }; Variable_t getStringMember(Variable_t* var, char* memberName) { diff --git a/source/script/arrayClass.c b/source/script/arrayClass.c index 4a37057..4fbb9cf 100644 --- a/source/script/arrayClass.c +++ b/source/script/arrayClass.c @@ -226,6 +226,25 @@ ClassFunction(eqArray){ return newIntVariablePtr(!res); } +ClassFunction(arrayFind){ + Variable_t *arg = (*args); + if (caller->solvedArray.vector.count <= arg->solvedArray.vector.count || arg->variableType != caller->variableType){ + return newIntVariablePtr(-1); + } + + u8 step = (arg->variableType == ByteArrayClass) ? 1 : 8; + char *haystack = caller->solvedArray.vector.data; + void *needle = arg->solvedArray.vector.data; + + for (int i = 0; i < caller->solvedArray.vector.count - arg->solvedArray.vector.count; i++){ + if (!memcmp(haystack + (i * step), needle, step * arg->solvedArray.vector.count)){ + return newIntVariablePtr(i); + } + } + + return newIntVariablePtr(-1); +} + ClassFunctionTableEntry_t arrayFunctions[] = { {"get", getArrayIdx, 1, anotherOneIntArg }, {"len", getArrayLen, 0, 0}, @@ -239,6 +258,8 @@ ClassFunctionTableEntry_t arrayFunctions[] = { {"bytestostr", bytesToStr, 0, 0}, {"==", eqArray, 1, oneByteArrayClass}, {"==", eqArray, 1, oneIntArrayClass}, + {"find", arrayFind, 1, oneByteArrayClass}, + {"find", arrayFind, 1, oneIntArrayClass}, }; Variable_t getArrayMember(Variable_t* var, char* memberName) { diff --git a/source/script/genericClass.c b/source/script/genericClass.c index 695961c..4aa0597 100644 --- a/source/script/genericClass.c +++ b/source/script/genericClass.c @@ -274,7 +274,14 @@ void freeVariableInternal(Variable_t* referencedTarget) { } FREE(referencedTarget->dictionary.vector.data); break; - } + case SaveClass:; + #ifndef WIN32 + save_free_contexts(&referencedTarget->save->saveCtx); + f_close(&referencedTarget->save->saveFile); + FREE(referencedTarget->save); + #endif // !WIN32 + break; + } } void freeVariable(Variable_t** target) { diff --git a/te2c.py b/te2c.py index cf30915..892ef33 100644 --- a/te2c.py +++ b/te2c.py @@ -65,3 +65,4 @@ def te2c(dest: str, path: str, suffix: str=".te"): if __name__ == "__main__": te2c(dest=sys.argv[1], path=sys.argv[2]) + print("converting .te files done!")