gs_byte_buffer.c 2.9 KB

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