tomwalters@0: /* tomwalters@0: buffer.c tomwalters@0: ======== tomwalters@0: tomwalters@0: generic data buffer tomwalters@0: tomwalters@0: */ tomwalters@0: tomwalters@0: tomwalters@0: #include "stitch.h" tomwalters@0: #include "buffer.h" tomwalters@0: tomwalters@0: Buffer NewBuffer( where ) tomwalters@0: char where ; tomwalters@0: { tomwalters@0: DeclareNew( Buffer, buffer ) ; tomwalters@0: tomwalters@0: buffer->size = 0 ; tomwalters@0: buffer->refs = 1 ; tomwalters@0: tomwalters@0: return ( buffer ) ; tomwalters@0: } tomwalters@0: tomwalters@0: Buffer SharedBuffer( buffer ) tomwalters@0: Buffer buffer ; tomwalters@0: { tomwalters@0: buffer->refs++ ; tomwalters@0: tomwalters@0: return ( buffer ) ; tomwalters@0: } tomwalters@0: tomwalters@0: Buffer ResizedBuffer( buffer, size ) tomwalters@0: Buffer buffer ; tomwalters@0: unsigned size ; tomwalters@0: { tomwalters@0: if( size > BufferSize( buffer ) || size == 0 ) { tomwalters@0: tomwalters@0: if( BufferSize( buffer ) != 0 ) tomwalters@0: Free( BufferPointer( buffer ) ) ; tomwalters@0: tomwalters@0: SetBufferSize( buffer, size ) ; tomwalters@0: tomwalters@0: if( size != 0 ) tomwalters@0: SetBufferPointer( buffer, Malloc( size, "buffer.c for buffer" ) ) ; tomwalters@0: } tomwalters@0: tomwalters@0: return ( buffer ) ; tomwalters@0: } tomwalters@0: tomwalters@0: void FreeBuffer( buffer ) tomwalters@0: Buffer buffer ; tomwalters@0: { tomwalters@0: if( --buffer->refs == 0 ) tomwalters@0: Free( ResizedBuffer( buffer, 0 ) ) ; tomwalters@0: tomwalters@0: return ; tomwalters@0: }