[dbg] Pull out common code into dbg-lib
- Modularize common routines - Extract the block_dumper interface for displaying blocks - Remove inheritance from show_traits
This commit is contained in:
88
dbg-lib/command_interpreter.cc
Normal file
88
dbg-lib/command_interpreter.cc
Normal file
@ -0,0 +1,88 @@
|
||||
#include "dbg-lib/command_interpreter.h"
|
||||
|
||||
using namespace dbg;
|
||||
using namespace std;
|
||||
|
||||
//----------------------------------------------------------------
|
||||
|
||||
namespace {
|
||||
class command_interpreter_impl : public command_interpreter {
|
||||
public:
|
||||
typedef std::shared_ptr<command_interpreter> ptr;
|
||||
|
||||
command_interpreter_impl(std::istream &in, std::ostream &out)
|
||||
: in_(in),
|
||||
out_(out),
|
||||
exit_(false) {
|
||||
}
|
||||
|
||||
void register_command(std::string const &str, command::ptr cmd) {
|
||||
commands_.insert(make_pair(str, cmd));
|
||||
}
|
||||
|
||||
void enter_main_loop() {
|
||||
while (!exit_)
|
||||
do_once();
|
||||
}
|
||||
|
||||
void exit_main_loop() {
|
||||
exit_ = true;
|
||||
}
|
||||
|
||||
private:
|
||||
void do_once();
|
||||
|
||||
std::istream &in_;
|
||||
std::ostream &out_;
|
||||
std::map <std::string, command::ptr> commands_;
|
||||
bool exit_;
|
||||
};
|
||||
|
||||
//--------------------------------
|
||||
|
||||
strings read_input(std::istream &in)
|
||||
{
|
||||
using namespace boost::algorithm;
|
||||
|
||||
std::string input;
|
||||
getline(in, input);
|
||||
|
||||
strings toks;
|
||||
split(toks, input, is_any_of(" \t"), token_compress_on);
|
||||
|
||||
return toks;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------
|
||||
|
||||
void command_interpreter_impl::do_once()
|
||||
{
|
||||
if (in_.eof())
|
||||
throw runtime_error("input closed");
|
||||
|
||||
out_ << "> ";
|
||||
strings args = read_input(in_);
|
||||
|
||||
std::map<std::string, command::ptr>::iterator it;
|
||||
it = commands_.find(args[0]);
|
||||
if (it == commands_.end())
|
||||
out_ << "Unrecognised command" << endl;
|
||||
else {
|
||||
try {
|
||||
it->second->exec(args, out_);
|
||||
} catch (std::exception &e) {
|
||||
cerr << e.what() << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------
|
||||
|
||||
command_interpreter::ptr
|
||||
dbg::create_command_interpreter(std::istream &in, std::ostream &out)
|
||||
{
|
||||
return command_interpreter::ptr(new command_interpreter_impl(in, out));
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------
|
Reference in New Issue
Block a user