| author | Borja Ferrer <faluco@alliedmods.net> |
| Wed Feb 14 11:03:03 2007 +0000 (2007-02-14) | |
| changeset 488 | daf1bd692ef3 |
| parent 484 | d254e257cac2 |
| child 489 | 3fe80d566fbd |
| permissions | -rw-r--r-- |
| faluco@484 | 1 |
#include <malloc.h> |
| faluco@484 | 2 |
#include <string.h> |
| faluco@484 | 3 |
#include "CDataPack.h" |
| faluco@484 | 4 |
|
| faluco@488 | 5 |
#define DATAPACK_INITIAL_SIZE 4//512 |
| faluco@484 | 6 |
|
| faluco@484 | 7 |
CDataPack::CDataPack() |
| faluco@484 | 8 |
{ |
| faluco@484 | 9 |
m_pBase = (char *)malloc(DATAPACK_INITIAL_SIZE); |
| faluco@484 | 10 |
m_capacity = DATAPACK_INITIAL_SIZE; |
| faluco@484 | 11 |
Initialize(); |
| faluco@484 | 12 |
} |
| faluco@484 | 13 |
|
| faluco@484 | 14 |
CDataPack::~CDataPack() |
| faluco@484 | 15 |
{ |
| faluco@484 | 16 |
free(m_pBase); |
| faluco@484 | 17 |
} |
| faluco@484 | 18 |
|
| faluco@484 | 19 |
void CDataPack::Initialize() |
| faluco@484 | 20 |
{ |
| faluco@484 | 21 |
m_curptr = m_pBase; |
| faluco@484 | 22 |
m_size = 0; |
| faluco@484 | 23 |
} |
| faluco@484 | 24 |
|
| faluco@484 | 25 |
void CDataPack::CheckSize(size_t typesize) |
| faluco@484 | 26 |
{ |
| faluco@484 | 27 |
if (m_curptr - m_pBase + typesize <= m_capacity) |
| faluco@484 | 28 |
{ |
| faluco@484 | 29 |
return; |
| faluco@484 | 30 |
} |
| faluco@484 | 31 |
|
| faluco@484 | 32 |
size_t pos = m_curptr - m_pBase; |
| faluco@484 | 33 |
do |
| faluco@484 | 34 |
{ |
| faluco@484 | 35 |
m_capacity *= 2; |
| faluco@484 | 36 |
m_pBase = (char *)realloc(m_pBase, m_capacity); |
| faluco@484 | 37 |
m_curptr = m_pBase + pos; |
| faluco@484 | 38 |
} while (m_curptr - m_pBase + typesize > m_capacity); |
| faluco@484 | 39 |
} |
| faluco@484 | 40 |
|
| faluco@484 | 41 |
void CDataPack::ResetSize() |
| faluco@484 | 42 |
{ |
| faluco@484 | 43 |
m_size = 0; |
| faluco@484 | 44 |
} |
| faluco@484 | 45 |
|
| faluco@484 | 46 |
size_t CDataPack::CreateMemory(size_t size, void **addr) |
| faluco@484 | 47 |
{ |
| faluco@488 | 48 |
CheckSize(sizeof(size_t) + size); |
| faluco@484 | 49 |
size_t pos = m_curptr - m_pBase; |
| faluco@484 | 50 |
|
| faluco@488 | 51 |
*(size_t *)m_curptr = size; |
| faluco@488 | 52 |
m_curptr += sizeof(size_t); |
| faluco@484 | 53 |
|
| faluco@484 | 54 |
if (addr) |
| faluco@484 | 55 |
{ |
| faluco@488 | 56 |
*addr = m_curptr; |
| faluco@484 | 57 |
} |
| faluco@484 | 58 |
|
| faluco@488 | 59 |
m_curptr += size; |
| faluco@488 | 60 |
m_size += sizeof(size_t) + size; |
| faluco@488 | 61 |
|
| faluco@484 | 62 |
return pos; |
| faluco@484 | 63 |
} |
| faluco@484 | 64 |
|
| faluco@484 | 65 |
void CDataPack::PackCell(cell_t cell) |
| faluco@484 | 66 |
{ |
| faluco@488 | 67 |
CheckSize(sizeof(size_t) + sizeof(cell_t)); |
| faluco@488 | 68 |
|
| faluco@488 | 69 |
*(size_t *)m_curptr = sizeof(cell_t); |
| faluco@488 | 70 |
m_curptr += sizeof(size_t); |
| faluco@484 | 71 |
|
| faluco@484 | 72 |
*(cell_t *)m_curptr = cell; |
| faluco@484 | 73 |
m_curptr += sizeof(cell_t); |
| faluco@488 | 74 |
|
| faluco@488 | 75 |
m_size += sizeof(size_t) + sizeof(cell_t); |
| faluco@484 | 76 |
} |
| faluco@484 | 77 |
|
| faluco@484 | 78 |
void CDataPack::PackFloat(float val) |
| faluco@484 | 79 |
{ |
| faluco@488 | 80 |
CheckSize(sizeof(size_t) + sizeof(float)); |
| faluco@488 | 81 |
|
| faluco@488 | 82 |
*(size_t *)m_curptr = sizeof(float); |
| faluco@488 | 83 |
m_curptr += sizeof(size_t); |
| faluco@484 | 84 |
|
| faluco@484 | 85 |
*(float *)m_curptr = val; |
| faluco@484 | 86 |
m_curptr += sizeof(float); |
| faluco@488 | 87 |
|
| faluco@488 | 88 |
m_size += sizeof(size_t) + sizeof(float); |
| faluco@484 | 89 |
} |
| faluco@484 | 90 |
|
| faluco@484 | 91 |
void CDataPack::PackString(const char *string) |
| faluco@484 | 92 |
{ |
| faluco@484 | 93 |
size_t len = strlen(string); |
| faluco@484 | 94 |
size_t maxsize = sizeof(size_t) + len + 1; |
| faluco@484 | 95 |
CheckSize(maxsize); |
| faluco@484 | 96 |
|
| faluco@484 | 97 |
// Pack the string length first for buffer overrun checking. |
| faluco@484 | 98 |
*(size_t *)m_curptr = len; |
| faluco@484 | 99 |
m_curptr += sizeof(size_t); |
| faluco@484 | 100 |
|
| faluco@484 | 101 |
// Now pack the string. |
| faluco@484 | 102 |
memcpy(m_curptr, string, len); |
| faluco@484 | 103 |
m_curptr[len] = '\0'; |
| faluco@484 | 104 |
m_curptr += len + 1; |
| faluco@484 | 105 |
|
| faluco@484 | 106 |
m_size += maxsize; |
| faluco@484 | 107 |
} |
| faluco@484 | 108 |
|
| faluco@484 | 109 |
void CDataPack::Reset() const |
| faluco@484 | 110 |
{ |
| faluco@484 | 111 |
m_curptr = m_pBase; |
| faluco@484 | 112 |
} |
| faluco@484 | 113 |
|
| faluco@484 | 114 |
size_t CDataPack::GetPosition() const |
| faluco@484 | 115 |
{ |
| faluco@484 | 116 |
return static_cast<size_t>(m_curptr - m_pBase); |
| faluco@484 | 117 |
} |
| faluco@484 | 118 |
|
| faluco@484 | 119 |
bool CDataPack::SetPosition(size_t pos) const |
| faluco@484 | 120 |
{ |
| faluco@484 | 121 |
if (pos > m_size-1) |
| faluco@484 | 122 |
{ |
| faluco@484 | 123 |
return false; |
| faluco@484 | 124 |
} |
| faluco@484 | 125 |
m_curptr = m_pBase + pos; |
| faluco@484 | 126 |
|
| faluco@484 | 127 |
return true; |
| faluco@484 | 128 |
} |
| faluco@484 | 129 |
|
| faluco@484 | 130 |
cell_t CDataPack::ReadCell() const |
| faluco@484 | 131 |
{ |
| faluco@488 | 132 |
if (!IsReadable(sizeof(size_t) + sizeof(cell_t))) |
| faluco@484 | 133 |
{ |
| faluco@484 | 134 |
return 0; |
| faluco@484 | 135 |
} |
| faluco@488 | 136 |
if (*reinterpret_cast<size_t *>(m_curptr) != sizeof(cell_t)) |
| faluco@488 | 137 |
{ |
| faluco@488 | 138 |
return 0; |
| faluco@488 | 139 |
} |
| faluco@488 | 140 |
|
| faluco@488 | 141 |
m_curptr += sizeof(size_t); |
| faluco@488 | 142 |
|
| faluco@484 | 143 |
cell_t val = *reinterpret_cast<cell_t *>(m_curptr); |
| faluco@484 | 144 |
m_curptr += sizeof(cell_t); |
| faluco@484 | 145 |
return val; |
| faluco@484 | 146 |
} |
| faluco@484 | 147 |
|
| faluco@484 | 148 |
float CDataPack::ReadFloat() const |
| faluco@484 | 149 |
{ |
| faluco@488 | 150 |
if (!IsReadable(sizeof(size_t) + sizeof(float))) |
| faluco@484 | 151 |
{ |
| faluco@484 | 152 |
return 0; |
| faluco@484 | 153 |
} |
| faluco@488 | 154 |
if (*reinterpret_cast<size_t *>(m_curptr) != sizeof(float)) |
| faluco@488 | 155 |
{ |
| faluco@488 | 156 |
return 0; |
| faluco@488 | 157 |
} |
| faluco@488 | 158 |
|
| faluco@488 | 159 |
m_curptr += sizeof(size_t); |
| faluco@488 | 160 |
|
| faluco@484 | 161 |
float val = *reinterpret_cast<float *>(m_curptr); |
| faluco@484 | 162 |
m_curptr += sizeof(float); |
| faluco@484 | 163 |
return val; |
| faluco@484 | 164 |
} |
| faluco@484 | 165 |
|
| faluco@484 | 166 |
bool CDataPack::IsReadable(size_t bytes) const |
| faluco@484 | 167 |
{ |
| faluco@484 | 168 |
return (bytes + (m_curptr - m_pBase) > m_size) ? false : true; |
| faluco@484 | 169 |
} |
| faluco@484 | 170 |
|
| faluco@484 | 171 |
const char *CDataPack::ReadString(size_t *len) const |
| faluco@484 | 172 |
{ |
| faluco@484 | 173 |
if (!IsReadable(sizeof(size_t))) |
| faluco@484 | 174 |
{ |
| faluco@488 | 175 |
return NULL; |
| faluco@484 | 176 |
} |
| faluco@484 | 177 |
|
| faluco@484 | 178 |
size_t real_len = *(size_t *)m_curptr; |
| faluco@484 | 179 |
|
| faluco@484 | 180 |
m_curptr += sizeof(size_t); |
| faluco@484 | 181 |
char *str = (char *)m_curptr; |
| faluco@484 | 182 |
|
| faluco@484 | 183 |
if ((strlen(str) != real_len) || !(IsReadable(real_len+1))) |
| faluco@484 | 184 |
{ |
| faluco@484 | 185 |
return NULL; |
| faluco@484 | 186 |
} |
| faluco@484 | 187 |
|
| faluco@484 | 188 |
if (len) |
| faluco@484 | 189 |
{ |
| faluco@484 | 190 |
*len = real_len; |
| faluco@484 | 191 |
} |
| faluco@484 | 192 |
|
| faluco@484 | 193 |
m_curptr += real_len + 1; |
| faluco@484 | 194 |
|
| faluco@484 | 195 |
return str; |
| faluco@484 | 196 |
} |
| faluco@484 | 197 |
|
| faluco@484 | 198 |
void *CDataPack::GetMemory() const |
| faluco@484 | 199 |
{ |
| faluco@484 | 200 |
return m_curptr; |
| faluco@484 | 201 |
} |
| faluco@488 | 202 |
|
| faluco@488 | 203 |
void *CDataPack::ReadMemory(size_t *size) const |
| faluco@488 | 204 |
{ |
| faluco@488 | 205 |
if (!IsReadable(sizeof(size_t))) |
| faluco@488 | 206 |
{ |
| faluco@488 | 207 |
return NULL; |
| faluco@488 | 208 |
} |
| faluco@488 | 209 |
|
| faluco@488 | 210 |
size_t bytecount = *(size_t *)m_curptr; |
| faluco@488 | 211 |
m_curptr += sizeof(size_t); |
| faluco@488 | 212 |
|
| faluco@488 | 213 |
if (!IsReadable(bytecount)) |
| faluco@488 | 214 |
{ |
| faluco@488 | 215 |
return NULL; |
| faluco@488 | 216 |
} |
| faluco@488 | 217 |
|
| faluco@488 | 218 |
void *ptr = m_curptr; |
| faluco@488 | 219 |
|
| faluco@488 | 220 |
if (size) |
| faluco@488 | 221 |
{ |
| faluco@488 | 222 |
*size = bytecount; |
| faluco@488 | 223 |
} |
| faluco@488 | 224 |
|
| faluco@488 | 225 |
m_curptr += bytecount; |
| faluco@488 | 226 |
|
| faluco@488 | 227 |
return ptr; |
| faluco@488 | 228 |
} |