1
0
Fork 0
mirror of https://github.com/suchmememanyskill/TegraExplorer.git synced 2024-11-26 22:02:08 +00:00

Add arg recognition + more command reading

This commit is contained in:
Such Meme, Many Skill 2020-03-30 22:40:59 +02:00
parent 9aff029ee4
commit 887972d67c

View file

@ -24,21 +24,22 @@ u32 countchars(char* in, char target) {
return count; return count;
} }
char **args = NULL; char **argv = NULL;
u32 argc;
u32 splitargs(char* in) { u32 splitargs(char* in) {
// arg like '5, "6", @arg7' // arg like '5, "6", @arg7'
u32 i, current = 0, count = countchars(in, ',') + 1, len = strlen(in), curcount = 0; u32 i, current = 0, count = countchars(in, ',') + 1, len = strlen(in), curcount = 0;
if (args != NULL) { if (argv != NULL) {
for (i = 0; args[i] != NULL; i++) for (i = 0; argv[i] != NULL; i++)
free(args[i]); free(argv[i]);
free(args); free(argv);
} }
args = calloc(count + 1, sizeof(char*)); argv = calloc(count + 1, sizeof(char*));
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
args[i] = calloc(128, sizeof(char)); argv[i] = calloc(128, sizeof(char));
for (i = 0; i < len && curcount < count; i++) { for (i = 0; i < len && curcount < count; i++) {
@ -48,16 +49,16 @@ u32 splitargs(char* in) {
} }
else if (in[i] == '@' || in[i] == '$') { else if (in[i] == '@' || in[i] == '$') {
while (in[i] != ',' && in[i] != ' ' && in[i] != ')' && i < len) { while (in[i] != ',' && in[i] != ' ' && in[i] != ')' && i < len) {
args[curcount][current++] = in[i++]; argv[curcount][current++] = in[i++];
} }
i--; i--;
} }
else if (in[i] >= '0' && in[i] <= '9') else if (in[i] >= '0' && in[i] <= '9')
args[curcount][current++] = in[i]; argv[curcount][current++] = in[i];
else if (in[i] == '"') { else if (in[i] == '"') {
i++; i++;
while (in[i] != '"') { while (in[i] != '"') {
args[curcount][current++] = in[i++]; argv[curcount][current++] = in[i++];
} }
} }
} }
@ -75,71 +76,121 @@ char getnextchar(){
if (sizeof(char) != endByte) if (sizeof(char) != endByte)
forceExit = true; forceExit = true;
gfx_printf("|%c|", currentchar); //gfx_printf("|%c|", currentchar);
return currentchar; return currentchar;
} }
void getfollowingchar(char end){ void getfollowingchar(char end){
while (currentchar != end){ while (currentchar != end){
getnextchar();
if (currentchar == '"'){ if (currentchar == '"'){
while (getnextchar() != '"'); while (getnextchar() != '"');
} }
getnextchar();
} }
} }
void getnextvalidchar(){ void getnextvalidchar(){
while (!((currentchar >= '0' && currentchar <= 'Z') || (currentchar >= 'a' && currentchar <= 'z') || currentchar == '#' || currentchar == '@')) while ((!((currentchar >= '0' && currentchar <= 'Z') || (currentchar >= 'a' && currentchar <= 'z') || currentchar == '#' || currentchar == '@') && !f_eof(&scriptin)) || currentchar == ';')
getnextchar(); getnextchar();
} }
void mainparser(){ void functionparser(){
char *unsplitargs; char *unsplitargs;
FSIZE_t curoffset; FSIZE_t fileoffset;
u32 argsize = 0; u32 argsize = 0;
//gfx_printf("getting func %c\n", currentchar);
char *funcbuff = calloc(20, sizeof(char));
for (int i = 0; i < 19 && currentchar != '(' && currentchar != ' '; i++){
funcbuff[i] = currentchar;
getnextchar();
}
getfollowingchar('(');
getnextchar();
//gfx_printf("getting arg len %c\n", currentchar);
fileoffset = f_tell(&scriptin);
getfollowingchar(')');
argsize = f_tell(&scriptin) - fileoffset;
f_lseek(&scriptin, fileoffset - 1);
getnextchar();
//gfx_printf("getting args %c\n", currentchar);
unsplitargs = calloc(argsize + 1, sizeof(char));
for (int i = 0; i < argsize; i++){
unsplitargs[i] = currentchar;
getnextchar();
}
//gfx_printf("parsing args %c\n", currentchar);
argc = splitargs(unsplitargs);
getnextchar();
gfx_printf("\n\nFunc: %s\n", funcbuff, currentchar);
gfx_printf("Split: %s\n", unsplitargs);
for (int i = 0; i < argc; i++)
gfx_printf("%d | %s\n", i, argv[i]);
free(unsplitargs);
free(funcbuff);
}
char *gettargetvar(){
char *variable = NULL;
FSIZE_t fileoffset;
u32 varsize = 0;
fileoffset = f_tell(&scriptin);
getfollowingchar('=');
varsize = f_tell(&scriptin) - fileoffset;
f_lseek(&scriptin, fileoffset - 1);
variable = calloc(varsize + 1, sizeof(char));
getnextchar();
for (int i = 0; i < varsize; i++){
if (currentchar == ' ')
break;
variable[i] = currentchar;
getnextchar();
}
getfollowingchar('=');
getnextchar();
return variable;
}
void mainparser(){
char *variable = NULL;
FSIZE_t fileoffset;
u32 varsize = 0;
getnextvalidchar(); getnextvalidchar();
if (f_eof(&scriptin))
return;
if (currentchar == '#'){ if (currentchar == '#'){
getfollowingchar('\n'); getfollowingchar('\n');
return; return;
} }
gfx_printf("Getting func name...\n"); if (currentchar == '@'){
char *funcbuff = calloc(20, sizeof(char)); variable = gettargetvar();
for (int i = 0; i < 19 && currentchar != '(' && currentchar != ' '; i++){ getnextvalidchar();
funcbuff[i] = currentchar;
getnextchar();
}
gfx_printf("Skipping to next (...\n");
getfollowingchar('(');
getnextchar();
curoffset = f_tell(&scriptin);
gfx_printf("Skipping to next )...\n");
getfollowingchar(')');
argsize = f_tell(&scriptin) - curoffset;
f_lseek(&scriptin, curoffset - 1);
gfx_printf("Getting args...\nSize: %d\n", argsize);
getnextchar();
unsplitargs = calloc(argsize, sizeof(char));
for (int i = 0; i < argsize; i++){
unsplitargs[i] = currentchar;
getnextchar();
} }
gfx_printf("Splitting args...\n"); functionparser();
int argcount = splitargs(unsplitargs); if (variable != NULL)
gfx_printf("target: %s", variable);
gfx_printf("\n\nFunc: %s\n", funcbuff); free(variable);
gfx_printf("Split: %s\n", unsplitargs);
for (int i = 0; i < argcount; i++)
gfx_printf("%d | %s\n", i, args[i]);
free(unsplitargs);
free(funcbuff);
} }
void tester(char *path){ void tester(char *path){
@ -153,9 +204,13 @@ void tester(char *path){
return; return;
} }
printerrors = false; printerrors = false;
while (!f_eof(&scriptin)){
mainparser(); mainparser();
}
f_close(&scriptin);
btn_wait(); btn_wait();
} }