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)
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<string, Command>::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<const CommandAlias *>(i->second))
+ IO::print("%-10s : %s\n", i->first, i->second->get_description());
}
else
{
- map<string, Command>::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<const CommandAlias *>(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());
}
}
}
-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);
+}