grow_buf.cpp 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "pfc.h"
  2. void grow_buf::makespace(int new_size)
  3. {
  4. if (!ptr || !size)
  5. {
  6. size = 1;
  7. while(size<new_size)
  8. {
  9. if (size == (1 << 31))
  10. {
  11. return;
  12. }
  13. size<<=1;
  14. }
  15. ptr = malloc(size);
  16. }
  17. else
  18. {
  19. if (size<new_size)
  20. {
  21. do
  22. {
  23. if (size == (1 << 31))
  24. {
  25. free(ptr);
  26. ptr=0;
  27. return;
  28. }
  29. size<<=1;
  30. }
  31. while (size<new_size);
  32. ptr = realloc(ptr,size);
  33. }
  34. }
  35. }
  36. void * grow_buf::finish()
  37. {
  38. void * rv=0;
  39. if (ptr)
  40. {
  41. rv = realloc(ptr,used);
  42. ptr = 0;
  43. size = 0;
  44. used = 0;
  45. }
  46. return rv;
  47. }
  48. void grow_buf::reset()
  49. {
  50. if (ptr) {free(ptr);ptr=0;}
  51. used=0;
  52. size=0;
  53. }
  54. static void foo_memcpy(void * dst,const void * src,size_t bytes)
  55. {
  56. if (src) memcpy(dst,src,bytes);
  57. else memset(dst,0,bytes);
  58. }
  59. bool grow_buf::write(const void * data, size_t bytes)
  60. {
  61. makespace(used+bytes);
  62. if (!ptr)
  63. return false;
  64. foo_memcpy((char*)ptr+used,data,bytes);
  65. used+=bytes;
  66. return true;
  67. }
  68. void grow_buf::write_ptr(const void * data, int bytes,int offset)
  69. {
  70. if (offset+bytes>used) {used = offset;write(data,bytes);}
  71. else foo_memcpy((char*)ptr+offset,data,bytes);
  72. }