*/
#include <signal.h>
+#include <readline/readline.h>
#include <msp/core/except.h>
#include <msp/io/file.h>
#include <msp/io/print.h>
" 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["trace"] = Command(&CommandInterpreter::cmd_trace,
"Traces GL function calls",
"trace\n"
- " Send trace output to stdout.\n"
+ " Send trace output to stdout.\n\n"
"trace FILE\n"
" Send trace output to FILE (- for stdout).\n\n"
"trace {off|on}\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"
if(args.empty())
{
for(map<string, Command>::const_iterator i=commands.begin(); i!=commands.end(); ++i)
- IO::print("%-10s : %s\n", i->first, i->second.description);
+ if(!i->second.alias_for)
+ IO::print("%-10s : %s\n", i->first, i->second.description);
}
else
{
map<string, Command>::const_iterator i = commands.find(args);
if(i==commands.end())
throw KeyError("Unknown command", args);
- IO::print("%s : %s\n", i->first, i->second.description);
+
+ const Command *cmd = &i->second;
+ while(cmd->alias_for)
+ cmd = cmd->alias_for;
+
+ IO::print("%s : %s\n", i->first, cmd->description);
if(!i->second.help.empty())
- IO::print("\n%s", i->second.help);
+ IO::print("\n%s", cmd->help);
}
}
void CommandInterpreter::cmd_exit(const string &)
{
- gldbg.quit();
+ if(gldbg.get_process().get_state()!=Process::INACTIVE)
+ {
+ IO::print("Program is still running. Kill it?\n");
+ char *answer = readline("[y/n] ");
+ if(answer[0]=='y')
+ {
+ gldbg.get_process().kill();
+ gldbg.quit(true);
+ }
+ else
+ IO::print("Not confirmed.\n");
+ }
+ else
+ gldbg.quit(false);
}
void CommandInterpreter::cmd_trace(const string &args)
}
}
+void CommandInterpreter::cmd_profile(const string &args)
+{
+ Profiler &profiler = gldbg.get_profiler();
+ if(args.empty() || args=="on")
+ profiler.enable();
+ else if(args=="off")
+ profiler.disable();
+ else
+ throw InvalidParameterValue("Invalid argument");
+}
+
void CommandInterpreter::cmd_state(const string &args)
{
const GlState &glstate = gldbg.get_glstate();
CommandInterpreter::Command::Command():
- func(0)
+ func(0),
+ alias_for(0)
+{ }
+
+CommandInterpreter::Command::Command(Command *cmd):
+ func(cmd->func),
+ alias_for(cmd)
{ }
CommandInterpreter::Command::Command(Func f, const string &d):
func(f),
- description(d)
+ description(d),
+ alias_for(0)
{ }
CommandInterpreter::Command::Command(Func f, const string &d, const string &h):
func(f),
description(d),
- help(h)
+ help(h),
+ alias_for(0)
{ }