summaryrefslogtreecommitdiff
path: root/src/pstream.h
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2009-02-04 03:54:29 -0400
committerJohn Wiegley <johnw@newartisans.com>2009-02-04 03:54:29 -0400
commitb9603a1512acdfeb5d304e5ae910c1da553b3337 (patch)
treef320f69a3528d464e667111f69ad1c21b1c3e02c /src/pstream.h
parent1cc33531ea7cf82e41b1ed49bf8ffc5afea084e4 (diff)
downloadfork-ledger-b9603a1512acdfeb5d304e5ae910c1da553b3337.tar.gz
fork-ledger-b9603a1512acdfeb5d304e5ae910c1da553b3337.tar.bz2
fork-ledger-b9603a1512acdfeb5d304e5ae910c1da553b3337.zip
Moved ptristream into its own file.
Diffstat (limited to 'src/pstream.h')
-rw-r--r--src/pstream.h111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/pstream.h b/src/pstream.h
new file mode 100644
index 00000000..1eb8335c
--- /dev/null
+++ b/src/pstream.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2003-2009, John Wiegley. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of New Artisans LLC nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @addtogroup util
+ */
+
+/**
+ * @file pstream.h
+ * @author John Wiegley
+ *
+ * @ingroup util
+ *
+ * @brief Brief
+ *
+ * Full
+ */
+#ifndef _PSTREAM_H
+#define _PSTREAM_H
+
+//#include <istream>
+//#include <streambuf>
+
+class ptristream : public std::istream
+{
+ class ptrinbuf : public std::streambuf
+ {
+ protected:
+ char * ptr;
+ std::size_t len;
+
+ public:
+ ptrinbuf(char * _ptr, std::size_t _len) : ptr(_ptr), len(_len) {
+ if (*ptr && len == 0)
+ len = std::strlen(ptr);
+
+ setg(ptr, // beginning of putback area
+ ptr, // read position
+ ptr+len); // end position
+ }
+
+ protected:
+ virtual int_type underflow() {
+ // is read position before end of buffer?
+ if (gptr() < egptr())
+ return traits_type::to_int_type(*gptr());
+ else
+ return EOF;
+ }
+
+ virtual pos_type seekoff(off_type off, ios_base::seekdir way,
+ ios_base::openmode mode =
+ ios_base::in | ios_base::out)
+ {
+ switch (way) {
+ case std::ios::cur:
+ setg(ptr, gptr()+off, ptr+len);
+ break;
+ case std::ios::beg:
+ setg(ptr, ptr+off, ptr+len);
+ break;
+ case std::ios::end:
+ setg(ptr, egptr()+off, ptr+len);
+ break;
+
+ default:
+ return pos_type(off_type(-1));
+ }
+ return pos_type(gptr() - ptr);
+ }
+ };
+
+protected:
+ ptrinbuf buf;
+
+public:
+ ptristream(char * ptr, std::size_t len = 0)
+ : std::istream(0), buf(ptr, len) {
+ rdbuf(&buf);
+ }
+};
+
+#endif // _PSTREAM_H