X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=trace_model.cpp;h=760093c780a4d1279ffd36bb88b1f04e891ee029;hb=0633bdfcc370f57992be9cac76b11b26df409f24;hp=ee711eddb4ec2e1a1c53f2510f63e85052abd472;hpb=b1887f9c55f7017b795bfc4b2d9a70e45e5f1e77;p=apitrace diff --git a/trace_model.cpp b/trace_model.cpp index ee711ed..760093c 100644 --- a/trace_model.cpp +++ b/trace_model.cpp @@ -24,6 +24,7 @@ **************************************************************************/ +#include "formatter.hpp" #include "trace_model.hpp" @@ -69,54 +70,100 @@ void Blob::visit(Visitor &visitor) { class Dumper : public Visitor { -public: +protected: std::ostream &os; + Formatter::Formatter *formatter; + Formatter::Attribute *normal; + Formatter::Attribute *bold; + Formatter::Attribute *italic; + Formatter::Attribute *red; + Formatter::Attribute *pointer; + Formatter::Attribute *literal; - Dumper() : os(std::cout) {} +public: + Dumper(std::ostream &_os) : os(_os) { + formatter = Formatter::defaultFormatter(); + normal = formatter->normal(); + bold = formatter->bold(); + italic = formatter->italic(); + red = formatter->color(Formatter::RED); + pointer = formatter->color(Formatter::GREEN); + literal = formatter->color(Formatter::BLUE); + } - Dumper(std::ostream &_os) : os(_os) {} + ~Dumper() { + delete normal; + delete bold; + delete italic; + delete red; + delete pointer; + delete literal; + delete formatter; + } - void visit(Null *node) { + void visit(Null *) { os << "NULL"; } void visit(Bool *node) { - os << (node->value ? "true" : "false"); + os << literal << (node->value ? "true" : "false") << normal; } void visit(SInt *node) { - os << node->value; + os << literal << node->value << normal; } void visit(UInt *node) { - os << node->value; + os << literal << node->value << normal; } void visit(Float *node) { - os << node->value; + os << literal << node->value << normal; } void visit(String *node) { - os << '"' << node->value << '"'; + os << literal << '"' << node->value << '"' << normal; } void visit(Const *node) { - os << node->name; + os << literal << node->name << normal; } - void visit(Array *node) { - const char *sep = ""; - os << "{"; - for (std::vector::iterator it = node->values.begin(); it != node->values.end(); ++it) { - os << sep; - (*it)->visit(*this); - sep = ", "; + void visit(Array *array) { + if (array->values.size() == 1) { + os << "&"; + _visit(array->values[0]); + } + else { + const char *sep = ""; + os << "{"; + for (std::vector::iterator it = array->values.begin(); it != array->values.end(); ++it) { + os << sep; + _visit(*it); + sep = ", "; + } + os << "}"; } - os << "}"; } void visit(Blob *blob) { - os << "... " << blob->size; + os << pointer << "blob(" << blob->size << ")" << normal; + } + + void visit(Call *call) { + const char *sep = ""; + os << bold << call->name << normal << "("; + for (std::vector::iterator it = call->args.begin(); it != call->args.end(); ++it) { + os << sep << italic << it->first << normal << " = "; + _visit(it->second); + sep = ", "; + } + os << ")"; + if (call->ret) { + os << " = "; + _visit(call->ret); + } + os << "\n"; } }; @@ -138,6 +185,14 @@ static inline const Value *unwrap(const Value *node) { } +Value::operator bool(void) const { + const Bool *b = dynamic_cast(unwrap(this)); + if (b) + return b->value; + assert(0); + return false; +} + Value::operator signed long long(void) const { const SInt *sint = dynamic_cast(unwrap(this)); if (sint) @@ -176,38 +231,31 @@ const Value & Value::operator[](size_t index) const { return null; } -Value::operator void *(void) const { +void * Value::blob(void) const { const Blob *blob = dynamic_cast(unwrap(this)); if (blob) return blob->buf; const Null *null = dynamic_cast(unwrap(this)); - if (null); + if (null) return NULL; assert(0); return NULL; } -Value & Call::arg(const char *name) { - for (std::list::iterator it = args.begin(); it != args.end(); ++it) { - if (it->first == name) { - return *it->second; - } - } - return null; +const char * Value::string(void) const { + const String *string = dynamic_cast(unwrap(this)); + if (string) + return string->value.c_str(); + const Null *null = dynamic_cast(unwrap(this)); + if (null) + return NULL; + assert(0); + return NULL; } std::ostream & operator <<(std::ostream &os, Call &call) { - const char *sep = ""; - os << call.name << "("; - for (std::list::iterator it = call.args.begin(); it != call.args.end(); ++it) { - os << sep << it->first << " = " << it->second; - sep = ", "; - } - os << ")"; - if (call.ret) { - os << " = " << call.ret; - } - os << "\n"; + Dumper d(os); + d.visit(&call); return os; }