2 The software in this package is distributed under the GNU General
3 Public License version 2 (with a special exception described below).
5 A copy of GNU General Public License (GPL) is included in this distribution,
6 in the file COPYING.GPL.
8 As a special exception, if other files instantiate templates or use macros
9 or inline functions from this file, or you compile this file and link it
10 with other works to produce a work based on this file, this file
11 does not by itself cause the resulting work to be covered
12 by the GNU General Public License.
14 However the source code for this file must still be made available
15 in accordance with section (3) of the GNU General Public License.
17 This exception does not invalidate any other reasons why a work based
18 on this file might be covered by the GNU General Public License.
20 /***************************************************************************
21 inpipestream.hxx - C++ streambuffer wrapper
23 begin : Thu Dec 27 2001
24 copyright : (C) 2001 by Intra2net AG
25 ***************************************************************************/
38 #include "exception.hxx"
40 // ATTENTION: A lot of mysterious STL bugs occured
41 // with a "real" buffer (buffer larger than 1 byte and up to 100 bytes)
42 // -> Keep it slow and working!
44 class inpipebuf : public std::streambuf
50 // "callback" variables for destructor to store exit status
55 inpipebuf(const std::string& command)
60 pipe = popen (command.c_str(), "r");
62 throw EXCEPTION (pipestream_error, "can't open program or permission denied");
65 setg (&buffer, &buffer, &buffer);
71 int pclose_exit = pclose (pipe);
73 if (exit_status && pclose_exit != -1) {
75 *exit_status = pclose_exit;
82 void store_exit_status(bool *_status_set, int *_exit_status)
83 { status_set = _status_set; exit_status = _exit_status; }
86 virtual int_type underflow()
89 return traits_type::to_int_type(*gptr());
91 buffer = fgetc (pipe);
98 setg (&buffer, &buffer, &buffer+sizeof(char));
100 return traits_type::to_int_type(*gptr());
104 class inpipestream : public std::istream
110 inpipestream(const std::string& command)
111 : std::istream(&buf), buf(command)
114 void store_exit_status(bool *_status_set, int *_exit_status)
115 { buf.store_exit_status(_status_set, _exit_status); }
118 class outpipebuf : public std::streambuf
123 // "callback" variables for destructor to store exit status
128 outpipebuf(const std::string& command)
133 pipe = popen (command.c_str(), "w");
135 throw EXCEPTION (pipestream_error, "can't open program or permission denied");
141 int pclose_exit = pclose (pipe);
143 if (exit_status && pclose_exit != -1) {
145 *exit_status = pclose_exit;
152 void store_exit_status(bool *_status_set, int *_exit_status)
153 { status_set = _status_set; exit_status = _exit_status; }
156 virtual int_type overflow(int_type c)
160 if (fputc(c,pipe)==EOF)
166 virtual std::streamsize xsputn(const char* s, std::streamsize num)
168 return fwrite(s,num,1,pipe);
172 class outpipestream : public std::ostream
177 outpipestream(const std::string& command)
178 : std::ostream(&buf), buf(command)
181 void store_exit_status(bool *_status_set, int *_exit_status)
182 { buf.store_exit_status(_status_set, _exit_status); }