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.h 3.0 kB

2 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #pragma once
  2. #include <stdio.h>
  3. #include <assert.h>
  4. #include <stdlib.h>
  5. #include <stdint.h>
  6. #include <stddef.h>
  7. #include <string.h>
  8. #if defined (__cplusplus)
  9. extern "C" {
  10. #endif
  11. #if !defined(DEFAULT_CACHE_SIZE)
  12. #define DEFAULT_CACHE_SIZE (4 * 1024)
  13. #endif /* DEFAULT_CACHE_SIZE */
  14. typedef struct DynamicBuffer
  15. {
  16. void* buffer;
  17. size_t size;
  18. size_t capacity;
  19. } DynamicBuffer;
  20. #define DynamicBuffer_Capacity(o) ((DynamicBuffer *)(o))->capacity
  21. #define DynamicBuffer_Size(o) ((DynamicBuffer *)(o))->size
  22. #define DynamicBuffer_AppendChar(o,c) DynamicBuffer_Append(o, &c, sizeof(c))
  23. #define DynamicBuffer_AppendNull(o) DynamicBuffer_Append(o, "\0", 1)
  24. #define DynamicBuffer_AppendWNull(o) do { \
  25. DynamicBuffer_Append(o, "\0", 1); \
  26. DynamicBuffer_Append(o, "\0", 1); \
  27. } while (0)
  28. #define DynamicBuffer_AppendNullWithoutSize(o) do { \
  29. DynamicBuffer_Append(o, "\0", 1); \
  30. DynamicBuffer_Resize(o, DynamicBuffer_Size(o) - 1); \
  31. } while (0)
  32. #define DynamicBuffer_AppendWNullWithoutSize(o) do { \
  33. DynamicBuffer_Append(o, "\0", 1); \
  34. DynamicBuffer_Append(o, "\0", 1); \
  35. DynamicBuffer_Resize(o, DynamicBuffer_Size(o) - 2); \
  36. } while (0)
  37. #define DynamicBuffer_Buffer(o) (uint8_t *)(((DynamicBuffer *)(o))->buffer)
  38. #define DynamicBuffer_BufferAt(o,idx) ((uint8_t *)(((DynamicBuffer *)(o))->buffer) + idx)
  39. #define DynamicBuffer_BufferEnd(o) ((uint8_t *)(((DynamicBuffer *)(o))->buffer) + ((DynamicBuffer *)(o))->size)
  40. #define DynamicBuffer_Begin(o) (uint8_t *)(((DynamicBuffer *)(o))->buffer)
  41. #define DynamicBuffer_Back(o) ((((DynamicBuffer *)(o))->size > 0) ? ((uint8_t *)(((DynamicBuffer *)(o))->buffer) + ((DynamicBuffer *)(o))->size - 1) : NULL)
  42. #define DynamicBuffer_Clear(o) ((DynamicBuffer *)(o))->size = 0
  43. #define DynamicBuffer_AvailableBuffer(o) (((uint8_t *)((DynamicBuffer *)(o))->buffer) + ((DynamicBuffer *)(o))->size)
  44. #define DynamicBuffer_AvailableCapacity(o) (((DynamicBuffer *)(o))->capacity - ((DynamicBuffer *)(o))->size)
  45. #define DynamicBuffer_AppendString(o,msg) DynamicBuffer_Append((DynamicBuffer *)(o),(const char *)(msg),strlen((const char *)(msg)));
  46. #define DynamicBuffer_Swap(o,buffer,size) do { \
  47. free(((DynamicBuffer *)(o))->buffer); \
  48. ((DynamicBuffer *)(o))->buffer = buffer; \
  49. ((DynamicBuffer *)(o))->size = ((DynamicBuffer *)(o))->capacity = size; \
  50. } while (0)
  51. #define DynamicBuffer_ConstructWithSize(o,size) do { \
  52. memset(o, 0, sizeof(DynamicBuffer)); \
  53. DynamicBuffer_Reserve(o, size); \
  54. } while (0)
  55. #define DynamicBuffer_Construct(o) DynamicBuffer_ConstructWithSize(o, DEFAULT_CACHE_SIZE)
  56. #define DynamicBuffer_Destruct(o) do { \
  57. free(((DynamicBuffer *)(o))->buffer); \
  58. memset(o, 0, sizeof(DynamicBuffer)); \
  59. } while (0)
  60. int DynamicBuffer_Reserve(DynamicBuffer* o, size_t new_capacity);
  61. int DynamicBuffer_ResetBuffer(DynamicBuffer* o, size_t position);
  62. int DynamicBuffer_Resize(DynamicBuffer* o, size_t new_size);
  63. void DynamicBuffer_Append(DynamicBuffer* o, const void* buffer, size_t size);
  64. #if defined (__cplusplus)
  65. }
  66. #endif