Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals  

dt_buf.c

Go to the documentation of this file.
00001 
00004 #include "dt_buf.h"
00005 #include <stdlib.h>
00006 #include <string.h>
00007 
00008 #ifndef NDEBUG
00009 
00010   unsigned dt_buf_instance_count = 0;
00011 #endif
00012 
00013 
00014 dt_bool dt_buf_init( dt_buf* buf )
00015 {
00016    enum{ initSize = 32 };
00017    dt_byte* begin = (dt_byte*)malloc(initSize);
00018    if( ! begin )
00019       return 0;
00020    buf->begin    = begin;
00021    buf->strEnd   = begin;
00022    buf->allocEnd = begin + initSize;
00023 #ifndef NDEBUG
00024    ++ dt_buf_instance_count;
00025 #endif
00026    return 1;
00027 }
00028 
00029 dt_bool  dt_buf_init_data( dt_buf* buf, dt_byte const* data, size_t len )
00030 {
00031    dt_byte* begin = (dt_byte*)malloc(len);
00032    if( ! begin )
00033       return 0;
00034    memcpy( begin, data, len );
00035    buf->begin = begin;
00036    buf->strEnd = buf->allocEnd = begin + len;
00037 #ifndef NDEBUG
00038    ++ dt_buf_instance_count;
00039 #endif
00040    return 1;
00041 }
00042 
00043 
00044 
00045 void dt_buf_free( dt_buf* buf )
00046 {
00047    free( buf->begin );
00048 #ifndef NDEBUG
00049    -- dt_buf_instance_count;
00050 #endif
00051 }
00052 
00053 void dt_buf_clear( dt_buf* buf )
00054 { buf->strEnd = buf->begin; }
00055 
00056 
00057 dt_bool dt_buf_append( dt_buf* buf, int c )
00058 {
00059    if( buf->strEnd == buf->allocEnd )
00060    {
00061       size_t oldSize = buf->strEnd - buf->begin;
00062       size_t newSize = (oldSize==0) ? 32 : (2*oldSize);
00063       dt_byte* newAddr = (dt_byte*)realloc( buf->begin, newSize );
00064       if( newAddr==0 )
00065          return 0;
00066       buf->begin    = newAddr;
00067       buf->strEnd   = newAddr+oldSize;
00068       buf->allocEnd = newAddr+newSize;
00069    }
00070 
00071    * buf->strEnd++ = c;
00072    return 1;
00073 }
00074 
00075 
00076 dt_bool  dt_buf_growth_reserve( dt_buf* buf, unsigned len )
00077 {
00078    size_t avail = buf->allocEnd - buf->strEnd;
00079    if( len > avail )
00080    {
00081       dt_byte* newAddr;
00082       size_t oldSize = buf->strEnd - buf->begin;
00083       size_t newSize = (oldSize==0) ? 32 : (2*oldSize);
00084       if( newSize < oldSize+len ) newSize = oldSize+len;
00085       newAddr = (dt_byte*)realloc( buf->begin, newSize );
00086       if( newAddr==0 )
00087          return 0;
00088       buf->begin    = newAddr;
00089       buf->strEnd   = newAddr+oldSize;
00090       buf->allocEnd = newAddr+newSize;
00091    }
00092    return 1;
00093 }
00094 
00095 
00096 dt_bool dt_buf_append_data( dt_buf* buf, void const* data, unsigned len )
00097 {
00098    if( ! dt_buf_growth_reserve( buf, len ) )
00099       return 0;
00100    memcpy( buf->strEnd, data, len );
00101    buf->strEnd += len;
00102    return 1;
00103 }
00104 
00105 
00106 
00107 
00108 

Generated on Sun Jun 1 16:35:38 2003 for datatree by doxygen 1.3.1