Buffer.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "Buffer.h"
  2. #include <assert.h>
  3. #include <string.h>
  4. #include "Constants.h"
  5. #include "Memory.h"
  6. void bufferInit(Buffer* b) {
  7. *b = (Buffer){};
  8. }
  9. void bufferDestroy(Buffer* b) {
  10. memoryFree(b->data);
  11. *b = (Buffer){};
  12. }
  13. void bufferReset(Buffer* b) {
  14. b->readIndex = 0;
  15. b->writeIndex = 0;
  16. }
  17. bool bufferWrite(Buffer* b, const void* p, size_t n) {
  18. while(b->writeIndex + n > b->maxIndex) {
  19. size_t newSize = b->maxIndex <= 0 ? 16 : (b->maxIndex * 5) / 4;
  20. u8* newData = memoryAllocate(newSize);
  21. if(newData == nullptr) {
  22. return true;
  23. }
  24. memcpy(newData, b->data, b->writeIndex);
  25. memoryFree(b->data);
  26. b->data = newData;
  27. b->maxIndex = newSize;
  28. }
  29. memcpy(b->data + b->writeIndex, p, n);
  30. b->writeIndex += n;
  31. return false;
  32. }
  33. bool bufferRead(Buffer* b, void* p, size_t n) {
  34. if(b->readIndex + n > b->writeIndex) {
  35. return true;
  36. }
  37. memcpy(p, b->data + b->readIndex, n);
  38. b->readIndex += n;
  39. return false;
  40. }
  41. #define BUFFER_READ_WRITE_IMPL(Type, type) \
  42. bool bufferWrite##Type(Buffer* b, type t) { \
  43. return bufferWrite(b, &t, sizeof(type)); \
  44. } \
  45. bool bufferRead##Type(Buffer* b, type* t) { \
  46. return bufferRead(b, t, sizeof(type)); \
  47. }
  48. BUFFER_READ_WRITE_IMPL(I32, i32)
  49. BUFFER_READ_WRITE_IMPL(U8, u8)
  50. bool bufferWriteString(Buffer* b, const char* s) {
  51. size_t l = strlen(s) + 1;
  52. assert(l <= MAX_STRING_LENGTH && l <= MAX_LITERAL_LENGTH);
  53. static_assert(MAX_STRING_LENGTH <= 0xFF);
  54. static_assert(MAX_LITERAL_LENGTH <= 0xFF);
  55. u8 u = l & 0xFF;
  56. return bufferWriteU8(b, u) || bufferWrite(b, s, u);
  57. }
  58. const char* bufferReadString(Buffer* b) {
  59. u8 l = 0;
  60. if(bufferReadU8(b, &l) || b->readIndex + l > b->writeIndex) {
  61. return nullptr;
  62. }
  63. const char* s = (char*)(b->data + b->readIndex);
  64. b->readIndex += l;
  65. return s;
  66. }