#include "shell.h" #include "parser.h" #include "commands.h" #include "errors.h" #include "theme.h" #include #include //--- // 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
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 % 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. )");