aboutsummaryrefslogtreecommitdiff
path: root/Src/nu/GrowBuf.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/nu/GrowBuf.h')
-rw-r--r--Src/nu/GrowBuf.h93
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