*** empty log message ***
This commit is contained in:
parent
8fd5f4ee57
commit
547be3056d
2 changed files with 223 additions and 0 deletions
39
configure.in
39
configure.in
|
|
@ -14,6 +14,45 @@ AC_PROG_RANLIB
|
||||||
#AC_PROG_LIBTOOL
|
#AC_PROG_LIBTOOL
|
||||||
#AM_PROG_LIBTOOL
|
#AM_PROG_LIBTOOL
|
||||||
|
|
||||||
|
# check if UNIX pipes are available
|
||||||
|
AC_CACHE_CHECK(
|
||||||
|
[if pipes can be used],
|
||||||
|
[pipes_avail],
|
||||||
|
[AC_LANG_PUSH(C++)
|
||||||
|
AC_TRY_LINK(
|
||||||
|
[#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>],
|
||||||
|
[int status, pfd[2];
|
||||||
|
status = pipe(pfd);
|
||||||
|
status = fork();
|
||||||
|
if (status < 0) {
|
||||||
|
;
|
||||||
|
} else if (status == 0) {
|
||||||
|
char *arg0;
|
||||||
|
|
||||||
|
status = dup2(pfd[0], STDIN_FILENO);
|
||||||
|
|
||||||
|
close(pfd[1]);
|
||||||
|
close(pfd[0]);
|
||||||
|
|
||||||
|
execlp("", arg0, (char *)0);
|
||||||
|
perror("execl");
|
||||||
|
exit(1);
|
||||||
|
} else {
|
||||||
|
close(pfd[0]);
|
||||||
|
}],
|
||||||
|
[pipes_avail=true],
|
||||||
|
[pipes_avail=false])
|
||||||
|
AC_LANG_POP])
|
||||||
|
|
||||||
|
if [test x$pipes_avail = xtrue ]; then
|
||||||
|
AC_DEFINE([HAVE_UNIX_PIPES], [1], [Whether UNIX pipes are available])
|
||||||
|
fi
|
||||||
|
|
||||||
# check for gmp
|
# check for gmp
|
||||||
AC_CACHE_CHECK(
|
AC_CACHE_CHECK(
|
||||||
[if libgmp is available],
|
[if libgmp is available],
|
||||||
|
|
|
||||||
184
fdstream.hpp
Normal file
184
fdstream.hpp
Normal file
|
|
@ -0,0 +1,184 @@
|
||||||
|
/* 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 = 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
|
||||||
|
*/
|
||||||
|
int 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
|
||||||
|
int 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*/
|
||||||
Loading…
Add table
Reference in a new issue