summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am1
-rw-r--r--src/pstream.h111
-rw-r--r--src/textual.cc59
3 files changed, 113 insertions, 58 deletions
diff --git a/Makefile.am b/Makefile.am
index 43dc40c5..0e13f233 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -93,6 +93,7 @@ pkginclude_HEADERS = \
src/times.h \
src/mask.h \
src/stream.h \
+ src/pstream.h \
\
src/amount.h \
src/commodity.h \
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
diff --git a/src/textual.cc b/src/textual.cc
index f7a036ab..28d8c36e 100644
--- a/src/textual.cc
+++ b/src/textual.cc
@@ -42,67 +42,10 @@
#include "session.h"
#include "option.h"
#include "acconf.h"
+#include "pstream.h"
namespace ledger {
-namespace {
- 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) {
- 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:
- assert(false);
- break;
- }
- return pos_type(gptr() - ptr);
- }
- };
-
- protected:
- ptrinbuf buf;
- public:
- ptristream(char * ptr, std::size_t len)
- : std::istream(0), buf(ptr, len) {
- rdbuf(&buf);
- }
- };
-}
-
#if defined(TEST_FOR_PARSER)
bool textual_parser_t::test(std::istream& in) const