diff --git a/shell/i.cpp b/shell/i.cpp index d6d9c88..87f29e8 100644 --- a/shell/i.cpp +++ b/shell/i.cpp @@ -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 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 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 symbols; - if(symbol.type == FxOS::Symbol::Address && symbol.value == 0) + if(!symbol.has_value()) symbols = space->symbols.symbols; else { - std::optional name - = space->symbols.query(symbol.type, symbol.value); + FxOS::Symbol s = symbol.value(); + + std::optional 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) {