1
0
Fork 0
mirror of https://github.com/suchmememanyskill/TegraExplorer.git synced 2024-11-22 20:06:43 +00:00

[script] Make equivalent to tsV1

Fixed: functions in functions
Added functions: version, menu, pathCombine, pathEscFolder, fileMove, fileCopy, fileDel, mmcConnect, mmcMount, mkdir, dirRead, dirCopy, dirDel, mmcDump, mmcRestore
This commit is contained in:
suchmememanyskill 2021-01-04 01:55:58 +01:00
parent e1491da4ad
commit c9fdb650c3
8 changed files with 182 additions and 9 deletions

View file

@ -89,6 +89,15 @@ void BoxRestOfScreen(){
} }
ErrCode_t FolderCopy(const char *locin, const char *locout){ ErrCode_t FolderCopy(const char *locin, const char *locout){
if (TConf.explorerCopyMode >= CMODE_CopyFolder){
if (strstr(locout, locin) != NULL)
return newErrCode(TE_ERR_PATH_IN_PATH);
}
if (!strcmp(locin, locout)){
return newErrCode(TE_ERR_SAME_LOC);
}
char *dstPath = CombinePaths(locout, strrchr(locin, '/') + 1); char *dstPath = CombinePaths(locout, strrchr(locin, '/') + 1);
int res = 0; int res = 0;
ErrCode_t ret = newErrCode(0); ErrCode_t ret = newErrCode(0);

View file

@ -15,6 +15,7 @@
#include "../../script/parser.h" #include "../../script/parser.h"
#include "../../script/variables.h" #include "../../script/variables.h"
#include <storage/nx_sd.h> #include <storage/nx_sd.h>
#include "../../storage/emummc.h"
MenuEntry_t FileMenuEntries[] = { MenuEntry_t FileMenuEntries[] = {
{.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "-- File menu --"}, {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "-- File menu --"},
@ -83,6 +84,7 @@ void RunScript(char *path, FSEntry_t entry){
free(script); free(script);
dictVectorAdd(&ctx.varDict, newDict(CpyStr("_CWD"), (newVar(StringType, 0, .stringType = path)))); dictVectorAdd(&ctx.varDict, newDict(CpyStr("_CWD"), (newVar(StringType, 0, .stringType = path))));
dictVectorAdd(&ctx.varDict, newDict(CpyStr("_EMU"), (newVar(IntType, 0, emu_cfg.enabled))));
printError(mainLoop(&ctx)); printError(mainLoop(&ctx));

View file

@ -42,6 +42,10 @@ Vector_t extractVars(scriptCtx_t* ctx, lexarToken_t* tokens, u32 len) {
int distance = distanceBetweenTokens(&tokens[i + 1], len - i - 1, LSBracket, RSBracket); int distance = distanceBetweenTokens(&tokens[i + 1], len - i - 1, LSBracket, RSBracket);
i += distance + 1; i += distance + 1;
} }
if (tokens[i].token == LBracket){
int distance = distanceBetweenTokens(&tokens[i + 1], len - i - 1, LBracket, RBracket);
i += distance + 1;
}
if (tokens[i].token == Seperator) { if (tokens[i].token == Seperator) {
Variable_t res = solveEquation(ctx, &tokens[lastLoc], i - lastLoc, 0); Variable_t res = solveEquation(ctx, &tokens[lastLoc], i - lastLoc, 0);
lastLoc = i + 1; lastLoc = i + 1;

View file

@ -11,9 +11,17 @@
#include "../gfx/gfxutils.h" #include "../gfx/gfxutils.h"
#include "../hid/hid.h" #include "../hid/hid.h"
#include <utils/util.h> #include <utils/util.h>
#include "../fs/fscopy.h"
#include "../storage/mountmanager.h"
#include "../storage/emummc.h"
#include "../fs/readers/folderReader.h"
#include "../utils/utils.h"
#include "../storage/emmcfile.h"
#define scriptFunction(name) Variable_t name(scriptCtx_t *ctx, Variable_t *vars, u32 varLen) #define scriptFunction(name) Variable_t name(scriptCtx_t *ctx, Variable_t *vars, u32 varLen)
#define varInt(i) newVar(IntType, 0, i)
scriptFunction(funcIf) { scriptFunction(funcIf) {
setCurIndentInstruction(ctx, (vars[0].integerType == 0), 0, -1); setCurIndentInstruction(ctx, (vars[0].integerType == 0), 0, -1);
return NullVar; return NullVar;
@ -192,19 +200,22 @@ ColorCombo_t combos[] = {
{"YELLOW", COLOR_YELLOW}, {"YELLOW", COLOR_YELLOW},
{"GREEN", COLOR_GREEN}, {"GREEN", COLOR_GREEN},
{"BLUE", COLOR_BLUE}, {"BLUE", COLOR_BLUE},
{"VIOLET", COLOR_VIOLET}, {"VIOLET", COLOR_VIOLET}
{"WHITE", COLOR_WHITE}
}; };
// Args: Str u32 GetColor(char *color){
scriptFunction(funcSetColor){
for (int i = 0; i < ARR_LEN(combos); i++){ for (int i = 0; i < ARR_LEN(combos); i++){
if (!strcmp(combos[i].name, vars[0].stringType)){ if (!strcmp(combos[i].name, color)){
SETCOLOR(combos[i].color, COLOR_DEFAULT); return combos[i].color;
break;
} }
} }
return COLOR_WHITE;
}
// Args: Str
scriptFunction(funcSetColor){
SETCOLOR(GetColor(vars[0].stringType), COLOR_DEFAULT);
return NullVar; return NullVar;
} }
@ -222,6 +233,127 @@ scriptFunction(funcWait){
return NullVar; return NullVar;
} }
scriptFunction(funcGetVer){
int *arr = malloc(3 * sizeof(int));
arr[0] = LP_VER_MJ;
arr[1] = LP_VER_MN;
arr[2] = LP_VER_BF;
Vector_t res = vecFromArray(arr, 3, sizeof(int));
return newVar(IntArrayType, 1, .vectorType = res);
}
// Args: vec(str), int, (optional) vec(str)
scriptFunction(funcMakeMenu){
if (varLen == 3 && vars[2].vectorType.count != vars[0].vectorType.count)
return ErrVar(ERRSYNTAX);
Vector_t menuEntries = newVec(sizeof(MenuEntry_t), vars[0].vectorType.count);
vecDefArray(char**, names, vars[0].vectorType);
char **colors;
if (varLen == 3)
colors = vecGetArray(char**, vars[2].vectorType);
for (int i = 0; i < vars[0].vectorType.count; i++){
u32 color = COLORTORGB(((varLen == 3) ? GetColor(colors[i]) : COLOR_WHITE));
MenuEntry_t a = {.optionUnion = color, .name = names[i]};
vecAddElem(&menuEntries, a);
}
int res = newMenu(&menuEntries, vars[1].integerType, 78, 10, ENABLEB, menuEntries.count);
vecFree(menuEntries);
return varInt(res);
}
// Args: Str, Str
scriptFunction(funcCombinePath){
return newVar(StringType, 1, .stringType = CombinePaths(vars[0].stringType, vars[1].stringType));
}
// Args: Str
scriptFunction(funcEscFolder){
return newVar(StringType, 1, .stringType = EscapeFolder(vars[0].stringType));
}
// Args: Str, Str
scriptFunction(funcFileMove){
return varInt(f_rename(vars[0].stringType, vars[1].stringType));
}
// Args: Str, Str
scriptFunction(funcFileCopy){
return varInt(FileCopy(vars[0].stringType, vars[1].stringType, COPY_MODE_PRINT).err);
}
// Args: Str
scriptFunction(funcMmcConnect){
int res = 0;
if (!strcmp(vars[0].stringType, "SYSMMC"))
res = connectMMC(MMC_CONN_EMMC);
else if (!strcmp(vars[0].stringType, "EMUMMC") && emu_cfg.enabled)
res = connectMMC(MMC_CONN_EMUMMC);
else
return ErrVar(ERRFATALFUNCFAIL);
return varInt(res);
}
// Args: Str
scriptFunction(funcMmcMount){
return varInt((mountMMCPart(vars[0].stringType).err));
}
// Args: Str
scriptFunction(funcMkdir){
return varInt((f_mkdir(vars[0].stringType)));
}
scriptFunction(funcReadDir){
int res = 0;
Vector_t files = ReadFolder(vars[0].stringType, &res);
if (res){
clearFileVector(&files);
return ErrVar(ERRFATALFUNCFAIL);
}
vecDefArray(FSEntry_t*, fsEntries, files);
Vector_t fileNames = newVec(sizeof(char*), files.count);
Vector_t fileProperties = newVec(sizeof(int), files.count);
for (int i = 0; i < files.count; i++){
vecAddElem(&fileNames, fsEntries[i].name);
int isFolder = fsEntries[i].isDir;
vecAddElem(&fileProperties, isFolder);
}
vecFree(files);
dictVectorAdd(&ctx->varDict, newDict(CpyStr("fileProperties"), (newVar(IntArrayType, 1, .vectorType = fileProperties))));
return newVar(StringArrayType, 1, .vectorType = fileNames);
}
scriptFunction(funcCopyDir){
return varInt((FolderCopy(vars[0].stringType, vars[1].stringType).err));
}
scriptFunction(funcDelDir){
return varInt((FolderDelete(vars[0].stringType).err));
}
scriptFunction(funcDelFile){
return varInt((f_unlink(vars[0].stringType)));
}
scriptFunction(funcMmcDump){
return varInt((DumpOrWriteEmmcPart(vars[0].stringType, vars[1].stringType, 0, 1).err));
}
scriptFunction(funcMmcRestore){
return varInt((DumpOrWriteEmmcPart(vars[0].stringType, vars[1].stringType, 1, vars[2].integerType).err));
}
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 };
@ -229,6 +361,9 @@ u8 singleAny[] = { varArgs };
u8 singleStr[] = { StringType }; u8 singleStr[] = { StringType };
u8 singleByteArr[] = { ByteArrayType }; u8 singleByteArr[] = { ByteArrayType };
u8 StrByteVec[] = { StringType, ByteArrayType}; u8 StrByteVec[] = { StringType, ByteArrayType};
u8 MenuArgs[] = { StringArrayType, IntType, StringArrayType};
u8 twoStrings[] = { StringType, StringType };
u8 mmcReadWrite[] = { StringType, StringType, IntType};
functionStruct_t scriptFunctions[] = { functionStruct_t scriptFunctions[] = {
{"if", funcIf, 1, singleInt}, {"if", funcIf, 1, singleInt},
@ -252,6 +387,24 @@ functionStruct_t scriptFunctions[] = {
{"color", funcSetColor, 1, singleStr}, {"color", funcSetColor, 1, singleStr},
{"pause", funcPause, 0, NULL}, {"pause", funcPause, 0, NULL},
{"wait", funcWait, 1, singleInt}, {"wait", funcWait, 1, singleInt},
{"version", funcGetVer, 0, NULL},
{"menu", funcMakeMenu, 2, MenuArgs}, // for the optional arg
{"menu", funcMakeMenu, 3, MenuArgs},
{"pathCombine", funcCombinePath, 2, twoStrings},
{"pathEscFolder", funcEscFolder, 1, singleStr},
{"fileMove", funcFileMove, 2, twoStrings},
{"fileCopy", funcFileCopy, 2, twoStrings},
{"fileDel", funcDelFile, 1, singleStr},
{"mmcConnect", funcMmcConnect, 1, singleStr},
{"mmcMount", funcMmcMount, 1, singleStr},
{"mkdir", funcMkdir, 1, singleStr},
{"dirRead", funcReadDir, 1, singleStr},
{"dirCopy", funcCopyDir, 2, twoStrings},
{"dirDel", funcDelDir, 1, singleStr},
{"mmcDump", funcMmcDump, 2, mmcReadWrite},
{"mmcRestore", funcMmcRestore, 3, mmcReadWrite},
// Left from old: keyboard(?)
// Should implement still: saveSign, getNcaType
}; };
Variable_t executeFunction(scriptCtx_t* ctx, char* func_name, lexarToken_t *start, u32 len) { Variable_t executeFunction(scriptCtx_t* ctx, char* func_name, lexarToken_t *start, u32 len) {

View file

@ -134,7 +134,6 @@ typedef struct {
} scriptResult_t; } scriptResult_t;
#define newDict(strName, var) (dict_t) {strName, var} #define newDict(strName, var) (dict_t) {strName, var}
#define newVar(var, frii, value) (Variable_t) {.varType = var, .free = frii, value} #define newVar(var, frii, value) (Variable_t) {.varType = var, .free = frii, value}

View file

@ -125,6 +125,9 @@ ErrCode_t DumpOrWriteEmmcPart(const char *path, const char *part, u8 write, u8 f
if (!sd_mount()) if (!sd_mount())
return newErrCode(TE_ERR_NO_SD); return newErrCode(TE_ERR_NO_SD);
if (TConf.currentMMCConnected == MMC_CONN_None)
return newErrCode(TE_ERR_PARTITION_NOT_FOUND);
if (!memcmp(part, "BOOT0", 5)){ if (!memcmp(part, "BOOT0", 5)){
emummc_storage_set_mmc_partition(&emmc_storage, 1); emummc_storage_set_mmc_partition(&emmc_storage, 1);
lba_end = (BOOT_PART_SIZE / NX_EMMC_BLOCKSIZE) - 1; lba_end = (BOOT_PART_SIZE / NX_EMMC_BLOCKSIZE) - 1;

View file

@ -61,6 +61,9 @@ int connectMMC(u8 mmcType){
} }
ErrCode_t mountMMCPart(const char *partition){ ErrCode_t mountMMCPart(const char *partition){
if (TConf.currentMMCConnected == MMC_CONN_None)
return newErrCode(TE_ERR_PARTITION_NOT_FOUND);
unmountMMCPart(); unmountMMCPart();
emummc_storage_set_mmc_partition(&emmc_storage, 0); // why i have to do this twice beats me emummc_storage_set_mmc_partition(&emmc_storage, 0); // why i have to do this twice beats me

View file

@ -64,7 +64,7 @@ char *ShowKeyboard(const char *toEdit, u8 alwaysRet){
int posOnWord = 0; int posOnWord = 0;
bool shift = 0; bool shift = 0;
gfx_printf("* = exit | ~ = backspace | ^(left) = shift | _ = Space | + = add char\n\n"); gfx_printf("* = exit | ~ = backspace | ^(left) = shift | + = add char\n\n");
u32 x, y; u32 x, y;
gfx_con_getpos(&x, &y); gfx_con_getpos(&x, &y);