diff options
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | configure.ac | 25 | ||||
-rw-r--r-- | lib/fdstream.h | 184 | ||||
-rw-r--r-- | src/stream.cc | 3 | ||||
-rw-r--r-- | src/system.hh.in | 4 |
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> |