| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- #include "serialize/gs_byte_buffer.h"
- #include "common/gs_util.h"
- void gs_byte_buffer_init( gs_byte_buffer* buffer )
- {
- buffer->buffer = gs_malloc( gs_byte_buffer_default_capacity );
- buffer->capacity = gs_byte_buffer_default_capacity;
- buffer->size = 0;
- buffer->position = 0;
- }
- gs_byte_buffer gs_byte_buffer_new()
- {
- gs_byte_buffer buffer;
- gs_byte_buffer_init( &buffer );
- return buffer;
- }
- void gs_byte_buffer_free( gs_byte_buffer* buffer )
- {
- if ( buffer && buffer->buffer ) {
- gs_free( buffer->buffer );
- }
- }
- void gs_byte_buffer_clear( gs_byte_buffer* buffer )
- {
- buffer->size = 0;
- buffer->position = 0;
- }
- void gs_byte_buffer_resize( gs_byte_buffer* buffer, usize sz )
- {
- u8* data = gs_realloc( buffer->buffer, sz );
- if ( data == NULL ) {
- return;
- }
- buffer->buffer = data;
- buffer->capacity = sz;
- }
- void gs_byte_buffer_seek_to_beg( gs_byte_buffer* buffer )
- {
- buffer->position = 0;
- }
- void gs_byte_buffer_seek_to_end( gs_byte_buffer* buffer )
- {
- buffer->position = buffer->size;
- }
- void gs_byte_buffer_advance_position( gs_byte_buffer* buffer, usize sz )
- {
- buffer->position += sz;
- }
- void gs_byte_buffer_bulk_write( gs_byte_buffer* buffer, void* src, u32 size )
- {
- // Check for necessary resize
- u32 total_write_size = buffer->position + size;
- if ( total_write_size >= buffer->capacity )
- {
- usize capacity = buffer->capacity * 2;
- while( capacity <= total_write_size )
- {
- capacity *= 2;
- }
- gs_byte_buffer_resize( buffer, capacity );
- }
- // memcpy data
- memcpy( ( buffer->buffer + buffer->position ), src, size );
- buffer->size += size;
- buffer->position += size;
- }
- void gs_byte_buffer_bulk_read( gs_byte_buffer* buffer, void* dst, u32 size )
- {
- memcpy( dst, ( buffer->buffer + buffer->position ), size );
- buffer->position += size;
- }
- void gs_byte_buffer_write_str( gs_byte_buffer* buffer, const char* str )
- {
- // Write size of string
- u32 str_len = gs_string_length( str );
- gs_byte_buffer_write( buffer, u16, str_len );
- usize i; for ( i = 0; i < str_len; ++i )
- {
- gs_byte_buffer_write( buffer, u8, str[ i ] );
- }
- }
- void gs_byte_buffer_read_str( gs_byte_buffer* buffer, char* str )
- {
- // Read in size of string from buffer
- u16 sz = gs_byte_buffer_read( buffer, u16 );
- u32 i;
- for ( i = 0; i < sz; ++i )
- {
- str[ i ] = gs_byte_buffer_read( buffer, u8 );
- }
- str[ i ] = '\0';
- }
- gs_result
- gs_byte_buffer_write_to_file
- (
- gs_byte_buffer* buffer,
- const char* output_path
- )
- {
- FILE* fp = fopen( output_path, "wb" );
- if ( fp )
- {
- s32 ret = fwrite( buffer->buffer, sizeof( u8 ), buffer->size, fp );
- if ( ret == buffer->size )
- {
- return gs_result_success;
- }
- }
- return gs_result_failure;
- }
- gs_result
- gs_byte_buffer_read_from_file
- (
- gs_byte_buffer* buffer,
- const char* file_path
- )
- {
- buffer->buffer = ( u8* )gs_read_file_contents_into_string_null_term( file_path, "rb", ( usize* )&buffer->size );
- if ( !buffer->buffer ) {
- gs_assert( false );
- return gs_result_failure;
- }
- buffer->position = 0;
- buffer->capacity = buffer->size;
- return gs_result_success;
- }
- // "Generic" read function
- #define __gs_byte_buffer_read_func( T )\
- __gs_byte_buffer_func( T )\
- {\
- gs_byte_buffer* _buffer = bb;\
- usize sz = sizeof( T );\
- T val = *( T* )( _buffer->buffer + _buffer->position );\
- _buffer->position += sz;\
- return val;\
- }
- __gs_byte_buffer_read_func( usize );
- __gs_byte_buffer_read_func( s8 );
- __gs_byte_buffer_read_func( u8 );
- __gs_byte_buffer_read_func( u16 );
- __gs_byte_buffer_read_func( s16 );
- __gs_byte_buffer_read_func( s32 );
- __gs_byte_buffer_read_func( u32 );
- __gs_byte_buffer_read_func( b32 );
- __gs_byte_buffer_read_func( s64 );
- __gs_byte_buffer_read_func( u64 );
- __gs_byte_buffer_read_func( f32 );
- __gs_byte_buffer_read_func( f64 );
- __gs_byte_buffer_read_func( gs_vec2 );
- __gs_byte_buffer_read_func( gs_vec3 );
- __gs_byte_buffer_read_func( gs_vec4 );
- __gs_byte_buffer_read_func( gs_quat );
- __gs_byte_buffer_read_func( gs_mat4 );
- __gs_byte_buffer_read_func( gs_vqs );
|