mirror of
https://github.com/suchmememanyskill/TegraExplorer.git
synced 2024-11-22 03:46:40 +00:00
add embedding TE scripts
This commit is contained in:
parent
e49f184f9b
commit
27350c0a5f
6 changed files with 142 additions and 16 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -12,3 +12,7 @@ source/script/*.te
|
||||||
source/script/.vs
|
source/script/.vs
|
||||||
|
|
||||||
*.exe
|
*.exe
|
||||||
|
|
||||||
|
source/script/builtin.c
|
||||||
|
|
||||||
|
source/script/builtin.h
|
||||||
|
|
12
scripts/HelloWorld.te
Normal file
12
scripts/HelloWorld.te
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#REQUIRE VER 3.0.6
|
||||||
|
#REQUIRE MINERVA
|
||||||
|
#REQUIRE KEYS
|
||||||
|
|
||||||
|
a="Hello world!\n"
|
||||||
|
a.print()
|
||||||
|
|
||||||
|
i=0
|
||||||
|
while (i<10){
|
||||||
|
println(i)
|
||||||
|
i=i+1
|
||||||
|
}
|
|
@ -72,6 +72,23 @@ void DeleteFile(char *path, FSEntry_t entry){
|
||||||
free(thing);
|
free(thing);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RunScriptString(char *str, u32 size){
|
||||||
|
gfx_clearscreen();
|
||||||
|
ParserRet_t ret = parseScript(str, size);
|
||||||
|
setStaticVars(&ret.staticVarHolder);
|
||||||
|
initRuntimeVars();
|
||||||
|
Variable_t* res = eval(ret.main.operations.data, ret.main.operations.count, 1);
|
||||||
|
|
||||||
|
exitRuntimeVars();
|
||||||
|
exitStaticVars(&ret.staticVarHolder);
|
||||||
|
exitFunction(ret.main.operations.data, ret.main.operations.count);
|
||||||
|
vecFree(ret.staticVarHolder);
|
||||||
|
vecFree(ret.main.operations);
|
||||||
|
|
||||||
|
hidWait();
|
||||||
|
hidWait();
|
||||||
|
}
|
||||||
|
|
||||||
void RunScript(char *path, FSEntry_t entry){
|
void RunScript(char *path, FSEntry_t entry){
|
||||||
char *thing = CombinePaths(path, entry.name);
|
char *thing = CombinePaths(path, entry.name);
|
||||||
u32 size;
|
u32 size;
|
||||||
|
|
|
@ -4,4 +4,5 @@
|
||||||
typedef void (*fileMenuPath)(char *path, FSEntry_t entry);
|
typedef void (*fileMenuPath)(char *path, FSEntry_t entry);
|
||||||
|
|
||||||
void FileMenu(char *path, FSEntry_t entry);
|
void FileMenu(char *path, FSEntry_t entry);
|
||||||
void RunScript(char *path, FSEntry_t entry);
|
void RunScript(char *path, FSEntry_t entry);
|
||||||
|
void RunScriptString(char *str, u32 size);
|
|
@ -22,6 +22,12 @@
|
||||||
#include <mem/heap.h>
|
#include <mem/heap.h>
|
||||||
#include "../fs/menus/filemenu.h"
|
#include "../fs/menus/filemenu.h"
|
||||||
|
|
||||||
|
//#define INCLUDE_BUILTIN_SCRIPTS 1
|
||||||
|
|
||||||
|
#ifdef INCLUDE_BUILTIN_SCRIPTS
|
||||||
|
#include "../script/builtin.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
extern hekate_config h_cfg;
|
extern hekate_config h_cfg;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -182,25 +188,34 @@ void EnterMainMenu(){
|
||||||
mainMenuEntries[MainRebootRCM].hide = h_cfg.t210b01;
|
mainMenuEntries[MainRebootRCM].hide = h_cfg.t210b01;
|
||||||
|
|
||||||
// -- Scripts --
|
// -- Scripts --
|
||||||
|
#ifndef INCLUDE_BUILTIN_SCRIPTS
|
||||||
mainMenuEntries[MainScripts].hide = (!sd_mounted || !FileExists("sd:/tegraexplorer/scripts"));
|
mainMenuEntries[MainScripts].hide = (!sd_mounted || !FileExists("sd:/tegraexplorer/scripts"));
|
||||||
|
#else
|
||||||
|
mainMenuEntries[MainScripts].hide = ((!sd_mounted || !FileExists("sd:/tegraexplorer/scripts")) && !EMBEDDED_SCRIPTS_LEN);
|
||||||
|
#endif
|
||||||
|
|
||||||
Vector_t ent = vecFromArray(mainMenuEntries, ARR_LEN(mainMenuEntries), sizeof(MenuEntry_t));
|
Vector_t ent = newVec(sizeof(MenuEntry_t), ARRAY_SIZE(mainMenuEntries));
|
||||||
|
ent.count = ARRAY_SIZE(mainMenuEntries);
|
||||||
|
memcpy(ent.data, mainMenuEntries, sizeof(MenuEntry_t) * ARRAY_SIZE(mainMenuEntries));
|
||||||
Vector_t scriptFiles = {0};
|
Vector_t scriptFiles = {0};
|
||||||
u8 hasScripts = 0;
|
u8 hasScripts = 0;
|
||||||
|
|
||||||
if (!mainMenuEntries[MainScripts].hide){
|
#ifdef INCLUDE_BUILTIN_SCRIPTS
|
||||||
int res = 0;
|
for (int i = 0; i < EMBEDDED_SCRIPTS_LEN; i++){
|
||||||
|
MenuEntry_t m = {.name = embedded_scripts_g[i].name, .optionUnion = COLORTORGB(COLOR_BLUE), .icon = 128};
|
||||||
|
vecAdd(&ent, m);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (sd_mounted && FileExists("sd:/tegraexplorer/scripts")){
|
||||||
scriptFiles = ReadFolder("sd:/tegraexplorer/scripts", &res);
|
scriptFiles = ReadFolder("sd:/tegraexplorer/scripts", &res);
|
||||||
if (!res){
|
if (!res){
|
||||||
if (!scriptFiles.count){
|
if (!scriptFiles.count){
|
||||||
free(scriptFiles.data);
|
FREE(scriptFiles.data);
|
||||||
mainMenuEntries[MainScripts].hide = 1;
|
mainMenuEntries[MainScripts].hide = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
hasScripts = 1;
|
hasScripts = 1;
|
||||||
ent = newVec(sizeof(MenuEntry_t), ARRAY_SIZE(mainMenuEntries) + scriptFiles.count);
|
|
||||||
ent.count = ARRAY_SIZE(mainMenuEntries);
|
|
||||||
memcpy(ent.data, mainMenuEntries, sizeof(MenuEntry_t) * ARRAY_SIZE(mainMenuEntries));
|
|
||||||
vecForEach(FSEntry_t*, scriptFile, (&scriptFiles)){
|
vecForEach(FSEntry_t*, scriptFile, (&scriptFiles)){
|
||||||
if (!scriptFile->isDir && StrEndsWith(scriptFile->name, ".te")){
|
if (!scriptFile->isDir && StrEndsWith(scriptFile->name, ".te")){
|
||||||
MenuEntry_t a = MakeMenuOutFSEntry(*scriptFile);
|
MenuEntry_t a = MakeMenuOutFSEntry(*scriptFile);
|
||||||
|
@ -210,14 +225,13 @@ void EnterMainMenu(){
|
||||||
|
|
||||||
if (ent.count == ARRAY_SIZE(mainMenuEntries)){
|
if (ent.count == ARRAY_SIZE(mainMenuEntries)){
|
||||||
clearFileVector(&scriptFiles);
|
clearFileVector(&scriptFiles);
|
||||||
free(ent.data);
|
|
||||||
ent = vecFromArray(mainMenuEntries, ARR_LEN(mainMenuEntries), sizeof(MenuEntry_t));
|
|
||||||
hasScripts = 0;
|
hasScripts = 0;
|
||||||
mainMenuEntries[MainScripts].hide = 1;
|
mainMenuEntries[MainScripts].hide = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
gfx_clearscreen();
|
gfx_clearscreen();
|
||||||
gfx_putc('\n');
|
gfx_putc('\n');
|
||||||
|
@ -226,17 +240,28 @@ void EnterMainMenu(){
|
||||||
if (res < MainScripts && mainMenuPaths[res] != NULL)
|
if (res < MainScripts && mainMenuPaths[res] != NULL)
|
||||||
mainMenuPaths[res]();
|
mainMenuPaths[res]();
|
||||||
else if (hasScripts){
|
else if (hasScripts){
|
||||||
vecDefArray(MenuEntry_t*, entArray, ent);
|
#ifdef INCLUDE_BUILTIN_SCRIPTS
|
||||||
MenuEntry_t entry = entArray[res];
|
if (res - ARRAY_SIZE(mainMenuEntries) < EMBEDDED_SCRIPTS_LEN){
|
||||||
FSEntry_t fsEntry = {.name = entry.name, .sizeUnion = entry.sizeUnion};
|
char *script = embedded_scripts_g[res - ARRAY_SIZE(mainMenuEntries)].script;
|
||||||
RunScript("sd:/tegraexplorer/scripts", fsEntry);
|
RunScriptString(script, strlen(script));
|
||||||
hidWait();
|
}
|
||||||
|
else {
|
||||||
|
#endif
|
||||||
|
vecDefArray(MenuEntry_t*, entArray, ent);
|
||||||
|
MenuEntry_t entry = entArray[res];
|
||||||
|
FSEntry_t fsEntry = {.name = entry.name, .sizeUnion = entry.sizeUnion};
|
||||||
|
RunScript("sd:/tegraexplorer/scripts", fsEntry);
|
||||||
|
hidWait();
|
||||||
|
#ifdef INCLUDE_BUILTIN_SCRIPTS
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasScripts){
|
if (hasScripts){
|
||||||
clearFileVector(&scriptFiles);
|
clearFileVector(&scriptFiles);
|
||||||
free(ent.data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(ent.data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
67
te2c.py
Normal file
67
te2c.py
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
"""
|
||||||
|
Usage: python te2c.py dest src_folder
|
||||||
|
Usage for TE: py te2c.py source/script/builtin scripts
|
||||||
|
Creator: https://github.com/maddiethecafebabe
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import string
|
||||||
|
from typing import List, Tuple, Dict
|
||||||
|
|
||||||
|
IDENTCHARS = string.ascii_letters + string.digits
|
||||||
|
|
||||||
|
SOURCE_HEADER = """ /* this file has been autogenerated with te2c.py */
|
||||||
|
#include "{}"\n
|
||||||
|
"""
|
||||||
|
|
||||||
|
HEADER_DEF = """ /* this file has been autogenerated with te2c.py */
|
||||||
|
#ifndef TE_EMBEDDED_SCRIPTS_H
|
||||||
|
#define TE_EMBEDDED_SCRIPTS_H
|
||||||
|
|
||||||
|
typedef struct {{
|
||||||
|
const char const * script;
|
||||||
|
const char const * name;
|
||||||
|
}} embedded_script_t;
|
||||||
|
|
||||||
|
extern const embedded_script_t embedded_scripts_g[];
|
||||||
|
|
||||||
|
#define EMBEDDED_SCRIPTS_LEN {}
|
||||||
|
|
||||||
|
#endif /* TE_EMBEDDED_SCRIPTS_H */
|
||||||
|
"""
|
||||||
|
|
||||||
|
def gather_scripts(path: str, suffix: str=".te") -> List[Tuple[str, str]]:
|
||||||
|
files = []
|
||||||
|
for dirname, _, filenames in os.walk(path):
|
||||||
|
files += [(f, os.path.join(dirname, f)) for f in filenames if f.endswith(suffix)]
|
||||||
|
return files
|
||||||
|
|
||||||
|
def process_script(path: str) -> str:
|
||||||
|
with open(path, "r") as fp:
|
||||||
|
raw = fp.readlines()
|
||||||
|
return str().join(line.__repr__()[1:-1].replace("\"", "\\\"").replace("\\t", "") for line in raw)
|
||||||
|
|
||||||
|
def process_name(name: str) -> str:
|
||||||
|
return "script_" + str().join(c for c in name.split(".")[0] if c in IDENTCHARS) + "_g"
|
||||||
|
|
||||||
|
def map_scripts_from(path: str, suffix: str=".te") -> Dict[str, Dict[str, str]]:
|
||||||
|
return {process_name(name): {"script": process_script(path), "og-name": name} for (name, path) in gather_scripts(path, suffix=suffix)}
|
||||||
|
|
||||||
|
def te2c(dest: str, path: str, suffix: str=".te"):
|
||||||
|
script_map = map_scripts_from(path, suffix=suffix)
|
||||||
|
with open(dest + ".c", "w") as fp:
|
||||||
|
fp.write(SOURCE_HEADER.format(os.path.basename(dest) + ".h"))
|
||||||
|
fp.write(
|
||||||
|
"const embedded_script_t embedded_scripts_g[] = {{\n{}}};\n".format(
|
||||||
|
str().join(
|
||||||
|
f"\t{{ .name = \"{vals['og-name']}\", .script = \"{vals['script']}\"}}, \n" for name, vals in script_map.items()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
with open(dest + ".h", "w") as fp:
|
||||||
|
fp.write(HEADER_DEF.format(len(script_map)))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
te2c(dest=sys.argv[1], path=sys.argv[2])
|
Loading…
Reference in a new issue