diff options
author | William R. Otte <wotte@dre.vanderbilt.edu> | 2006-07-24 15:50:30 +0000 |
---|---|---|
committer | William R. Otte <wotte@dre.vanderbilt.edu> | 2006-07-24 15:50:30 +0000 |
commit | c44379cc7d9c7aa113989237ab0f56db12aa5219 (patch) | |
tree | 66a84b20d47f2269d8bdc6e0323f338763424d3a /ACE/ace/Read_Buffer.h | |
parent | 3aff90f4a822fcf5d902bbfbcc9fa931d6191a8c (diff) | |
download | ATCD-c44379cc7d9c7aa113989237ab0f56db12aa5219.tar.gz |
Repo restructuring
Diffstat (limited to 'ACE/ace/Read_Buffer.h')
-rw-r--r-- | ACE/ace/Read_Buffer.h | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/ACE/ace/Read_Buffer.h b/ACE/ace/Read_Buffer.h new file mode 100644 index 00000000000..11176ef34df --- /dev/null +++ b/ACE/ace/Read_Buffer.h @@ -0,0 +1,130 @@ +// -*- C++ -*- + +//========================================================================== +/** + * @file Read_Buffer.h + * + * $Id$ + * + * @author Douglas C. Schmidt <schmidt@cs.wustl.edu> + * @author Seth Widoff + */ +//========================================================================== + +#ifndef ACE_READ_BUFFER_H +#define ACE_READ_BUFFER_H + +#include /**/ "ace/pre.h" + +#include "ace/ACE_export.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "ace/Global_Macros.h" +#include "ace/os_include/os_stdio.h" + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL + +class ACE_Allocator; + +/** + * @class ACE_Read_Buffer + * + * @brief Efficiently reads an artibrarily large buffer from an input + * stream up to and including a termination character. Also + * performs search/replace on single occurrences a character in + * the buffer using the principles of Integrated Layer + * Processing. + * + * This implementation is optimized to do a single dynamic + * allocation and make only one copy of the data. It uses + * recursion and the run-time stack to accomplish this + * efficiently. + */ +class ACE_Export ACE_Read_Buffer +{ +public: + // = Initialization and termination methods. + /// Read from a FILE *. + ACE_Read_Buffer (FILE *fp, + int close_on_delete = 0, + ACE_Allocator * = 0); + +#if !defined (ACE_HAS_WINCE) + // Note that ACE_HANDLE = FILE under CE. + + /// Read from an open HANDLE. + ACE_Read_Buffer (ACE_HANDLE handle, + int close_on_delete = 0, + ACE_Allocator * = 0); +#endif // ACE_HAS_WINCE + + /// Closes the FILE *. + ~ACE_Read_Buffer (void); + + /** + * Returns a pointer dynamically allocated with + * <ACE_Allocator::malloc> to data from the input stream up to (and + * including) the <terminator>. If <search> is >= 0 then all + * occurrences of the <search> value are substituted with the + * <replace> value. The last of the byte of data is a 0, so that + * <strlen> can be used on it. The caller is responsible for + * freeing the pointer returned from this method using the + * <ACE_Allocator::free>. + */ + char *read (int terminator = EOF, + int search = '\n', + int replace = '\0'); + + /// Returns the number of characters replaced during a <read>. + size_t replaced (void) const; + + /// Returns the size of the allocated buffer obtained during a + /// @c read, not including the null terminator. + size_t size (void) const; + + /// Returns a pointer to its allocator. + ACE_Allocator *alloc (void) const; + + /// Dump the state of the object. + void dump (void) const; + +private: + + // Disallow copying and assignment... + void operator= (const ACE_Read_Buffer &); + ACE_Read_Buffer (const ACE_Read_Buffer &); + +private: + /// Recursive helper method that does the work... + char *rec_read (int term, int search, int replace); + + /// The total number of characters in the buffer. + size_t size_; + + /// The total number of characters replaced. + size_t occurrences_; + + /// The stream we are reading from. + FILE *stream_; + + /// Keeps track of whether we should close the FILE in the + /// destructor. + int close_on_delete_; + + /// Pointer to the allocator. + ACE_Allocator *allocator_; + +}; + +ACE_END_VERSIONED_NAMESPACE_DECL + +#if defined (__ACE_INLINE__) +# include "ace/Read_Buffer.inl" +#endif /* __ACE_INLINE__ */ + +#include /**/ "ace/post.h" + +#endif /* ACE_READ_BUFFER_H */ |