X-Git-Url: http://git.tdb.fi/?p=gldbg.git;a=blobdiff_plain;f=source%2Fcommandinterpreter.cpp;h=367ac17f9651684e98113d472140cc1b23e4a4d2;hp=e73494c1e013790e0b7d209c24d36d90e6f31f28;hb=de6ac03ffc36843bbbb0d496007b3046a4422ee1;hpb=a0799c5aa5aec7e9cfe05f6bf2c9d8058437b8df diff --git a/source/commandinterpreter.cpp b/source/commandinterpreter.cpp index e73494c..367ac17 100644 --- a/source/commandinterpreter.cpp +++ b/source/commandinterpreter.cpp @@ -23,66 +23,66 @@ using namespace Msp; CommandInterpreter::CommandInterpreter(GlDbg &d): gldbg(d) { - commands["help"] = Command(&CommandInterpreter::cmd_help, - "Provides help on commands", - "help\n" - " Displays a list of commands\n\n" - "help COMMAND\n" - " Gives detailed information on a command\n"); - commands["exit"] = Command(&CommandInterpreter::cmd_exit, - "Ends the debugging session"); - commands["quit"] = Command(&commands["exit"]); - - commands["run"] = Command(&CommandInterpreter::cmd_run, - "Starts the program"); - commands["continue"] = Command(&CommandInterpreter::cmd_continue, - "Resumes program execution"); - commands["kill"] = Command(&CommandInterpreter::cmd_kill, - "Terminates the program immediately"); - commands["signal"] = Command(&CommandInterpreter::cmd_signal, - "Resumes execution with a signal", - "signal NUM\n" - "signal NAME\n" - " Sends the signal identified by NUM or NAME to the program and resumes\n" - " execution. Currently recognized signal names are HUP, INT, TERM, SEGV\n" - " and TERM.\n"); - - commands["trace"] = Command(&CommandInterpreter::cmd_trace, - "Traces GL function calls", - "trace\n" - " Send trace output to stdout.\n\n" - "trace FILE\n" - " Send trace output to FILE (- for stdout).\n\n" - "trace {off|on}\n" - " Temporarily suspend or resume trace without closing the file.\n\n" - "trace end\n" - " Terminate trace, closing the file.\n"); - - commands["profile"] = Command(&CommandInterpreter::cmd_profile, - "Profiles GL usage and performance", - "profile {on|off}\n" - " Enables or disables profiling\n"); - - commands["state"] = Command(&CommandInterpreter::cmd_state, - "Inspects general GL state", - "state vertex\n" - " Print current vertex attributes\n\n" - "state bind\n" - " Show current bindings\n"); - - commands["texture"] = Command(&CommandInterpreter::cmd_texture, - "Inspect texture state", - "texture\n" - " Lists texture objects\n\n" - "texture ID\n" - " Print information about a texture object\n"); - - commands["buffer"] = Command(&CommandInterpreter::cmd_buffer, - "Inspect buffer object state", - "buffer\n" - " Lists buffer objects\n\n" - "buffer ID\n" - " Print information about a buffer object\n"); + register_command("help", this, &CommandInterpreter::cmd_help) + .set_help("Provides help on commands", + "help\n" + " Displays a list of commands\n\n" + "help COMMAND\n" + " Gives detailed information on a command\n"); + register_command("exit", this, &CommandInterpreter::cmd_exit) + .set_help("Ends the debugging session"); + commands["quit"] = new CommandAlias(commands["exit"]); + + register_command("run", this, &CommandInterpreter::cmd_run) + .set_help("Starts the program"); + register_command("continue", this, &CommandInterpreter::cmd_continue) + .set_help("Resumes program execution"); + register_command("kill", this, &CommandInterpreter::cmd_kill) + .set_help("Terminates the program immediately"); + register_command("signal", this, &CommandInterpreter::cmd_signal) + .set_help("Resumes execution with a signal", + "signal NUM\n" + "signal NAME\n" + " Sends the signal identified by NUM or NAME to the program and resumes\n" + " execution. Currently recognized signal names are HUP, INT, TERM, SEGV\n" + " and TERM.\n"); + + register_command("trace", this, &CommandInterpreter::cmd_trace) + .set_help("Traces GL function calls", + "trace\n" + " Send trace output to stdout.\n\n" + "trace FILE\n" + " Send trace output to FILE (- for stdout).\n\n" + "trace {off|on}\n" + " Temporarily suspend or resume trace without closing the file.\n\n" + "trace end\n" + " Terminate trace, closing the file.\n"); + + register_command("profile", this, &CommandInterpreter::cmd_profile) + .set_help("Profiles GL usage and performance", + "profile {on|off}\n" + " Enables or disables profiling\n"); + + register_command("state", this, &CommandInterpreter::cmd_state) + .set_help("Inspects general GL state", + "state vertex\n" + " Print current vertex attributes\n\n" + "state bind\n" + " Show current bindings\n"); + + register_command("texture", this, &CommandInterpreter::cmd_texture) + .set_help("Inspect texture state", + "texture\n" + " Lists texture objects\n\n" + "texture ID\n" + " Print information about a texture object\n"); + + register_command("buffer", this, &CommandInterpreter::cmd_buffer) + .set_help("Inspect buffer object state", + "buffer\n" + " Lists buffer objects\n\n" + "buffer ID\n" + " Print information about a buffer object\n"); } void CommandInterpreter::execute(const string &cmd) @@ -103,30 +103,30 @@ void CommandInterpreter::execute(const string &cmd) if(space!=string::npos) args = cmd.substr(space+1); - (this->*(i->second.func))(args); + i->second->execute(args); } void CommandInterpreter::cmd_help(const string &args) { if(args.empty()) { - for(map::const_iterator i=commands.begin(); i!=commands.end(); ++i) - if(!i->second.alias_for) - IO::print("%-10s : %s\n", i->first, i->second.description); + for(CommandMap::const_iterator i=commands.begin(); i!=commands.end(); ++i) + if(!dynamic_cast(i->second)) + IO::print("%-10s : %s\n", i->first, i->second->get_description()); } else { - map::const_iterator i = commands.find(args); + CommandMap::const_iterator i = commands.find(args); if(i==commands.end()) throw KeyError("Unknown command", args); - const Command *cmd = &i->second; - while(cmd->alias_for) - cmd = cmd->alias_for; + const Command *cmd = i->second; + while(const CommandAlias *alias = dynamic_cast(cmd)) + cmd = alias->get_target(); - IO::print("%s : %s\n", i->first, cmd->description); - if(!i->second.help.empty()) - IO::print("\n%s", cmd->help); + IO::print("%s : %s\n", i->first, cmd->get_description()); + if(!cmd->get_help().empty()) + IO::print("\n%s", cmd->get_help()); } } @@ -397,25 +397,23 @@ void CommandInterpreter::cmd_buffer(const string &args) } -CommandInterpreter::Command::Command(): - func(0), - alias_for(0) -{ } +void CommandInterpreter::Command::set_help(const string &d) +{ + description = d; +} -CommandInterpreter::Command::Command(Command *cmd): - func(cmd->func), - alias_for(cmd) -{ } +void CommandInterpreter::Command::set_help(const string &d, const string &h) +{ + description = d; + help = h; +} -CommandInterpreter::Command::Command(Func f, const string &d): - func(f), - description(d), - alias_for(0) -{ } -CommandInterpreter::Command::Command(Func f, const string &d, const string &h): - func(f), - description(d), - help(h), - alias_for(0) +CommandInterpreter::CommandAlias::CommandAlias(Command *t): + target(t) { } + +void CommandInterpreter::CommandAlias::execute(const string &a) +{ + target->execute(a); +}