_is: use optional, use FxOS log instead of fmt

This commit is contained in:
Dr-Carlos 2022-12-04 20:44:44 +10:30
parent 31406efc13
commit dd09f9a71d
1 changed files with 27 additions and 39 deletions

View File

@ -249,7 +249,7 @@ void _isc(Session &session, std::string vspace_name, bool sort,
struct _is_args
{
std::string vspace_name;
FxOS::Symbol symbol;
std::optional<FxOS::Symbol> symbol;
};
static struct _is_args parse_is(Session &session, Parser &parser)
@ -272,14 +272,12 @@ static struct _is_args parse_is(Session &session, Parser &parser)
s.type = FxOS::Symbol::Address;
s.value = parser.expr(session.current_space);
}
args.symbol = s;
}
else {
s.type = FxOS::Symbol::Address;
s.value = 0;
args.symbol = {};
}
args.symbol = s;
VirtualSpace *space = session.current_space;
if(!args.vspace_name.empty()) {
@ -298,7 +296,8 @@ static struct _is_args parse_is(Session &session, Parser &parser)
return args;
}
void _is(Session &session, std::string vspace_name, FxOS::Symbol symbol)
void _is(Session &session, std::string vspace_name,
std::optional<FxOS::Symbol> symbol)
{
VirtualSpace *space = session.current_space;
if(!space) {
@ -316,52 +315,41 @@ void _is(Session &session, std::string vspace_name, FxOS::Symbol symbol)
std::vector<FxOS::Symbol> symbols;
if(symbol.type == FxOS::Symbol::Address && symbol.value == 0)
if(!symbol.has_value())
symbols = space->symbols.symbols;
else {
std::optional<std::string> name
= space->symbols.query(symbol.type, symbol.value);
FxOS::Symbol s = symbol.value();
std::optional<std::string> name = space->symbols.query(s.type, s.value);
if(name.has_value())
symbol.name = name.value();
else if(symbol.type == FxOS::Symbol::Address) {
s.name = name.value();
else if(s.type == FxOS::Symbol::Address) {
if(vspace_name.empty())
fmt::print(stderr,
"\x1b[31;1merror:\x1b[0m no symbol exists for address 0x{:08x} in current virtual space\n",
symbol.value);
FxOS_log(ERR,
"no symbol exists for address 0x%08x in current virtual space",
s.value);
else
fmt::print(stderr,
"\x1b[31;1merror:\x1b[0m no symbol exists for address 0x{:08x} in virtual space '{}'\n",
symbol.value, vspace_name);
FxOS_log(ERR,
"no symbol exists for syscall 0x%08x in virtual space '%s'",
s.value, vspace_name);
return;
}
else if(symbol.type == FxOS::Symbol::Syscall) {
if(vspace_name.empty()) {
if(symbol.value < 0x1000)
fmt::print(stderr,
"\x1b[31;1merror:\x1b[0m no symbol exists for syscall %{:03x} in current virtual space\n",
symbol.value);
else
fmt::print(stderr,
"\x1b[31;1merror:\x1b[0m no symbol exists for syscall %{:04x} in current virtual space\n",
symbol.value);
}
else {
if(symbol.value < 0x1000)
fmt::print(stderr,
"\x1b[31;1merror:\x1b[0m no symbol exists for syscall %{:03x} in virtual space '{}'\n",
symbol.value, vspace_name);
else
fmt::print(stderr,
"\x1b[31;1merror:\x1b[0m no symbol exists for syscall %{:04x} in virtual space '{}'\n",
symbol.value, vspace_name);
}
else if(s.type == FxOS::Symbol::Syscall) {
if(vspace_name.empty())
FxOS_log(ERR,
"no symbol exists for syscall %%%04x in current virtual space",
s.value);
else
FxOS_log(ERR,
"no symbol exists for syscall %%%04x in virtual space '%s'",
s.value, vspace_name);
return;
}
symbols = {symbol};
symbols = {s};
}
for(auto const &s: symbols) {