core/sm_memtable.cpp
author David Anderson <dvander@alliedmods.net>
Tue Jan 02 01:44:46 2007 +0000 (2007-01-02)
changeset 259 ca9b124a2544
parent 204 947d19d39772
child 293 83b5a2d33e3d
permissions -rw-r--r--
fixed various issues in the handle system with cloning
fixed plugins being able to free each other's handles
dvander@203
     1
#include <string.h>
dvander@203
     2
#include <malloc.h>
dvander@203
     3
#include "sm_memtable.h"
dvander@203
     4
dvander@203
     5
BaseMemTable::BaseMemTable(unsigned int init_size)
dvander@203
     6
{
dvander@203
     7
	membase = (unsigned char *)malloc(init_size);
dvander@203
     8
	size = init_size;
dvander@204
     9
	tail = 0;
dvander@203
    10
}
dvander@203
    11
dvander@203
    12
BaseMemTable::~BaseMemTable()
dvander@203
    13
{
dvander@203
    14
	free(membase);
dvander@203
    15
	membase = NULL;
dvander@203
    16
}
dvander@203
    17
dvander@203
    18
int BaseMemTable::CreateMem(unsigned int addsize, void **addr)
dvander@203
    19
{
dvander@203
    20
	int idx = (int)tail;
dvander@203
    21
dvander@203
    22
	while (tail + addsize >= size)
dvander@203
    23
	{
dvander@203
    24
		size *= 2;
dvander@203
    25
		membase = (unsigned char *)realloc(membase, size);
dvander@203
    26
	}
dvander@203
    27
dvander@203
    28
	tail += addsize;
dvander@203
    29
dvander@203
    30
	if (addr)
dvander@203
    31
	{
dvander@203
    32
		*addr = (void *)&membase[idx];
dvander@203
    33
	}
dvander@203
    34
dvander@203
    35
	return idx;
dvander@203
    36
}
dvander@203
    37
dvander@203
    38
void *BaseMemTable::GetAddress(int index)
dvander@203
    39
{
dvander@203
    40
	if (index < 0 || (unsigned int)index >= tail)
dvander@203
    41
	{
dvander@203
    42
		return NULL;
dvander@203
    43
	}
dvander@203
    44
dvander@203
    45
	return &membase[index];
dvander@203
    46
}
dvander@203
    47
dvander@203
    48
void BaseMemTable::Reset()
dvander@203
    49
{
dvander@203
    50
	tail = 0;
dvander@203
    51
}
dvander@203
    52
dvander@203
    53
BaseStringTable::BaseStringTable(unsigned int init_size) : m_table(init_size)
dvander@203
    54
{
dvander@203
    55
}
dvander@203
    56
dvander@203
    57
BaseStringTable::~BaseStringTable()
dvander@203
    58
{
dvander@203
    59
}
dvander@203
    60
dvander@203
    61
int BaseStringTable::AddString(const char *string)
dvander@203
    62
{
dvander@203
    63
	size_t len = strlen(string) + 1;
dvander@203
    64
	int idx;
dvander@203
    65
	char *addr;
dvander@203
    66
dvander@203
    67
	idx = m_table.CreateMem(len, (void **)&addr);
dvander@203
    68
	strcpy(addr, string);
dvander@203
    69
dvander@203
    70
	return idx;
dvander@203
    71
}
dvander@203
    72
dvander@203
    73
const char *BaseStringTable::GetString(int str)
dvander@203
    74
{
dvander@203
    75
	return (const char *)m_table.GetAddress(str);
dvander@203
    76
}
dvander@203
    77
dvander@203
    78
void BaseStringTable::Reset()
dvander@203
    79
{
dvander@203
    80
	m_table.Reset();
dvander@203
    81
}