7zBuf2.c 889 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /* 7zBuf2.c -- Byte Buffer
  2. 2014-08-22 : Igor Pavlov : Public domain */
  3. #include "Precomp.h"
  4. #include <string.h>
  5. #include "7zBuf.h"
  6. void DynBuf_Construct(CDynBuf *p)
  7. {
  8. p->data = 0;
  9. p->size = 0;
  10. p->pos = 0;
  11. }
  12. void DynBuf_SeekToBeg(CDynBuf *p)
  13. {
  14. p->pos = 0;
  15. }
  16. int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAlloc *alloc)
  17. {
  18. if (size > p->size - p->pos)
  19. {
  20. size_t newSize = p->pos + size;
  21. Byte *data;
  22. newSize += newSize / 4;
  23. data = (Byte *)alloc->Alloc(alloc, newSize);
  24. if (data == 0)
  25. return 0;
  26. p->size = newSize;
  27. memcpy(data, p->data, p->pos);
  28. alloc->Free(alloc, p->data);
  29. p->data = data;
  30. }
  31. if (size != 0)
  32. {
  33. memcpy(p->data + p->pos, buf, size);
  34. p->pos += size;
  35. }
  36. return 1;
  37. }
  38. void DynBuf_Free(CDynBuf *p, ISzAlloc *alloc)
  39. {
  40. alloc->Free(alloc, p->data);
  41. p->data = 0;
  42. p->size = 0;
  43. p->pos = 0;
  44. }