gs_byte_buffer.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #include "serialize/gs_byte_buffer.h"
  2. #include "common/gs_util.h"
  3. void gs_byte_buffer_init( gs_byte_buffer* buffer )
  4. {
  5. buffer->buffer = gs_malloc( gs_byte_buffer_default_capacity );
  6. buffer->capacity = gs_byte_buffer_default_capacity;
  7. buffer->size = 0;
  8. buffer->position = 0;
  9. }
  10. gs_byte_buffer gs_byte_buffer_new()
  11. {
  12. gs_byte_buffer buffer;
  13. gs_byte_buffer_init( &buffer );
  14. return buffer;
  15. }
  16. void gs_byte_buffer_free( gs_byte_buffer* buffer )
  17. {
  18. if ( buffer && buffer->buffer ) {
  19. gs_free( buffer->buffer );
  20. }
  21. }
  22. void gs_byte_buffer_clear( gs_byte_buffer* buffer )
  23. {
  24. buffer->size = 0;
  25. buffer->position = 0;
  26. }
  27. void gs_byte_buffer_resize( gs_byte_buffer* buffer, usize sz )
  28. {
  29. u8* data = gs_realloc( buffer->buffer, sz );
  30. if ( data == NULL ) {
  31. return;
  32. }
  33. buffer->buffer = data;
  34. buffer->capacity = sz;
  35. }
  36. void gs_byte_buffer_seek_to_beg( gs_byte_buffer* buffer )
  37. {
  38. buffer->position = 0;
  39. }
  40. void gs_byte_buffer_seek_to_end( gs_byte_buffer* buffer )
  41. {
  42. buffer->position = buffer->size;
  43. }
  44. void gs_byte_buffer_advance_position( gs_byte_buffer* buffer, usize sz )
  45. {
  46. buffer->position += sz;
  47. }
  48. void gs_byte_buffer_bulk_write( gs_byte_buffer* buffer, void* src, u32 size )
  49. {
  50. // Check for necessary resize
  51. u32 total_write_size = buffer->position + size;
  52. if ( total_write_size >= buffer->capacity )
  53. {
  54. usize capacity = buffer->capacity * 2;
  55. while( capacity <= total_write_size )
  56. {
  57. capacity *= 2;
  58. }
  59. gs_byte_buffer_resize( buffer, capacity );
  60. }
  61. // memcpy data
  62. memcpy( ( buffer->buffer + buffer->position ), src, size );
  63. buffer->size += size;
  64. buffer->position += size;
  65. }
  66. void gs_byte_buffer_bulk_read( gs_byte_buffer* buffer, void* dst, u32 size )
  67. {
  68. memcpy( dst, ( buffer->buffer + buffer->position ), size );
  69. buffer->position += size;
  70. }
  71. void gs_byte_buffer_write_str( gs_byte_buffer* buffer, const char* str )
  72. {
  73. // Write size of string
  74. u32 str_len = gs_string_length( str );
  75. gs_byte_buffer_write( buffer, u16, str_len );
  76. usize i; for ( i = 0; i < str_len; ++i )
  77. {
  78. gs_byte_buffer_write( buffer, u8, str[ i ] );
  79. }
  80. }
  81. void gs_byte_buffer_read_str( gs_byte_buffer* buffer, char* str )
  82. {
  83. // Read in size of string from buffer
  84. u16 sz = gs_byte_buffer_read( buffer, u16 );
  85. u32 i;
  86. for ( i = 0; i < sz; ++i )
  87. {
  88. str[ i ] = gs_byte_buffer_read( buffer, u8 );
  89. }
  90. str[ i ] = '\0';
  91. }
  92. gs_result
  93. gs_byte_buffer_write_to_file
  94. (
  95. gs_byte_buffer* buffer,
  96. const char* output_path
  97. )
  98. {
  99. FILE* fp = fopen( output_path, "wb" );
  100. if ( fp )
  101. {
  102. s32 ret = fwrite( buffer->buffer, sizeof( u8 ), buffer->size, fp );
  103. if ( ret == buffer->size )
  104. {
  105. return gs_result_success;
  106. }
  107. }
  108. return gs_result_failure;
  109. }
  110. gs_result
  111. gs_byte_buffer_read_from_file
  112. (
  113. gs_byte_buffer* buffer,
  114. const char* file_path
  115. )
  116. {
  117. buffer->buffer = ( u8* )gs_read_file_contents_into_string_null_term( file_path, "rb", ( usize* )&buffer->size );
  118. if ( !buffer->buffer ) {
  119. gs_assert( false );
  120. return gs_result_failure;
  121. }
  122. buffer->position = 0;
  123. buffer->capacity = buffer->size;
  124. return gs_result_success;
  125. }
  126. // "Generic" read function
  127. #define __gs_byte_buffer_read_func( T )\
  128. __gs_byte_buffer_func( T )\
  129. {\
  130. gs_byte_buffer* _buffer = bb;\
  131. usize sz = sizeof( T );\
  132. T val = *( T* )( _buffer->buffer + _buffer->position );\
  133. _buffer->position += sz;\
  134. return val;\
  135. }
  136. __gs_byte_buffer_read_func( usize );
  137. __gs_byte_buffer_read_func( s8 );
  138. __gs_byte_buffer_read_func( u8 );
  139. __gs_byte_buffer_read_func( u16 );
  140. __gs_byte_buffer_read_func( s16 );
  141. __gs_byte_buffer_read_func( s32 );
  142. __gs_byte_buffer_read_func( u32 );
  143. __gs_byte_buffer_read_func( b32 );
  144. __gs_byte_buffer_read_func( s64 );
  145. __gs_byte_buffer_read_func( u64 );
  146. __gs_byte_buffer_read_func( f32 );
  147. __gs_byte_buffer_read_func( f64 );
  148. __gs_byte_buffer_read_func( gs_vec2 );
  149. __gs_byte_buffer_read_func( gs_vec3 );
  150. __gs_byte_buffer_read_func( gs_vec4 );
  151. __gs_byte_buffer_read_func( gs_quat );
  152. __gs_byte_buffer_read_func( gs_mat4 );
  153. __gs_byte_buffer_read_func( gs_vqs );