diff options
Diffstat (limited to 'grapher/StapParser.cxx')
-rw-r--r-- | grapher/StapParser.cxx | 77 |
1 files changed, 59 insertions, 18 deletions
diff --git a/grapher/StapParser.cxx b/grapher/StapParser.cxx index c973b0aa..8b72f93b 100644 --- a/grapher/StapParser.cxx +++ b/grapher/StapParser.cxx @@ -1,6 +1,7 @@ #include "StapParser.hxx" #include <gtkmm/window.h> +#include <iostream> namespace systemtap { @@ -27,6 +28,29 @@ vector<string> commaSplit(const string& inStr, size_t pos = 0) return result; } + void StapParser::parseData(std::tr1::shared_ptr<GraphDataBase> gdata, + double time, const string& dataString) + { + std::istringstream stream(dataString); + std::tr1::shared_ptr<GraphData<double> > dblptr; + std::tr1::shared_ptr<GraphData<string> > strptr; + dblptr = std::tr1::dynamic_pointer_cast<GraphData<double> >(gdata); + if (dblptr) + { + double data; + stream >> data; + dblptr->times.push_back(time); + dblptr->data.push_back(data); + } + else if ((strptr = std::tr1 + ::dynamic_pointer_cast<GraphData<string> >(gdata)) + != 0) + { + strptr->times.push_back(time); + strptr->data.push_back(dataString); + } + } + bool StapParser::ioCallback(Glib::IOCondition ioCondition) { using namespace std; @@ -71,20 +95,38 @@ bool StapParser::ioCallback(Glib::IOCondition ioCondition) } else if ((found = dataString.find("%DataSet:") == 0)) { - std::tr1::shared_ptr<GraphData> dataSet(new GraphData); std::string setName; int hexColor; + double scale; std::string style; std::istringstream stream(dataString.substr(9)); - stream >> setName >> dataSet->scale >> std::hex >> hexColor + stream >> setName >> scale >> std::hex >> hexColor >> style; - dataSet->color[0] = (hexColor >> 16) / 255.0; - dataSet->color[1] = ((hexColor >> 8) & 0xff) / 255.0; - dataSet->color[2] = (hexColor & 0xff) / 255.0; - if (style == "dot") - dataSet->style = GraphData::DOT; - _dataSets.insert(std::make_pair(setName, dataSet)); - _widget.addGraphData(dataSet); + if (style == "bar" || style == "dot") + { + std::tr1::shared_ptr<GraphData<double> > + dataSet(new GraphData<double>); + if (style == "dot") + dataSet->style = GraphDataBase::DOT; + dataSet->color[0] = (hexColor >> 16) / 255.0; + dataSet->color[1] = ((hexColor >> 8) & 0xff) / 255.0; + dataSet->color[2] = (hexColor & 0xff) / 255.0; + dataSet->scale = scale; + _dataSets.insert(std::make_pair(setName, dataSet)); + _widget.addGraphData(dataSet); + } + else if (style == "discreet") + { + std::tr1::shared_ptr<GraphData<string> > + dataSet(new GraphData<string>); + dataSet->style = GraphDataBase::EVENT; + dataSet->color[0] = (hexColor >> 16) / 255.0; + dataSet->color[1] = ((hexColor >> 8) & 0xff) / 255.0; + dataSet->color[2] = (hexColor & 0xff) / 255.0; + dataSet->scale = scale; + _dataSets.insert(std::make_pair(setName, dataSet)); + _widget.addGraphData(dataSet); + } } else if ((found = dataString.find("%CSV:") == 0)) { @@ -96,8 +138,9 @@ bool StapParser::ioCallback(Glib::IOCondition ioCondition) { DataMap::iterator setIter = _dataSets.find(*tokIter); if (setIter != _dataSets.end()) - _csv.elements.push_back(CSVData::Element(*tokIter, - setIter->second)); + _csv.elements + .push_back(CSVData::Element(*tokIter, + setIter->second)); } } } @@ -115,23 +158,21 @@ bool StapParser::ioCallback(Glib::IOCondition ioCondition) tokIter != e; ++tokIter, ++i) { - std::istringstream stream(*tokIter); - double data; - stream >> data; - _csv.elements[i].second - ->data.push_back(std::make_pair(time, data)); + parseData(_csv.elements[i].second, time, *tokIter); } } else { std::string dataSet; double time; - double data; + string data; std::istringstream stream(dataString); stream >> dataSet >> time >> data; DataMap::iterator itr = _dataSets.find(dataSet); if (itr != _dataSets.end()) - itr->second->data.push_back(std::make_pair(time, data)); + { + parseData(itr->second, time, data); + } } } _buffer.erase(0, ret + 1); |