summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2009-10-25 04:28:49 -0400
committerJohn Wiegley <johnw@newartisans.com>2009-10-25 04:28:49 -0400
commit48d24e2a4ce911214a83492fcf5cd89bb4a3bda5 (patch)
tree2aec8a08888999d085ad08d221ef4f17d8ed3372
parentf35bc939c96c3a3bf09c5881d638b5ba60449c03 (diff)
downloadfork-ledger-48d24e2a4ce911214a83492fcf5cd89bb4a3bda5.tar.gz
fork-ledger-48d24e2a4ce911214a83492fcf5cd89bb4a3bda5.tar.bz2
fork-ledger-48d24e2a4ce911214a83492fcf5cd89bb4a3bda5.zip
Use boost::iostreams::file_descriptor_sink
This is instead of the custom fdstream.hpp file I was distributing.
-rw-r--r--Makefile.am1
-rw-r--r--configure.ac25
-rw-r--r--lib/fdstream.h184
-rw-r--r--src/stream.cc3
-rw-r--r--src/system.hh.in4
5 files changed, 30 insertions, 187 deletions
diff --git a/Makefile.am b/Makefile.am
index 8ed18fbb..2556e1df 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -136,7 +136,6 @@ pkginclude_HEADERS = \
\
src/pyinterp.h \
\
- lib/fdstream.h \
lib/sha1.h \
lib/gettext.h \
\
diff --git a/configure.ac b/configure.ac
index c45ff636..8b3b791e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -255,6 +255,31 @@ else
AC_MSG_FAILURE("Could not find boost_filesystem library (set CPPFLAGS and LDFLAGS?)")
fi
+# check for boost_iostreams
+AC_CACHE_CHECK(
+ [if boost_iostreams is available],
+ [boost_iostreams_cpplib_avail_cv_],
+ [boost_iostreams_save_libs=$LIBS
+ LIBS="-lboost_iostreams$BOOST_SUFFIX -lboost_system$BOOST_SUFFIX $LIBS"
+ AC_LANG_PUSH(C++)
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <boost/iostreams/device/file_descriptor.hpp>
+ #include <boost/iostreams/stream.hpp>]],
+ [[namespace io = boost::iostreams;
+ typedef io::stream<io::file_descriptor_sink> ofdstream;
+ ofdstream outstream(1);]])],
+ [boost_iostreams_cpplib_avail_cv_=true],
+ [boost_iostreams_cpplib_avail_cv_=false])
+ AC_LANG_POP
+ LIBS=$boost_iostreams_save_libs])
+
+if [test x$boost_iostreams_cpplib_avail_cv_ = xtrue ]; then
+ LIBS="-lboost_iostreams$BOOST_SUFFIX -lboost_system$BOOST_SUFFIX $LIBS"
+else
+ AC_MSG_FAILURE("Could not find boost_iostreams library (set CPPFLAGS and LDFLAGS?)")
+fi
+
# check for Python
AM_PATH_PYTHON(2.4,, :)
if [test "$PYTHON" != :]; then
diff --git a/lib/fdstream.h b/lib/fdstream.h
deleted file mode 100644
index 526c9f53..00000000
--- a/lib/fdstream.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/* The following code declares classes to read from and write to
- * file descriptore or file handles.
- *
- * See
- * http://www.josuttis.com/cppcode
- * for details and the latest version.
- *
- * - open:
- * - integrating BUFSIZ on some systems?
- * - optimized reading of multiple characters
- * - stream for reading AND writing
- * - i18n
- *
- * (C) Copyright Nicolai M. Josuttis 2001.
- * Permission to copy, use, modify, sell and distribute this software
- * is granted provided this copyright notice appears in all copies.
- * This software is provided "as is" without express or implied
- * warranty, and with no claim as to its suitability for any purpose.
- *
- * Version: Jul 28, 2002
- * History:
- * Jul 28, 2002: bugfix memcpy() => memmove()
- * fdinbuf::underflow(): cast for return statements
- * Aug 05, 2001: first public version
- */
-#ifndef BOOST_FDSTREAM_HPP
-#define BOOST_FDSTREAM_HPP
-
-#include <istream>
-#include <ostream>
-#include <streambuf>
-// for EOF:
-#include <cstdio>
-// for memmove():
-#include <cstring>
-
-
-// low-level read and write functions
-#ifdef _MSC_VER
-# include <io.h>
-#else
-# include <unistd.h>
-//extern "C" {
-// int write (int fd, const char* buf, int num);
-// int read (int fd, char* buf, int num);
-//}
-#endif
-
-
-// BEGIN namespace BOOST
-namespace boost {
-
-
-/************************************************************
- * fdostream
- * - a stream that writes on a file descriptor
- ************************************************************/
-
-
-class fdoutbuf : public std::streambuf {
- protected:
- int fd; // file descriptor
- public:
- // constructor
- fdoutbuf (int _fd) : fd(_fd) {
- }
- protected:
- // write one character
- virtual int_type overflow (int_type c) {
- if (c != EOF) {
- char z = static_cast<char>(c);
- if (write (fd, &z, 1) != 1) {
- return EOF;
- }
- }
- return c;
- }
- // write multiple characters
- virtual
- std::streamsize xsputn (const char* s,
- std::streamsize num) {
- return write(fd,s,num);
- }
-};
-
-class fdostream : public std::ostream {
- protected:
- fdoutbuf buf;
- public:
- fdostream (int fd) : std::ostream(0), buf(fd) {
- rdbuf(&buf);
- }
-};
-
-
-/************************************************************
- * fdistream
- * - a stream that reads on a file descriptor
- ************************************************************/
-
-class fdinbuf : public std::streambuf {
- protected:
- int fd; // file descriptor
- protected:
- /* data buffer:
- * - at most, pbSize characters in putback area plus
- * - at most, bufSize characters in ordinary read buffer
- */
- static const int pbSize = 4; // size of putback area
- static const int bufSize = 1024; // size of the data buffer
- char buffer[bufSize+pbSize]; // data buffer
-
- public:
- /* constructor
- * - initialize file descriptor
- * - initialize empty data buffer
- * - no putback area
- * => force underflow()
- */
- fdinbuf (int _fd) : fd(_fd) {
- setg (buffer+pbSize, // beginning of putback area
- buffer+pbSize, // read position
- buffer+pbSize); // end position
- }
-
- protected:
- // insert new characters into the buffer
- virtual int_type underflow () {
-#ifndef _MSC_VER
- using std::memmove;
-#endif
-
- // is read position before end of buffer?
- if (gptr() < egptr()) {
- return traits_type::to_int_type(*gptr());
- }
-
- /* process size of putback area
- * - use number of characters read
- * - but at most size of putback area
- */
- std::streamsize numPutback;
- numPutback = gptr() - eback();
- if (numPutback > pbSize) {
- numPutback = pbSize;
- }
-
- /* copy up to pbSize characters previously read into
- * the putback area
- */
- memmove (buffer+(pbSize-numPutback), gptr()-numPutback,
- numPutback);
-
- // read at most bufSize new characters
- ssize_t num;
- num = read (fd, buffer+pbSize, bufSize);
- if (num <= 0) {
- // ERROR or EOF
- return EOF;
- }
-
- // reset buffer pointers
- setg (buffer+(pbSize-numPutback), // beginning of putback area
- buffer+pbSize, // read position
- buffer+pbSize+num); // end of buffer
-
- // return next character
- return traits_type::to_int_type(*gptr());
- }
-};
-
-class fdistream : public std::istream {
- protected:
- fdinbuf buf;
- public:
- fdistream (int fd) : std::istream(0), buf(fd) {
- rdbuf(&buf);
- }
-};
-
-
-} // END namespace boost
-
-#endif /*BOOST_FDSTREAM_HPP*/
diff --git a/src/stream.cc b/src/stream.cc
index c7fd58fa..e39b74e0 100644
--- a/src/stream.cc
+++ b/src/stream.cc
@@ -100,7 +100,8 @@ namespace {
}
else { // parent
close(pfd[0]);
- *os = new boost::fdostream(pfd[1]);
+ typedef iostreams::stream<iostreams::file_descriptor_sink> fdstream;
+ *os = new fdstream(pfd[1]);
}
return pfd[1];
}
diff --git a/src/system.hh.in b/src/system.hh.in
index 1f4a7d63..2a6b41af 100644
--- a/src/system.hh.in
+++ b/src/system.hh.in
@@ -119,7 +119,6 @@ typedef std::ostream::pos_type ostream_pos_type;
#if defined(HAVE_UNIX_PIPES)
#include <sys/types.h>
#include <sys/wait.h>
-#include "fdstream.h"
#endif
#if defined(HAVE_GETTEXT)
#include "gettext.h"
@@ -154,6 +153,9 @@ typedef std::ostream::pos_type ostream_pos_type;
#include <boost/foreach.hpp>
#include <boost/function.hpp>
#include <boost/intrusive_ptr.hpp>
+#include <boost/iostreams/stream.hpp>
+#include <boost/iostreams/write.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/operators.hpp>
#include <boost/optional.hpp>