summaryrefslogtreecommitdiffstats
path: root/grapher/StapParser.cxx
diff options
context:
space:
mode:
authorTim Moore <timoore@redhat.com>2009-12-04 13:08:01 +0100
committerTim Moore <timoore@redhat.com>2009-12-04 13:08:01 +0100
commit5ddc5963ce06ecea574e90ca503a3ee598522d8f (patch)
treecd6dd73b8104da1c2527180b24b38b48828b307e /grapher/StapParser.cxx
parent388924acea820c7a1328eb2ac8a4128437853c3a (diff)
downloadsystemtap-steved-5ddc5963ce06ecea574e90ca503a3ee598522d8f.tar.gz
systemtap-steved-5ddc5963ce06ecea574e90ca503a3ee598522d8f.tar.xz
systemtap-steved-5ddc5963ce06ecea574e90ca503a3ee598522d8f.zip
support multiline data output from scripts run under the grapher
This is accompanied by support for multiline output in hover text. * grapher/StapParser.cxx (ioCallback): Read data 'til the end of line character, not just '\n'. Be careful to use I/O functions that don't treat '\n' specially. * grapher/StapParser.hxx: ditto * grapher/CairoWidget.cxx (CairoTextBox::draw): Perform line breaks for hover text. * testsuite/systemtap.examples/general/grapher.stp: Do multiline output of keyboard events. Also, fix longstanding breaking in the pty probe.
Diffstat (limited to 'grapher/StapParser.cxx')
-rw-r--r--grapher/StapParser.cxx27
1 files changed, 19 insertions, 8 deletions
diff --git a/grapher/StapParser.cxx b/grapher/StapParser.cxx
index 6218e229..2a246475 100644
--- a/grapher/StapParser.cxx
+++ b/grapher/StapParser.cxx
@@ -4,6 +4,7 @@
#include <gtkmm/window.h>
#include <algorithm>
+#include <iomanip>
#include <iostream>
#include <sstream>
#include <cstring>
@@ -76,14 +77,14 @@ vector<string> commaSplit(const boost::sub_range<Glib::ustring>& range)
_win->hide();
return true;
}
- buf[bytes_read] = '\0';
- _buffer += buf;
+ _buffer.append(buf, bytes_read);
string::size_type ret = string::npos;
- while ((ret = _buffer.find('\n')) != string::npos)
+ while ((ret = _buffer.find(_lineEndChar)) != 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.
+ // %DataSet and %CSV declare a data set; all other
+ // statements begin with the name of a data set.
+ // Except %LineEnd :)
sub_range<Glib::ustring> found;
if (dataString[0] == '%')
{
@@ -142,6 +143,15 @@ vector<string> commaSplit(const boost::sub_range<Glib::ustring>& range)
setIter->second));
}
}
+ else if ((found = find_first(dataString, "%LineEnd:")))
+ {
+ istringstream stream(Glib::ustring(found.end(),
+ dataString.end()));
+ int charAsInt = 0;
+ // parse hex and octal numbers too
+ stream >> std::setbase(0) >> charAsInt;
+ _lineEndChar = static_cast<char>(charAsInt);
+ }
else
{
cerr << "Unknown declaration " << dataString << endl;
@@ -199,9 +209,10 @@ vector<string> commaSplit(const boost::sub_range<Glib::ustring>& range)
else
{
int64_t time;
- string data;
- stream >> time >> data;
- parseData(itr->second, time, data);
+ stringbuf data;
+ stream >> time;
+ stream.get(data, _lineEndChar);
+ parseData(itr->second, time, data.str());
}
}
}