]> git.tdb.fi Git - gldbg.git/blobdiff - source/commandinterpreter.cpp
Support command aliases
[gldbg.git] / source / commandinterpreter.cpp
index 9660aaa0ec8940487feae23a8c1aa74258d8fd9e..d02a0b49901d55ac396175958b53bc796ecf0013 100644 (file)
@@ -6,6 +6,7 @@ Distributed under the GPL
 */
 
 #include <signal.h>
+#include <readline/readline.h>
 #include <msp/core/except.h>
 #include <msp/io/file.h>
 #include <msp/io/print.h>
@@ -30,6 +31,7 @@ CommandInterpreter::CommandInterpreter(GlDbg &d):
                "  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");
@@ -48,7 +50,7 @@ CommandInterpreter::CommandInterpreter(GlDbg &d):
        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"
@@ -56,6 +58,11 @@ CommandInterpreter::CommandInterpreter(GlDbg &d):
                "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"
@@ -104,16 +111,22 @@ void CommandInterpreter::cmd_help(const string &args)
        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);
        }
 }
 
@@ -155,7 +168,20 @@ void CommandInterpreter::cmd_kill(const string &)
 
 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)
@@ -188,6 +214,17 @@ 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();
@@ -279,16 +316,24 @@ void CommandInterpreter::cmd_buffer(const string &args)
 
 
 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)
 { }