core/CDataPack.cpp
changeset 488 daf1bd692ef3
parent 484 d254e257cac2
child 489 3fe80d566fbd
     1.1 --- a/core/CDataPack.cpp	Wed Feb 14 01:25:45 2007 +0000
     1.2 +++ b/core/CDataPack.cpp	Wed Feb 14 11:03:03 2007 +0000
     1.3 @@ -2,7 +2,7 @@
     1.4  #include <string.h>
     1.5  #include "CDataPack.h"
     1.6  
     1.7 -#define DATAPACK_INITIAL_SIZE		512
     1.8 +#define DATAPACK_INITIAL_SIZE		4//512
     1.9  
    1.10  CDataPack::CDataPack()
    1.11  {
    1.12 @@ -45,36 +45,47 @@
    1.13  
    1.14  size_t CDataPack::CreateMemory(size_t size, void **addr)
    1.15  {
    1.16 +	CheckSize(sizeof(size_t) + size);
    1.17  	size_t pos = m_curptr - m_pBase;
    1.18  
    1.19 -	m_pBase = (char *)realloc(m_pBase, size);
    1.20 -	m_curptr = m_pBase + pos;
    1.21 -	m_capacity = size;
    1.22 +	*(size_t *)m_curptr = size;
    1.23 +	m_curptr += sizeof(size_t);
    1.24  
    1.25  	if (addr)
    1.26  	{
    1.27 -		*addr = m_pBase;
    1.28 +		*addr = m_curptr;
    1.29  	}
    1.30  
    1.31 +	m_curptr += size;
    1.32 +	m_size += sizeof(size_t) + size;
    1.33 +
    1.34  	return pos;
    1.35  }
    1.36  
    1.37  void CDataPack::PackCell(cell_t cell)
    1.38  {
    1.39 -	CheckSize(sizeof(cell_t));
    1.40 +	CheckSize(sizeof(size_t) + sizeof(cell_t));
    1.41 +
    1.42 +	*(size_t *)m_curptr = sizeof(cell_t);
    1.43 +	m_curptr += sizeof(size_t);
    1.44  
    1.45  	*(cell_t *)m_curptr = cell;
    1.46  	m_curptr += sizeof(cell_t);
    1.47 -	m_size += sizeof(cell_t);
    1.48 +
    1.49 +	m_size += sizeof(size_t) + sizeof(cell_t);
    1.50  }
    1.51  
    1.52  void CDataPack::PackFloat(float val)
    1.53  {
    1.54 -	CheckSize(sizeof(float));
    1.55 +	CheckSize(sizeof(size_t) + sizeof(float));
    1.56 +
    1.57 +	*(size_t *)m_curptr = sizeof(float);
    1.58 +	m_curptr += sizeof(size_t);
    1.59  
    1.60  	*(float *)m_curptr = val;
    1.61  	m_curptr += sizeof(float);
    1.62 -	m_size += sizeof(float);
    1.63 +
    1.64 +	m_size += sizeof(size_t) + sizeof(float);
    1.65  }
    1.66  
    1.67  void CDataPack::PackString(const char *string)
    1.68 @@ -118,10 +129,17 @@
    1.69  
    1.70  cell_t CDataPack::ReadCell() const
    1.71  {
    1.72 -	if (!IsReadable(sizeof(cell_t)))
    1.73 +	if (!IsReadable(sizeof(size_t) + sizeof(cell_t)))
    1.74  	{
    1.75  		return 0;
    1.76  	}
    1.77 +	if (*reinterpret_cast<size_t *>(m_curptr) != sizeof(cell_t))
    1.78 +	{
    1.79 +		return 0;
    1.80 +	}
    1.81 +
    1.82 +	m_curptr += sizeof(size_t);
    1.83 +
    1.84  	cell_t val = *reinterpret_cast<cell_t *>(m_curptr);
    1.85  	m_curptr += sizeof(cell_t);
    1.86  	return val;
    1.87 @@ -129,10 +147,17 @@
    1.88  
    1.89  float CDataPack::ReadFloat() const
    1.90  {
    1.91 -	if (!IsReadable(sizeof(float)))
    1.92 +	if (!IsReadable(sizeof(size_t) + sizeof(float)))
    1.93  	{
    1.94  		return 0;
    1.95  	}
    1.96 +	if (*reinterpret_cast<size_t *>(m_curptr) != sizeof(float))
    1.97 +	{
    1.98 +		return 0;
    1.99 +	}
   1.100 +
   1.101 +	m_curptr += sizeof(size_t);
   1.102 +
   1.103  	float val = *reinterpret_cast<float *>(m_curptr);
   1.104  	m_curptr += sizeof(float);
   1.105  	return val;
   1.106 @@ -147,7 +172,7 @@
   1.107  {
   1.108  	if (!IsReadable(sizeof(size_t)))
   1.109  	{
   1.110 -		return 0;
   1.111 +		return NULL;
   1.112  	}
   1.113  
   1.114  	size_t real_len = *(size_t *)m_curptr;
   1.115 @@ -174,3 +199,30 @@
   1.116  {
   1.117  	return m_curptr;
   1.118  }
   1.119 +
   1.120 +void *CDataPack::ReadMemory(size_t *size) const
   1.121 +{
   1.122 +	if (!IsReadable(sizeof(size_t)))
   1.123 +	{
   1.124 +		return NULL;
   1.125 +	}
   1.126 +
   1.127 +	size_t bytecount = *(size_t *)m_curptr;
   1.128 +	m_curptr += sizeof(size_t);
   1.129 +
   1.130 +	if (!IsReadable(bytecount))
   1.131 +	{
   1.132 +		return NULL;
   1.133 +	}
   1.134 +
   1.135 +	void *ptr = m_curptr;
   1.136 +
   1.137 +	if (size)
   1.138 +	{
   1.139 +		*size = bytecount;
   1.140 +	}
   1.141 +
   1.142 +	m_curptr += bytecount;
   1.143 +
   1.144 +	return ptr;
   1.145 +}