233 lines
5.1 KiB
C++
233 lines
5.1 KiB
C++
|
|
||
|
#if defined(GEKKO)
|
||
|
#include "lexer.hpp"
|
||
|
#include "parser.hpp"
|
||
|
#include <cstdio>
|
||
|
#include <cstdlib>
|
||
|
#include <gccore.h>
|
||
|
#include <dirent.h>
|
||
|
#include <sys/stat.h>
|
||
|
|
||
|
#include <fat.h>
|
||
|
#if defined(HW_RVL)
|
||
|
#include <wiiuse/wpad.h>
|
||
|
#endif
|
||
|
#include <ogc/pad.h>
|
||
|
static void *xfb = NULL;
|
||
|
static GXRModeObj *rmode = NULL;
|
||
|
BoxScript::ListNode* _root_node;
|
||
|
|
||
|
void clear_screen_ogc()
|
||
|
{
|
||
|
VIDEO_ClearFrameBuffer(rmode,xfb,0);
|
||
|
}
|
||
|
int appstate=0;
|
||
|
std::string read_file(std::string name)
|
||
|
{
|
||
|
FILE* f=fopen(name.c_str(),"r");
|
||
|
std::string text="";
|
||
|
while(true)
|
||
|
{
|
||
|
int read = fgetc(f);
|
||
|
if(read == EOF) break;
|
||
|
text += (char)read;
|
||
|
}
|
||
|
fclose(f);
|
||
|
return text;
|
||
|
}
|
||
|
bool DirExists(std::string path)
|
||
|
{
|
||
|
DIR* dir;
|
||
|
bool exists = false;
|
||
|
dir = opendir(path.c_str());
|
||
|
if(dir != NULL)
|
||
|
{
|
||
|
exists=true;
|
||
|
(void)closedir(dir);
|
||
|
}
|
||
|
return exists;
|
||
|
}
|
||
|
|
||
|
void LoadSubscripts(BoxScript::ListNode* nodes,std::string path)
|
||
|
{
|
||
|
std::vector<std::string> files = get_files(path);
|
||
|
for(std::string file : files)
|
||
|
{
|
||
|
std::string newPath = path + "/" + file;
|
||
|
std::vector<BoxScript::Lexer::LexToken> tokens=BoxScript::Lexer::Lex(read_file(newPath));
|
||
|
BoxScript::Parse(nodes,tokens);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
void PrintElement(std::string text,bool checked)
|
||
|
{
|
||
|
printf("\t[%c] %s\n",checked ? '*' : ' ', text.c_str());
|
||
|
}
|
||
|
void LoadScript(BoxScript::ListNode* nodes)
|
||
|
{
|
||
|
if(!DirExists("/BoxScript"))
|
||
|
{
|
||
|
mkdir("/BoxScript",0755);
|
||
|
}
|
||
|
if(DirExists("/BoxScript/Autoboot"))
|
||
|
{
|
||
|
if(DirExists("/BoxScript/Autoboot/deps"))
|
||
|
LoadSubscripts(nodes,"/BoxScript/Autoboot/deps");
|
||
|
|
||
|
std::vector<BoxScript::Lexer::LexToken> tokens=BoxScript::Lexer::Lex(read_file("/BoxScript/Autoboot/app.bs"));
|
||
|
BoxScript::Parse(nodes,tokens);
|
||
|
}else{
|
||
|
std::vector<std::string> dirs= get_directories("/BoxScript");
|
||
|
int item=0;
|
||
|
while(appstate != -1)
|
||
|
{
|
||
|
#if defined(HW_RVL)
|
||
|
WPAD_ScanPads();
|
||
|
|
||
|
#endif
|
||
|
PAD_ScanPads();
|
||
|
if(PAD_ButtonsDown(0) & PAD_BUTTON_UP)
|
||
|
{
|
||
|
item--;
|
||
|
if(item < 0)
|
||
|
{
|
||
|
item = dirs.size()-1;
|
||
|
}
|
||
|
}
|
||
|
if(PAD_ButtonsDown(0) & PAD_BUTTON_DOWN)
|
||
|
{
|
||
|
item++;
|
||
|
if(item >= dirs.size())
|
||
|
{
|
||
|
item=0;
|
||
|
}
|
||
|
}
|
||
|
if(PAD_ButtonsDown(0) & PAD_BUTTON_A)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
#if defined(HW_RVL)
|
||
|
if(WPAD_ButtonsDown(0) & WPAD_BUTTON_UP)
|
||
|
{
|
||
|
item--;
|
||
|
if(item < 0)
|
||
|
{
|
||
|
item = dirs.size()-1;
|
||
|
}
|
||
|
}
|
||
|
if(WPAD_ButtonsDown(0) & WPAD_BUTTON_DOWN)
|
||
|
{
|
||
|
item++;
|
||
|
if(item >= dirs.size())
|
||
|
{
|
||
|
item=0;
|
||
|
}
|
||
|
}
|
||
|
if(WPAD_ButtonsDown(0) & WPAD_BUTTON_A)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
clear_screen_ogc();
|
||
|
printf("\x1b[2;2H");
|
||
|
printf("\n\n");
|
||
|
printf("\tBoxScript 1.0 Wii Version\n");
|
||
|
int indexOnScreen = item % 14;
|
||
|
int screenOffset = (item - indexOnScreen);
|
||
|
int i=0;
|
||
|
for(i = 0;i<14;i++)
|
||
|
{
|
||
|
if(screenOffset + i < dirs.size())
|
||
|
PrintElement(dirs[i+screenOffset],i == indexOnScreen);
|
||
|
}
|
||
|
//printf("\tNo Items: %i",i);
|
||
|
VIDEO_WaitVSync();
|
||
|
}
|
||
|
if(appstate == -1) exit(0);
|
||
|
if(DirExists("/BoxScript/" + dirs[item]))
|
||
|
LoadSubscripts(nodes,"/BoxScript/" + dirs[item] + "/deps");
|
||
|
|
||
|
std::vector<BoxScript::Lexer::LexToken> tokens=BoxScript::Lexer::Lex(read_file("/BoxScript/" + dirs[item] + "/app.bs"));
|
||
|
BoxScript::Parse(nodes,tokens);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
BoxScript::ApplicationState* state;
|
||
|
void WiiResetPressed(unsigned int a,void* ptr)
|
||
|
{
|
||
|
if(appstate <= 0)
|
||
|
{
|
||
|
appstate= -1;
|
||
|
}else{
|
||
|
state->StopRunning();
|
||
|
}
|
||
|
}
|
||
|
//---------------------------------------------------------------------------------
|
||
|
int main(int argc, char **argv) {
|
||
|
//---------------------------------------------------------------------------------
|
||
|
BoxScript::NetworkInit();
|
||
|
fatInitDefault();
|
||
|
SYS_SetResetCallback(WiiResetPressed);
|
||
|
// Initialise the video system
|
||
|
VIDEO_Init();
|
||
|
PAD_Init();
|
||
|
#if defined(HW_RVL)
|
||
|
WPAD_Init();
|
||
|
#endif
|
||
|
// This function initialises the attached controllers
|
||
|
|
||
|
|
||
|
// Obtain the preferred video mode from the system
|
||
|
// This will correspond to the settings in the Wii menu
|
||
|
rmode = VIDEO_GetPreferredMode(NULL);
|
||
|
|
||
|
// Allocate memory for the display in the uncached region
|
||
|
xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode));
|
||
|
|
||
|
// Initialise the console, required for printf
|
||
|
console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ);
|
||
|
|
||
|
// Set up the video registers with the chosen mode
|
||
|
VIDEO_Configure(rmode);
|
||
|
|
||
|
// Tell the video hardware where our display memory is
|
||
|
VIDEO_SetNextFramebuffer(xfb);
|
||
|
|
||
|
// Make the display visible
|
||
|
VIDEO_SetBlack(FALSE);
|
||
|
|
||
|
// Flush the video register changes to the hardware
|
||
|
VIDEO_Flush();
|
||
|
|
||
|
// Wait for Video setup to complete
|
||
|
VIDEO_WaitVSync();
|
||
|
if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync();
|
||
|
|
||
|
|
||
|
// The console understands VT terminal escape codes
|
||
|
// This positions the cursor on row 2, column 0
|
||
|
// we can use variables for this with format codes too
|
||
|
// e.g. printf ("\x1b[%d;%dH", row, column );
|
||
|
printf("\x1b[2;2H");
|
||
|
|
||
|
|
||
|
|
||
|
_root_node = new BoxScript::ListNode();
|
||
|
LoadScript(_root_node);
|
||
|
appstate=1;
|
||
|
state=new BoxScript::ApplicationState();
|
||
|
RegisterMainRuntimeFunctions(state);
|
||
|
|
||
|
_root_node->Evaluate(state);
|
||
|
|
||
|
DestroyApp(0);
|
||
|
}
|
||
|
|
||
|
void DestroyApp(int a)
|
||
|
{
|
||
|
delete _root_node;
|
||
|
exit(a);
|
||
|
}
|
||
|
|
||
|
#endif
|