fxos/shell/s.cpp

116 lines
2.5 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)
{
if(!session.current_space)
return;
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)
{
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)
{
if(!session.current_space)
return;
session.current_space->symbols.add(s);
}
//---
// ss
//---
static FxOS::Symbol parse_ss(Session &, Parser &parser)
{
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)
{
if(!session.current_space)
return;
session.current_space->symbols.add(s);
}
//---
// Command registration
//---
static ShellCommand _sl_cmd(
"sl",
[](Session &s, Parser &p) {
parse_sl(s, p);
_sl(s);
},
[](Session &s, Parser &p) { parse_sl(s, p); }, "Symbol List", R"(
sl
Lists all symbols in the current virtual space.
)");
static ShellCommand _sa_cmd(
"sa", [](Session &s, Parser &p) { _sa(s, parse_sa(s, p)); },
[](Session &s, Parser &p) { parse_sa(s, p); }, "Symbol at Address", R"(
sa <address> <symbol>
Defines a new symbol at the specified address in the current virtual space.
)");
static ShellCommand _ss_cmd(
"ss", [](Session &s, Parser &p) { _ss(s, parse_ss(s, p)); },
[](Session &s, Parser &p) { parse_ss(s, p); }, "Symbol at Syscall", R"(
ss %<hex> <symbol>
Defines a new symbol at the specified syscall number in the current virtual
space. The address is not resolved; the same syscall symbol can be used accross
multiple OS versions regardless of where the functions are actually located.
)");