| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- #include "serialize/gs_byte_buffer.h"
- #include "common/gs_types.h"
- #include "common/gs_util.h"
- void gs_byte_buffer_init(gs_byte_buffer_t* buffer)
- {
- buffer->data = gs_malloc(gs_byte_buffer_default_capacity);
- buffer->capacity = gs_byte_buffer_default_capacity;
- buffer->size = 0;
- buffer->position = 0;
- }
- gs_byte_buffer_t gs_byte_buffer_new()
- {
- gs_byte_buffer_t buffer;
- gs_byte_buffer_init(&buffer);
- return buffer;
- }
- void gs_byte_buffer_free(gs_byte_buffer_t* buffer)
- {
- if (buffer && buffer->data) {
- gs_free(buffer->data);
- }
- }
- void gs_byte_buffer_clear(gs_byte_buffer_t* buffer)
- {
- buffer->size = 0;
- buffer->position = 0;
- }
- void gs_byte_buffer_resize(gs_byte_buffer_t* buffer, usize sz)
- {
- u8* data = gs_realloc(buffer->data, sz);
- if (data == NULL) {
- return;
- }
- buffer->data = data;
- buffer->capacity = sz;
- }
- void gs_byte_buffer_seek_to_beg(gs_byte_buffer_t* buffer)
- {
- buffer->position = 0;
- }
- void gs_byte_buffer_seek_to_end(gs_byte_buffer_t* buffer)
- {
- buffer->position = buffer->size;
- }
- void gs_byte_buffer_advance_position(gs_byte_buffer_t* buffer, usize sz)
- {
- buffer->position += sz;
- }
- void gs_byte_buffer_bulk_write(gs_byte_buffer_t* 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->data + buffer->position), src, size);
- buffer->size += size;
- buffer->position += size;
- }
- void gs_byte_buffer_bulk_read(gs_byte_buffer_t* buffer, void* dst, u32 size)
- {
- memcpy(dst, (buffer->data + buffer->position), size);
- buffer->position += size;
- }
- void gs_byte_buffer_write_str(gs_byte_buffer_t* 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_t* buffer, char* str)
- {
- // Read in size of string from buffer
- u16 sz;
- gs_byte_buffer_read(buffer, u16, &sz);
- u32 i;
- for (i = 0; i < sz; ++i)
- {
- gs_byte_buffer_read(buffer, u8, &str[i]);
- }
- str[i] = '\0';
- }
- gs_result
- gs_byte_buffer_write_to_file
- (
- gs_byte_buffer_t* buffer,
- const char* output_path
- )
- {
- FILE* fp = fopen(output_path, "wb");
- if (fp)
- {
- s32 ret = fwrite(buffer->data, 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_t* buffer,
- const char* file_path
- )
- {
- buffer->data = (u8*)gs_read_file_contents_into_string_null_term(file_path, "rb", (usize*)&buffer->size);
- if (!buffer->data) {
- gs_assert(false);
- return gs_result_failure;
- }
- buffer->position = 0;
- buffer->capacity = buffer->size;
- return gs_result_success;
- }
|