Clone of PhatAC @ https://github.com/floaterxk/PhatAC

BinaryWriter.cpp 1.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "StdAfx.h"
  2. #include "BinaryWriter.h"
  3. // Expandable buffer with AC style data IO
  4. BinaryWriter::BinaryWriter()
  5. {
  6. m_pbData = new BYTE[0x20];
  7. m_dwDataSize = 0x20;
  8. m_pbDataPos = m_pbData;
  9. m_dwSize = 0;
  10. }
  11. BinaryWriter::~BinaryWriter()
  12. {
  13. if (m_pbData)
  14. {
  15. delete[] m_pbData;
  16. m_pbData = NULL;
  17. }
  18. }
  19. void BinaryWriter::ExpandBuffer(size_t len)
  20. {
  21. if (m_dwDataSize < len)
  22. {
  23. DWORD dwExpandedSize;
  24. if (len <= (m_dwDataSize + 0x80))
  25. dwExpandedSize = m_dwDataSize + 0x80;
  26. else
  27. dwExpandedSize = (DWORD)len;
  28. BYTE *pbExpandedBuffer = new BYTE[dwExpandedSize];
  29. memcpy(pbExpandedBuffer, m_pbData, m_dwSize);
  30. delete[] m_pbData;
  31. m_pbData = pbExpandedBuffer;
  32. m_dwDataSize = dwExpandedSize;
  33. m_pbDataPos = m_pbData + m_dwSize;
  34. }
  35. }
  36. void BinaryWriter::AppendString(const char *szString)
  37. {
  38. if (szString)
  39. {
  40. WORD len = (WORD)strlen(szString);
  41. AppendData(&len, sizeof(WORD));
  42. AppendData(szString, len);
  43. }
  44. else
  45. AppendData((WORD)0);
  46. Align();
  47. }
  48. void BinaryWriter::AppendData(const void *pData, size_t len)
  49. {
  50. ExpandBuffer(m_dwSize + len);
  51. memcpy(m_pbDataPos, pData, len);
  52. m_pbDataPos += len;
  53. m_dwSize += (DWORD)len;
  54. }
  55. void BinaryWriter::Align(void)
  56. {
  57. DWORD offset = DWORD(m_pbDataPos - m_pbData);
  58. if ((offset % 4) != 0)
  59. {
  60. DWORD len = 4 - (offset % 4);
  61. ExpandBuffer(m_dwSize + len);
  62. memset(m_pbDataPos, 0, len);
  63. m_pbDataPos += len;
  64. m_dwSize += len;
  65. }
  66. }
  67. BYTE* BinaryWriter::GetData(void)
  68. {
  69. return m_pbData;
  70. }
  71. DWORD BinaryWriter::GetSize(void)
  72. {
  73. return m_dwSize;
  74. }