summaryrefslogtreecommitdiff
path: root/common/streambuf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'common/streambuf.cpp')
-rw-r--r--common/streambuf.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/common/streambuf.cpp b/common/streambuf.cpp
new file mode 100644
index 0000000..2d87f9a
--- /dev/null
+++ b/common/streambuf.cpp
@@ -0,0 +1,60 @@
+/**
+ * StreamBuf.cpp
+ *
+ * Implementation file for the StreamBuf class
+ *
+ * @see http://www.mr-edd.co.uk/blog/beginners_guide_streambuf
+ *
+ * @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
+ * @copyright 2014 Copernica BV
+ */
+#include "includes.h"
+
+/**
+ * Set up namespace
+ */
+namespace Php {
+
+/**
+ * Constructor
+ * @param error
+ */
+StreamBuf::StreamBuf(int error) : _error(error)
+{
+ // we reserve one byte, so that when overflow is called, we still have one
+ // byte extra in the buffer to put the overflowed byte int
+ setp(_buffer, _buffer+1024-1);
+}
+
+
+/**
+ * Method that is called when the internal buffer overflows
+ * @param c
+ * @return int
+ */
+int StreamBuf::overflow(int c)
+{
+ // for error buffers, overflow is simply discarded
+ if (_error) return c;
+
+ // end-of-file has not output, we call EOF directly, and by using the
+ // comma operator we ensure that EOF is returned
+ if (c == EOF) return sync(), EOF;
+
+ // because we lied the underlying buffer about the size of the buffer
+ // by one byte, there is no real overflow, and we can still add the byte
+ // to the end of the buffer
+ *pptr() = c;
+
+ // increment buffer size
+ pbump(1);
+
+ // and now we're going to syn the buffer
+ return sync() == -1 ? EOF : c;
+}
+
+/**
+ * End namespace
+ */
+}
+ \ No newline at end of file