diff options
Diffstat (limited to 'io.h')
-rw-r--r-- | io.h | 68 |
1 files changed, 41 insertions, 27 deletions
@@ -73,7 +73,12 @@ public: /** Function to get a pointer to the buffer */ char *out_buffer_ptr(void) { assert(out_buffer.get() != NULL); - return (out_buffer->size() == 0) ? NULL : &out_buffer->at(0); + return out_buffer->empty() ? NULL : &out_buffer->at(0); + } + + const char *out_buffer_ptr(void) const { + assert(out_buffer.get() != NULL); + return out_buffer->empty() ? NULL : &out_buffer->at(0); } /** Function to get the size of the buffer */ @@ -83,11 +88,8 @@ public: } /** Set to true if this is an input io redirection */ - int is_input; + bool is_input; - /** Pointer to the next IO redirection */ - io_data_t *next; - io_data_t() : out_buffer(), io_mode(0), @@ -95,8 +97,7 @@ public: param1(), param2(), filename_cstr(NULL), - is_input(0), - next(NULL) + is_input(0) { } @@ -107,10 +108,8 @@ public: param1(rhs.param1), param2(rhs.param2), filename_cstr(rhs.filename_cstr ? strdup(rhs.filename_cstr) : NULL), - is_input(rhs.is_input), - next(rhs.next) + is_input(rhs.is_input) { - } ~io_data_t() { @@ -118,27 +117,44 @@ public: } }; - -/** - Join two chains of io redirections -*/ -io_data_t *io_add( io_data_t *first_chain, io_data_t *decond_chain ); +class io_chain_t : public std::vector<io_data_t *> { +public: + io_chain_t(); + io_chain_t(io_data_t *); + + void remove(const io_data_t *element); + io_chain_t duplicate() const; + void duplicate_append(const io_chain_t &src); + void destroy(); + + const io_data_t *get_io_for_fd(int fd) const; + io_data_t *get_io_for_fd(int fd); + + +}; /** Remove the specified io redirection from the chain */ -io_data_t *io_remove( io_data_t *list, io_data_t *element ); +void io_remove(io_chain_t &list, const io_data_t *element); -/** - Make a copy of the specified chain of redirections. Uses operator new. -*/ -io_data_t *io_duplicate( io_data_t *l ); +/** Make a copy of the specified chain of redirections. Uses operator new. */ +io_chain_t io_duplicate(const io_chain_t &chain); + +/** Return a shallow copy of the specified chain of redirections that contains only the applicable redirections. That is, if there's multiple redirections for the same fd, only the second one is included. */ +io_chain_t io_unique(const io_chain_t &chain); + +/** Appends a copy of the specified 'src' chain of redirections to 'dst.' Uses operator new. */ +void io_duplicate_append( const io_chain_t &src, io_chain_t &dst ); + +/** Destroys an io_chain */ +void io_chain_destroy(io_chain_t &chain); /** Return the last io redirection in the chain for the specified file descriptor. */ -io_data_t *io_get( io_data_t *io, int fd ); - +const io_data_t *io_chain_get(const io_chain_t &src, int fd); +io_data_t *io_chain_get(io_chain_t &src, int fd); /** @@ -155,16 +171,14 @@ void io_buffer_destroy( io_data_t *io_buffer ); used to buffer the output of a command, or non-zero to buffer the input to a command. */ -io_data_t *io_buffer_create( int is_input ); +io_data_t *io_buffer_create( bool is_input ); /** Close output pipe, and read from input pipe until eof. */ void io_buffer_read( io_data_t *d ); -/** - Print debug information about the specified IO redirection chain to stderr. -*/ -void io_print( io_data_t *io ); +/** Print debug information about the specified IO redirection chain to stderr. */ +void io_print( const io_chain_t &chain ); #endif |