trying to use fat libs but initdefault fails even on hw

This commit is contained in:
carpall 2022-07-10 16:35:32 +02:00
parent 50083a49b9
commit 6cbba104ce
5 changed files with 89 additions and 11 deletions

View File

@ -38,7 +38,7 @@ LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
LIBS := -lnds9
LIBS := -lfat -lnds9
#---------------------------------------------------------------------------------

BIN
dlms4.dldi Normal file

Binary file not shown.

View File

@ -66,7 +66,7 @@ class NDSConsole
private: inline std::string getPromptPrefix()
{
return "/ $ ";
return evaluator.cwd + " $ ";
}
private: void printPromptParsingError(NScript::Error e);

View File

@ -281,10 +281,10 @@ std::string NScript::Parser::escapesToEscaped(std::string s, Position pos)
return t;
}
NScript::Node NScript::Evaluator::expectType(Node node, NodeKind type, Position pos)
NScript::Node NScript::Evaluator::expectType(Node node, NodeKind type)
{
if (node.kind != type)
throw Error({"expected a value with type ", Node::kindToString(type), " (found ", Node::kindToString(node.kind), ")"}, pos);
throw Error({"expected a value with type ", Node::kindToString(type), " (found ", Node::kindToString(node.kind), ")"}, node.pos);
return node;
}
@ -300,20 +300,19 @@ NScript::Node NScript::Evaluator::builtinFloor(CallNode call)
expectArgsCount(call, 1);
// truncating the float value
auto expr = expectType(evaluateNode(call.args[0]), NodeKind::Num, call.args[0].pos);
auto expr = expectType(evaluateNode(call.args[0]), NodeKind::Num);
expr.value.num = uint64_t(expr.value.num);
return expr;
}
NScript::Node NScript::Evaluator::builtinPrint(CallNode call, Position pos)
void NScript::Evaluator::builtinPrint(CallNode call)
{
// printing all arguments without separation and flushing
for (auto arg : call.args)
iprintf("%s", arg.toString().c_str());
fflush(stdout);
return Node::none(pos);
}
NScript::Node NScript::Evaluator::evaluateCallProcess(CallNode call, Position pos)
@ -332,9 +331,15 @@ NScript::Node NScript::Evaluator::evaluateCall(CallNode call, Position pos)
auto name = std::string(call.name.value.str);
if (name == "print")
return builtinPrint(call, pos);
builtinPrint(call);
else if (name == "floor")
return builtinFloor(call);
else if (name == "cd")
builtinCd(call);
else if (name == "clear")
builtinClear(call);
else if (name == "shutdown")
builtinShutdown(call);
else
throw Error({"unknown builtin function"}, call.name.pos);
@ -456,3 +461,56 @@ NScript::Node NScript::Evaluator::evaluateNode(Node node)
default: panic("unimplemented evaluateNode for some NodeKind"); return Node::none(node.pos);
}
}
std::string NScript::Evaluator::expectStringLengthAndGetString(Node node, std::function<bool(uint64_t)> f)
{
auto s = std::string(node.value.str);
if (!f(s.length()))
throw Error({"expected a string with a different length"}, node.pos);
return s;
}
void NScript::Evaluator::builtinCd(CallNode call)
{
expectArgsCount(call, 1);
// expecting the only 1 arg is a string and expecting it to be a non-empty one
auto arg = call.args[0];
auto dir = expectStringLengthAndGetString(expectType(evaluateNode(arg), NodeKind::String), [] (uint64_t l) { return l > 0; });
auto isRelativePath = dir[0] != '/';
// dir must always have a character `/` at the end of the string
if (dir[dir.length() - 1] != '/')
dir.push_back('/');
if (isRelativePath)
dir = cwd + dir;
// opening dir
DIR* openedDir = opendir(dir.c_str());
// checking for dir correctly opened
if (!openedDir)
throw Error({"unknown dir"}, arg.pos);
// closing old dir
closedir(openedCwd);
// changing dir
cwd = dir;
openedCwd = openedDir;
}
void NScript::Evaluator::builtinClear(CallNode call)
{
expectArgsCount(call, 0);
consoleClear();
}
void NScript::Evaluator::builtinShutdown(CallNode call)
{
expectArgsCount(call, 0);
systemShutDown();
}

View File

@ -5,6 +5,8 @@
#include <c++/12.1.0/vector>
#include <c++/12.1.0/functional>
#include <c++/12.1.0/utility>
#include <fat.h>
#include <dirent.h>
#include "basics.h"
@ -391,11 +393,21 @@ namespace NScript
class Evaluator
{
private: std::vector<KeyPair<std::string, Node>> map;
private: DIR* openedCwd; // current working directory pointer
public: std::string cwd; // current working directory
public: std::vector<KeyPair<std::string, Node>> map; // declared variables map
public: Evaluator()
{
if (!fatInitDefault())
panic("could not initialize fat lib with default settings");
this->map = std::vector<KeyPair<std::string, Node>>();
this->cwd = "/";
this->openedCwd = opendir(cwd.c_str());
if (!openedCwd)
panic("could not open root dir");
}
public: Node evaluateNode(Node node);
@ -416,12 +428,20 @@ namespace NScript
private: Node evaluateCallProcess(CallNode call, Position pos);
private: Node builtinPrint(CallNode call, Position pos);
private: void builtinPrint(CallNode call);
private: Node builtinFloor(CallNode call);
private: void builtinCd(CallNode call);
private: void builtinClear(CallNode call);
private: void builtinShutdown(CallNode call);
private: void expectArgsCount(CallNode call, uint64_t count);
private: Node expectType(Node node, NodeKind type, Position pos);
private: Node expectType(Node node, NodeKind type);
private: std::string expectStringLengthAndGetString(Node node, std::function<bool(uint64_t)> f);
};
}