mirror of
https://github.com/suchmememanyskill/TegraExplorer.git
synced 2024-11-22 20:06:43 +00:00
Add scripting to TE
This commit is contained in:
parent
eb8652c6ec
commit
1a2fd158e9
6 changed files with 228 additions and 4 deletions
|
@ -102,13 +102,12 @@ void disconnect_mmc(){
|
||||||
switch (currentlyMounted){
|
switch (currentlyMounted){
|
||||||
case SYSMMC:
|
case SYSMMC:
|
||||||
sdmmc_storage_end(&storage);
|
sdmmc_storage_end(&storage);
|
||||||
currentlyMounted = -1;
|
|
||||||
break;
|
break;
|
||||||
case EMUMMC:
|
case EMUMMC:
|
||||||
emummc_storage_end(&storage);
|
emummc_storage_end(&storage);
|
||||||
currentlyMounted = -1;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
currentlyMounted = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dump_biskeys(){
|
int dump_biskeys(){
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "../gfx/gfx.h"
|
#include "../gfx/gfx.h"
|
||||||
#include "../utils/util.h"
|
#include "../utils/util.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
|
#include "script.h"
|
||||||
|
|
||||||
fs_entry *fileobjects;
|
fs_entry *fileobjects;
|
||||||
char rootpath[10] = "";
|
char rootpath[10] = "";
|
||||||
|
@ -18,7 +19,7 @@ u8 clipboardhelper = 0;
|
||||||
extern const char sizevalues[4][3];
|
extern const char sizevalues[4][3];
|
||||||
extern int launch_payload(char *path);
|
extern int launch_payload(char *path);
|
||||||
|
|
||||||
menu_item explfilemenu[10] = {
|
menu_item explfilemenu[11] = {
|
||||||
{"-- File Menu --", COLOR_BLUE, -1, 0},
|
{"-- File Menu --", COLOR_BLUE, -1, 0},
|
||||||
{"FILE", COLOR_GREEN, -1, 0},
|
{"FILE", COLOR_GREEN, -1, 0},
|
||||||
{"\nSIZE", COLOR_VIOLET, -1, 0},
|
{"\nSIZE", COLOR_VIOLET, -1, 0},
|
||||||
|
@ -28,6 +29,7 @@ menu_item explfilemenu[10] = {
|
||||||
{"Move to clipboard", COLOR_BLUE, MOVE, 1},
|
{"Move to clipboard", COLOR_BLUE, MOVE, 1},
|
||||||
{"\nDelete file\n", COLOR_RED, DELETE, 1},
|
{"\nDelete file\n", COLOR_RED, DELETE, 1},
|
||||||
{"Launch Payload", COLOR_ORANGE, PAYLOAD, 1},
|
{"Launch Payload", COLOR_ORANGE, PAYLOAD, 1},
|
||||||
|
{"Launch Script", COLOR_BLUE, SCRIPT, 1},
|
||||||
{"View Hex", COLOR_GREEN, HEXVIEW, 1}
|
{"View Hex", COLOR_GREEN, HEXVIEW, 1}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -309,7 +311,12 @@ int filemenu(fs_entry file){
|
||||||
else
|
else
|
||||||
explfilemenu[8].property = -1;
|
explfilemenu[8].property = -1;
|
||||||
|
|
||||||
temp = makemenu(explfilemenu, 10);
|
if (strstr(file.name, ".tegrascript") != NULL)
|
||||||
|
explfilemenu[9].property = 1;
|
||||||
|
else
|
||||||
|
explfilemenu[9].property = -1;
|
||||||
|
|
||||||
|
temp = makemenu(explfilemenu, 11);
|
||||||
|
|
||||||
switch (temp){
|
switch (temp){
|
||||||
case COPY:
|
case COPY:
|
||||||
|
@ -324,6 +331,9 @@ int filemenu(fs_entry file){
|
||||||
case PAYLOAD:
|
case PAYLOAD:
|
||||||
launch_payload(getnextloc(currentpath, file.name));
|
launch_payload(getnextloc(currentpath, file.name));
|
||||||
break;
|
break;
|
||||||
|
case SCRIPT:
|
||||||
|
ParseScript(getnextloc(currentpath, file.name));
|
||||||
|
break;
|
||||||
case HEXVIEW:
|
case HEXVIEW:
|
||||||
viewbytes(getnextloc(currentpath, file.name));
|
viewbytes(getnextloc(currentpath, file.name));
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -34,6 +34,7 @@ enum filemenuoptions {
|
||||||
MOVE,
|
MOVE,
|
||||||
DELETE,
|
DELETE,
|
||||||
PAYLOAD,
|
PAYLOAD,
|
||||||
|
SCRIPT,
|
||||||
HEXVIEW
|
HEXVIEW
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
191
source/tegraexplorer/script.c
Normal file
191
source/tegraexplorer/script.c
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
#include <string.h>
|
||||||
|
#include "../mem/heap.h"
|
||||||
|
#include "gfx.h"
|
||||||
|
#include "fs.h"
|
||||||
|
#include "io.h"
|
||||||
|
#include "emmc.h"
|
||||||
|
#include "../utils/types.h"
|
||||||
|
#include "../libs/fatfs/ff.h"
|
||||||
|
#include "../utils/sprintf.h"
|
||||||
|
#include "../utils/btn.h"
|
||||||
|
#include "../gfx/gfx.h"
|
||||||
|
#include "../utils/util.h"
|
||||||
|
#include "script.h"
|
||||||
|
|
||||||
|
char func[11] = "", args[2][128] = {"", ""};
|
||||||
|
int res;
|
||||||
|
script_parts parts[] = {
|
||||||
|
{"COPY", Part_Copy, 2},
|
||||||
|
{"COPY-R", Part_RecursiveCopy, 2},
|
||||||
|
{"MKDIR", Part_MakeFolder, 1},
|
||||||
|
{"CON_MMC", Part_ConnectMMC, 1},
|
||||||
|
{"MNT_MMC", Part_MountMMC, 1},
|
||||||
|
{"PRINT", Part_Print, 1},
|
||||||
|
{"ERRPRINT", Part_ErrorPrint, 0},
|
||||||
|
{"EXIT", Part_Exit, 0},
|
||||||
|
{"PAUSE", Part_WaitOnUser, 0},
|
||||||
|
{"NULL", NULL, -1}
|
||||||
|
};
|
||||||
|
|
||||||
|
int Part_Copy(){
|
||||||
|
return copy(args[0], args[1], true, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Part_RecursiveCopy(){
|
||||||
|
return copy_recursive(args[0], args[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Part_MakeFolder(){
|
||||||
|
return f_mkdir(args[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Part_ConnectMMC(){
|
||||||
|
if (strcmpcheck(args[0], "SYSMMC"))
|
||||||
|
connect_mmc(SYSMMC);
|
||||||
|
if (strcmpcheck(args[0], "EMUMMC"))
|
||||||
|
connect_mmc(EMUMMC);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Part_MountMMC(){
|
||||||
|
return mount_mmc(args[0], 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Part_Print(){
|
||||||
|
RESETCOLOR;
|
||||||
|
gfx_printf(args[0]);
|
||||||
|
gfx_printf("\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Part_ErrorPrint(){
|
||||||
|
gfx_printf("Errorcode: %d\n", res);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool forceExit = false;
|
||||||
|
int Part_Exit(){
|
||||||
|
forceExit = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Part_WaitOnUser(){
|
||||||
|
return (btn_wait() & BTN_POWER);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ParsePart(){
|
||||||
|
int i;
|
||||||
|
for (i = 0; parts[i].arg_amount != -1; i++){
|
||||||
|
if (strcmpcheck(func, parts[i].name))
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
FIL in;
|
||||||
|
UINT endByte = 0;
|
||||||
|
|
||||||
|
char GetNextByte(){
|
||||||
|
char single;
|
||||||
|
f_read(&in, &single, sizeof(char), &endByte);
|
||||||
|
|
||||||
|
if (sizeof(char) != endByte)
|
||||||
|
forceExit = true;
|
||||||
|
|
||||||
|
return single;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParseScript(char* path){
|
||||||
|
char currentchar;
|
||||||
|
int strlength;
|
||||||
|
bool inifstatement = false;
|
||||||
|
forceExit = false;
|
||||||
|
|
||||||
|
clearscreen();
|
||||||
|
|
||||||
|
res = f_open(&in, path, FA_READ | FA_OPEN_EXISTING);
|
||||||
|
if (res != FR_OK){
|
||||||
|
message(COLOR_RED, "File Opening Failed\nErrcode %d", res);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1){
|
||||||
|
currentchar = GetNextByte();
|
||||||
|
|
||||||
|
if (endByte == 0 || currentchar == (char)EOF)
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch(currentchar){
|
||||||
|
case '{':
|
||||||
|
if (!inifstatement)
|
||||||
|
while (currentchar != '}')
|
||||||
|
currentchar = GetNextByte();
|
||||||
|
|
||||||
|
break;
|
||||||
|
case '}':
|
||||||
|
if (inifstatement)
|
||||||
|
inifstatement = false;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case '<':
|
||||||
|
strlength = 0;
|
||||||
|
currentchar = GetNextByte();
|
||||||
|
|
||||||
|
while (currentchar != '>'){
|
||||||
|
func[strlength++] = currentchar;
|
||||||
|
currentchar = GetNextByte();
|
||||||
|
}
|
||||||
|
func[strlength] = '\0';
|
||||||
|
|
||||||
|
res = ParsePart();
|
||||||
|
if (res == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (int i = 0; i < parts[res].arg_amount; i++){
|
||||||
|
while (currentchar != 0x22)
|
||||||
|
currentchar = GetNextByte();
|
||||||
|
|
||||||
|
strlength = 0;
|
||||||
|
currentchar = GetNextByte();
|
||||||
|
while (currentchar != 0x22){
|
||||||
|
args[i][strlength++] = currentchar;
|
||||||
|
currentchar = GetNextByte();
|
||||||
|
}
|
||||||
|
args[i][strlength] = '\0';
|
||||||
|
|
||||||
|
if (i < parts[res].arg_amount)
|
||||||
|
currentchar = GetNextByte();
|
||||||
|
}
|
||||||
|
res = parts[res].handler();
|
||||||
|
break;
|
||||||
|
case '$':
|
||||||
|
strlength = 0;
|
||||||
|
currentchar = GetNextByte();
|
||||||
|
|
||||||
|
while (currentchar != '$'){
|
||||||
|
func[strlength++] = currentchar;
|
||||||
|
currentchar = GetNextByte();
|
||||||
|
}
|
||||||
|
func[strlength] = '\0';
|
||||||
|
|
||||||
|
if (strcmpcheck(func, "ERROR") || strcmpcheck(func, "TRUE")){
|
||||||
|
if (res)
|
||||||
|
inifstatement = true;
|
||||||
|
}
|
||||||
|
else if (strcmpcheck(func, "NOERROR") || strcmpcheck(func, "FALSE")){
|
||||||
|
if (!res)
|
||||||
|
inifstatement = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inifstatement)
|
||||||
|
while(currentchar != '{')
|
||||||
|
currentchar = GetNextByte();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f_close(&in);
|
||||||
|
}
|
21
source/tegraexplorer/script.h
Normal file
21
source/tegraexplorer/script.h
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#pragma once
|
||||||
|
#define strcmpcheck(x, y) (!strcmp(x, y))
|
||||||
|
|
||||||
|
typedef int (*part_handler)();
|
||||||
|
typedef struct _script_parts {
|
||||||
|
char name[11];
|
||||||
|
part_handler handler;
|
||||||
|
short arg_amount;
|
||||||
|
} script_parts;
|
||||||
|
|
||||||
|
void ParseScript(char* path);
|
||||||
|
int Part_WaitOnUser();
|
||||||
|
int Part_Exit();
|
||||||
|
int Part_ErrorPrint();
|
||||||
|
int Part_Print();
|
||||||
|
int Part_MountMMC();
|
||||||
|
int Part_ConnectMMC();
|
||||||
|
int Part_MakeFolder();
|
||||||
|
int Part_RecursiveCopy();
|
||||||
|
int Testing_Part_Handler();
|
||||||
|
int Part_Copy();
|
|
@ -115,6 +115,8 @@ void te_main(){
|
||||||
mainmenu[6].property = -2;
|
mainmenu[6].property = -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
disconnect_mmc();
|
||||||
|
|
||||||
while (1){
|
while (1){
|
||||||
fillmainmenu();
|
fillmainmenu();
|
||||||
res = makemenu(mainmenu, MAINMENU_AMOUNT);
|
res = makemenu(mainmenu, MAINMENU_AMOUNT);
|
||||||
|
|
Loading…
Reference in a new issue