diff options
Diffstat (limited to 'Src/nu/GrowBuf.h')
-rw-r--r-- | Src/nu/GrowBuf.h | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/Src/nu/GrowBuf.h b/Src/nu/GrowBuf.h new file mode 100644 index 00000000..e6084755 --- /dev/null +++ b/Src/nu/GrowBuf.h @@ -0,0 +1,93 @@ +#ifndef NULLSOFT_UTILITY_GROWBUF_H +#define NULLSOFT_UTILITY_GROWBUF_H + +#include <memory.h> +#include <stdlib.h> +class GrowBuf +{ +public: + GrowBuf() {} + + ~GrowBuf() + { + if ( m_s ) + free( m_s ); + + m_s = NULL; + } + + void reserve( size_t len ) + { + if ( len > m_alloc ) + { + void *ne; + m_alloc = len; + ne = realloc( m_s, m_alloc ); + if ( !ne ) + { + ne = malloc( m_alloc ); + memcpy( ne, m_s, m_used ); + free( m_s ); + } + m_s = ne; + } + } + + size_t add( void *data, size_t len ) + { + if ( !len ) + return 0; + + resize( m_used + len ); + memcpy( (char *)get() + m_used - len, data, len ); + + return m_used - len; + } + + void set( void *data, size_t len ) + { + resize( len ); + memcpy( (char *)get(), data, len ); + } + + void resize( size_t newlen ) + { + m_used = newlen; + if ( newlen > m_alloc ) + { + m_alloc = newlen * 2; + if ( m_alloc < 1024 ) + m_alloc = 1024; + + void *ne = realloc( m_s, m_alloc ); + if ( !ne ) + { + ne = malloc( m_alloc ); + if ( !ne ) + *( (char *)ne ) = NULL; + + memcpy( ne, m_s, m_used ); + free( m_s ); + } + + m_s = ne; + } + } + + size_t getlen() + { + return m_used; + } + + void *get() + { + return m_s; + } + +private: + void *m_s = NULL; + size_t m_alloc = 0; + size_t m_used = 0; +}; + +#endif
\ No newline at end of file |