Moved ptristream into its own file.

This commit is contained in:
John Wiegley 2009-02-04 03:54:29 -04:00
parent 1cc33531ea
commit b9603a1512
3 changed files with 113 additions and 58 deletions

View file

@ -93,6 +93,7 @@ pkginclude_HEADERS = \
src/times.h \
src/mask.h \
src/stream.h \
src/pstream.h \
\
src/amount.h \
src/commodity.h \

111
src/pstream.h Normal file
View file

@ -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

View file

@ -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