X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftracer.cpp;h=8aa12de25fd629b362c4b4eaaae3af4e3708ac85;hb=73c55fc88d8bad336fbd6cfecedc0cf18d06167c;hp=7ce00fea376d5052bb7f2d02bc34cf94bbf9f752;hpb=c6b2f7585d51164dc32f4dd2a05855913e464c58;p=gldbg.git diff --git a/source/tracer.cpp b/source/tracer.cpp index 7ce00fe..8aa12de 100644 --- a/source/tracer.cpp +++ b/source/tracer.cpp @@ -1,61 +1,89 @@ /* $Id$ This file is part of gldbg -Copyright © 2009 Mikko Rasa, Mikkosoft Productions +Copyright © 2009-2010 Mikko Rasa, Mikkosoft Productions Distributed under the GPL */ +#include #include +#include "gldbg.h" #include "glprint.h" #include "tracer.h" +using namespace std; using namespace Msp; -Tracer::Tracer(): +Tracer::Tracer(GlDbg &dbg): glprint(new GlPrint(0, 16384)), out(0), delete_out(true), enabled(true) -{ } +{ + dbg.get_command_interpreter().register_command("trace", this, &Tracer::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"); +} Tracer::~Tracer() { + delete glprint; if(delete_out) delete out; } -void Tracer::set_output(IO::Base *o) +void Tracer::set_output(IO::Base *o, bool d) { if(delete_out) delete out; out = o; - delete_out = true; -} - -void Tracer::set_output(IO::Base &o) -{ - set_output(&o); - delete_out = false; -} - -void Tracer::enable() -{ - if(!out) - throw InvalidState("Output is not set"); - enabled = true; + delete_out = d; } -void Tracer::disable() -{ - enabled = false; -} - -int Tracer::decode(const char *data, unsigned len) +void Tracer::decode(const char *data, unsigned len) { if(!enabled || !out) - return 0; + return; + int ret = glprint->decode(data, len); if(ret>=0) IO::print(*out, "%s\n", glprint->get_buffer()); - return ret; +} + +void Tracer::cmd_trace(const string &args) +{ + if(args.empty() || args=="-") + { + set_output(&IO::cout, false); + IO::print("Tracing to stdout\n"); + } + else if(args=="on") + { + if(!out) + throw InvalidState("Output is not set"); + enabled = true; + IO::print("Tracing enabled\n"); + } + else if(args=="off") + { + enabled = false; + IO::print("Tracing disabled\n"); + } + else if(args=="end") + { + set_output(0, true); + IO::print("Tracing terminated\n"); + } + else + { + set_output(new IO::File(args, IO::M_WRITE), true); + IO::print("Tracing to %s\n", args); + } }