diff options
Diffstat (limited to 'grapher/StapParser.cxx')
-rw-r--r-- | grapher/StapParser.cxx | 248 |
1 files changed, 135 insertions, 113 deletions
diff --git a/grapher/StapParser.cxx b/grapher/StapParser.cxx index 8b72f93b..1c865614 100644 --- a/grapher/StapParser.cxx +++ b/grapher/StapParser.cxx @@ -5,7 +5,8 @@ namespace systemtap { -using namespace std; + using namespace std; + using namespace std::tr1; vector<string> commaSplit(const string& inStr, size_t pos = 0) { @@ -28,13 +29,13 @@ vector<string> commaSplit(const string& inStr, size_t pos = 0) return result; } - void StapParser::parseData(std::tr1::shared_ptr<GraphDataBase> gdata, + void StapParser::parseData(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); + shared_ptr<GraphData<double> > dblptr; + shared_ptr<GraphData<string> > strptr; + dblptr = dynamic_pointer_cast<GraphData<double> >(gdata); if (dblptr) { double data; @@ -51,132 +52,153 @@ vector<string> commaSplit(const string& inStr, size_t pos = 0) } } -bool StapParser::ioCallback(Glib::IOCondition ioCondition) -{ - using namespace std; - if ((ioCondition & Glib::IO_IN) == 0) - return true; - char buf[256]; - ssize_t bytes_read = 0; - bytes_read = read(0, buf, sizeof(buf) - 1); - if (bytes_read <= 0) - { - _win.hide(); - return true; - } - buf[bytes_read] = '\0'; - _buffer += buf; - string::size_type ret = string::npos; - while ((ret = _buffer.find('\n')) != string::npos) + size_t findTaggedValue(const string& src, const char* tag, string& result) + { + size_t found; + if ((found = src.find(tag)) != string::npos) + result = src.substr(strlen(tag)); + return found; + } + + bool StapParser::ioCallback(Glib::IOCondition ioCondition) { - Glib::ustring dataString(_buffer, 0, ret); - if (dataString[0] == '%') + using namespace std; + if ((ioCondition & Glib::IO_IN) == 0) + return true; + char buf[256]; + ssize_t bytes_read = 0; + bytes_read = read(0, buf, sizeof(buf) - 1); + if (bytes_read <= 0) + { + _win.hide(); + return true; + } + buf[bytes_read] = '\0'; + _buffer += buf; + string::size_type ret = string::npos; + while ((ret = _buffer.find('\n')) != string::npos) { + Glib::ustring dataString(_buffer, 0, ret); + // %DataSet and %CSV declare a data set; all other statements begin with + // the name of a data set. size_t found; - if ((found = dataString.find("%Title:") == 0)) - { - std::string title = dataString.substr(7); - _widget.setTitle(title); - } - else if ((found = dataString.find("%XAxisTitle:") == 0)) - { - _widget.setXAxisText(dataString.substr(12)); - } - else if ((found = dataString.find("%YAxisTitle:") == 0)) + if (dataString[0] == '%') { - _widget.setYAxisText(dataString.substr(12)); - } - else if ((found = dataString.find("%YMax:") == 0)) - { - double ymax; - std::istringstream stream(dataString.substr(6)); - stream >> ymax; - // _gdata->scale = ymax; - } - else if ((found = dataString.find("%DataSet:") == 0)) - { - std::string setName; - int hexColor; - double scale; - std::string style; - std::istringstream stream(dataString.substr(9)); - stream >> setName >> scale >> std::hex >> hexColor - >> style; - if (style == "bar" || style == "dot") + if ((found = dataString.find("%DataSet:") == 0)) { - 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); + std::string setName; + int hexColor; + double scale; + std::string style; + std::istringstream stream(dataString.substr(9)); + stream >> setName >> scale >> std::hex >> hexColor + >> style; + if (style == "bar" || style == "dot") + { + 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") + { + 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 (style == "discreet") + else if ((found = dataString.find("%CSV:") == 0)) { - 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); + vector<string> tokens = commaSplit(dataString, found + 5); + for (vector<string>::iterator tokIter = tokens.begin(), + e = tokens.end(); + tokIter != e; + ++tokIter) + { + DataMap::iterator setIter = _dataSets.find(*tokIter); + if (setIter != _dataSets.end()) + _csv.elements + .push_back(CSVData::Element(*tokIter, + setIter->second)); + } } - } - else if ((found = dataString.find("%CSV:") == 0)) - { - vector<string> tokens = commaSplit(dataString, found + 5); - for (vector<string>::iterator tokIter = tokens.begin(), - e = tokens.end(); - tokIter != e; - ++tokIter) + else { - DataMap::iterator setIter = _dataSets.find(*tokIter); - if (setIter != _dataSets.end()) - _csv.elements - .push_back(CSVData::Element(*tokIter, - setIter->second)); - } - } - } - else - { - if (!_csv.elements.empty()) - { - vector<string> tokens = commaSplit(dataString); - int i = 0; - double time; - vector<string>::iterator tokIter = tokens.begin(); - std::istringstream timeStream(*tokIter++); - timeStream >> time; - for (vector<string>::iterator e = tokens.end(); - tokIter != e; - ++tokIter, ++i) - { - parseData(_csv.elements[i].second, time, *tokIter); + cerr << "Unknown declaration " << dataString << endl; } } else { - std::string dataSet; - double time; - string data; std::istringstream stream(dataString); - stream >> dataSet >> time >> data; - DataMap::iterator itr = _dataSets.find(dataSet); + string setName; + stream >> setName; + DataMap::iterator itr = _dataSets.find(setName); if (itr != _dataSets.end()) { - parseData(itr->second, time, data); + shared_ptr<GraphDataBase> gdata = itr->second; + string decl; + // Hack: scan from the beginning of dataString again + if (findTaggedValue(dataString, "%Title", decl) + != string::npos) + { + gdata->title = decl; + } + else if (findTaggedValue(dataString, "%XAxisTitle:", decl) + != string::npos) + { + gdata->xAxisText = decl; + } + else if (findTaggedValue(dataString, "%YAxisTitle:", decl) + != string::npos) + { + gdata->yAxisText = decl; + } + else if ((found = dataString.find("%YMax:")) != string::npos) + { + double ymax; + std::istringstream stream(dataString.substr(found)); + stream >> ymax; + gdata->scale = ymax; + } + + if (!_csv.elements.empty()) + { + vector<string> tokens = commaSplit(dataString); + int i = 0; + double time; + vector<string>::iterator tokIter = tokens.begin(); + std::istringstream timeStream(*tokIter++); + timeStream >> time; + for (vector<string>::iterator e = tokens.end(); + tokIter != e; + ++tokIter, ++i) + { + parseData(_csv.elements[i].second, time, *tokIter); + } + } + else + { + double time; + string data; + stream >> time >> data; + parseData(itr->second, time, data); + } } } + _buffer.erase(0, ret + 1); } - _buffer.erase(0, ret + 1); + return true; } - return true; -} } |