From 432dcb583312f5e90ecfff7a2e72db8da3b5ee50 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 11 Jun 2016 11:54:01 +0200 Subject: [PATCH] + extend PyStreambuf to write data --- src/Base/Stream.cpp | 143 ++++++++++++++++++++++++++++---------------- src/Base/Stream.h | 5 +- 2 files changed, 97 insertions(+), 51 deletions(-) diff --git a/src/Base/Stream.cpp b/src/Base/Stream.cpp index 2b9ce95e4..86c17ca11 100644 --- a/src/Base/Stream.cpp +++ b/src/Base/Stream.cpp @@ -523,56 +523,99 @@ IODeviceIStreambuf::seekpos(std::streambuf::pos_type pos, } // --------------------------------------------------------- - -PyStreambuf::PyStreambuf(PyObject* o) : inp(o) -{ - setg (buffer+pbSize, - buffer+pbSize, - buffer+pbSize); -} - -int PyStreambuf::underflow() -{ - if (gptr() < egptr()) { - return *gptr(); - } - - int numPutback; - numPutback = gptr() - eback(); - if (numPutback > pbSize) { - numPutback = pbSize; - } - - memcpy (buffer+(pbSize-numPutback), gptr()-numPutback, numPutback); - - int num=0; - for (int i=0; i(res)[0]; - num++; - buffer[pbSize+i] = c; - if (c == '\n') - break; - } - catch (Py::Exception& e) { - e.clear(); - if (num == 0) - return EOF; - break; - } - } - - setg (buffer+(pbSize-numPutback), - buffer+pbSize, - buffer+pbSize+num); - - return *gptr(); -} + +PyStreambuf::PyStreambuf(PyObject* o) : inp(o) +{ + Py_INCREF(inp); + setg (buffer+pbSize, + buffer+pbSize, + buffer+pbSize); +} + +PyStreambuf::~PyStreambuf() +{ + Py_DECREF(inp); +} + +std::streambuf::int_type PyStreambuf::underflow() +{ + if (gptr() < egptr()) { + return *gptr(); + } + + int numPutback; + numPutback = gptr() - eback(); + if (numPutback > pbSize) { + numPutback = pbSize; + } + + memcpy (buffer+(pbSize-numPutback), gptr()-numPutback, numPutback); + + int num=0; + for (int i=0; i(res)[0]; + num++; + buffer[pbSize+i] = c; + if (c == '\n') + break; + } + catch (Py::Exception& e) { + e.clear(); + if (num == 0) + return EOF; + break; + } + } + + setg (buffer+(pbSize-numPutback), + buffer+pbSize, + buffer+pbSize+num); + + return *gptr(); +} + +std::streambuf::int_type +PyStreambuf::overflow(std::streambuf::int_type c) +{ + if (c != EOF) { + char z = c; + + try { + Py::Tuple arg(1); + arg.setItem(0, Py::Char(z)); + Py::Callable meth(Py::Object(inp).getAttr("write")); + meth.apply(arg); + } + catch(Py::Exception& e) { + e.clear(); + return EOF; + } + } + + return c; +} + +std::streamsize PyStreambuf::xsputn (const char* s, std::streamsize num) +{ + try { + Py::Tuple arg(1); + arg.setItem(0, Py::String(s, num)); + Py::Callable meth(Py::Object(inp).getAttr("write")); + meth.apply(arg); + } + catch(Py::Exception& e) { + e.clear(); + return 0; + } + + return num; +} // --------------------------------------------------------- diff --git a/src/Base/Stream.h b/src/Base/Stream.h index 26bb4738c..1b8c3d388 100644 --- a/src/Base/Stream.h +++ b/src/Base/Stream.h @@ -242,9 +242,12 @@ class BaseExport PyStreambuf : public std::streambuf { public: PyStreambuf(PyObject* o); + virtual ~PyStreambuf(); protected: - int underflow(); + int_type underflow(); + int_type overflow(int_type c = EOF); + std::streamsize xsputn (const char* s, std::streamsize num); private: static const int pbSize = 4;