forked from Lephenixnoir/fxos
102 lines
1.9 KiB
C++
102 lines
1.9 KiB
C++
#include "shell.h"
|
|
#include "parser.h"
|
|
#include "commands.h"
|
|
#include "errors.h"
|
|
#include "theme.h"
|
|
|
|
#include <fxos/symbols.h>
|
|
#include <fmt/core.h>
|
|
|
|
//---
|
|
// sl
|
|
//---
|
|
|
|
static void parse_sl(Session &, Parser &parser)
|
|
{
|
|
parser.end();
|
|
}
|
|
|
|
void _sl(Session &session)
|
|
{
|
|
session.require_vspace();
|
|
|
|
for(auto const &s: session.current_space->symbols.symbols) {
|
|
if(s.type == FxOS::Symbol::Syscall && s.value < 0x1000) {
|
|
fmt::print(theme(10), " %{:03x}", s.value);
|
|
}
|
|
else if(s.type == FxOS::Symbol::Syscall) {
|
|
fmt::print(theme(10), " %{:04x}", s.value);
|
|
}
|
|
else {
|
|
fmt::print(" 0x{:08x}", s.value);
|
|
}
|
|
|
|
fmt::print(" {}\n", s.name);
|
|
}
|
|
}
|
|
|
|
//---
|
|
// sa
|
|
//---
|
|
|
|
static FxOS::Symbol parse_sa(Session &session, Parser &parser)
|
|
{
|
|
session.require_vspace();
|
|
|
|
FxOS::Symbol s;
|
|
s.type = FxOS::Symbol::Address;
|
|
s.value = parser.expr(session.current_space);
|
|
s.name = parser.symbol();
|
|
|
|
parser.end();
|
|
return s;
|
|
}
|
|
|
|
void _sa(Session &session, Symbol s)
|
|
{
|
|
session.require_vspace();
|
|
session.current_space->symbols.add(s);
|
|
}
|
|
|
|
//---
|
|
// ss
|
|
//---
|
|
|
|
static FxOS::Symbol parse_ss(Session &session, Parser &parser)
|
|
{
|
|
session.require_vspace();
|
|
|
|
FxOS::Symbol s;
|
|
s.type = FxOS::Symbol::Syscall;
|
|
s.value = parser.expect({ T::SYSCALL }).value.NUM;
|
|
s.name = parser.symbol();
|
|
|
|
parser.end();
|
|
return s;
|
|
}
|
|
|
|
void _ss(Session &session, Symbol s)
|
|
{
|
|
session.require_vspace();
|
|
session.current_space->symbols.add(s);
|
|
}
|
|
|
|
//---
|
|
// Command registration
|
|
//---
|
|
|
|
[[gnu::constructor]] static void _(void)
|
|
{
|
|
shell_register_command("sl",
|
|
[](Session &s, Parser &p){ parse_sl(s, p); _sl(s); },
|
|
[](Session &s, Parser &p){ parse_sl(s, p); });
|
|
|
|
shell_register_command("sa",
|
|
[](Session &s, Parser &p){ _sa(s, parse_sa(s, p)); },
|
|
[](Session &s, Parser &p){ parse_sa(s, p); });
|
|
|
|
shell_register_command("ss",
|
|
[](Session &s, Parser &p){ _ss(s, parse_ss(s, p)); },
|
|
[](Session &s, Parser &p){ parse_ss(s, p); });
|
|
}
|