summaryrefslogtreecommitdiffstats
path: root/grapher/StapParser.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'grapher/StapParser.cxx')
-rw-r--r--grapher/StapParser.cxx248
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;
-}
}