You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

dynamic_buffer.c 1.6 kB

2 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "dynamic_buffer.h"
  2. int DynamicBuffer_Reserve(DynamicBuffer* o, size_t new_capacity)
  3. {
  4. int succ = 0;
  5. if (o->capacity < new_capacity)
  6. {
  7. void* tmp_buffer = realloc(o->buffer, new_capacity);
  8. if (tmp_buffer == NULL)
  9. {
  10. goto func_end;
  11. }
  12. o->capacity = new_capacity;
  13. o->buffer = tmp_buffer;
  14. }
  15. succ = 1;
  16. func_end:
  17. return succ;
  18. }
  19. int DynamicBuffer_ResetBuffer(DynamicBuffer* o, size_t position)
  20. {
  21. int succ = 0;
  22. /// position should never larger than buffer size!
  23. assert(position <= o->size);
  24. if (position > o->size)
  25. {
  26. printf("[E] Failed to reset buffer: position is larger than buffer size!");
  27. goto func_end;
  28. }
  29. if (position != o->size)
  30. {
  31. memmove(o->buffer, (uint8_t *)o->buffer + position, o->size - position);
  32. }
  33. o->size -= position;
  34. succ = 1;
  35. func_end:
  36. return succ;
  37. }
  38. int DynamicBuffer_Resize(DynamicBuffer* o, size_t new_size)
  39. {
  40. if (o->size <= new_size)
  41. {
  42. o->size = new_size;
  43. return 1;
  44. }
  45. if (!DynamicBuffer_Reserve(o, new_size))
  46. {
  47. return 0;
  48. }
  49. o->size = new_size;
  50. return 1;
  51. }
  52. /// FIXME(anjingyu): Assume never overflow!
  53. void DynamicBuffer_Append(DynamicBuffer* o, const void* buffer, size_t size)
  54. {
  55. size_t new_size = o->capacity;
  56. while (o->size + size > new_size)
  57. {
  58. new_size <<= 1;
  59. }
  60. DynamicBuffer_Reserve(o, new_size);
  61. memmove(o->buffer + o->size, buffer, size);
  62. o->size += size;
  63. }