diff options
author | Tim Moore <timoore@redhat.com> | 2009-12-04 13:08:01 +0100 |
---|---|---|
committer | Tim Moore <timoore@redhat.com> | 2009-12-04 13:08:01 +0100 |
commit | 5ddc5963ce06ecea574e90ca503a3ee598522d8f (patch) | |
tree | cd6dd73b8104da1c2527180b24b38b48828b307e /grapher/StapParser.cxx | |
parent | 388924acea820c7a1328eb2ac8a4128437853c3a (diff) | |
download | systemtap-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.cxx | 27 |
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()); } } } |