/*
....[@@@..[@@@..............[@.................. MUD++ is a written from
....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and
....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++.
....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing
....[@......[@..[@@@@@..[@@@@@.................. development project. All
................................................ contributions are welcome.
....Copyright(C).1995.Melvin.Smith.............. Enjoy.
------------------------------------------------------------------------------
Melvin Smith (aka Fusion) msmith@hom.net
MUD++ development mailing list mudpp@van.ml.org
------------------------------------------------------------------------------
memoryblock.h
*/
#ifndef _MEMORYBLOCK_H
#define _MEMORYBLOCK_H
typedef union
{
s32 vmint;
float vmfloat;
struct {
u8 opcode;
u8 conds;
union {
s16 reloc;
u16 number;
}u;
}s;
} memorycell;
class MemoryCellBlock
{
protected:
memorycell * mem;
memorycell * pmem;
int size;
public:
MemoryCellBlock() :
mem(0), pmem(0), size(0)
{}
virtual ~MemoryCellBlock()
{
if (mem) delete [] mem;
}
memorycell * getMem() { return mem; }
const memorycell * getConstMem() const { return mem; }
void setMem( memorycell * block , int nsize)
{ mem = block; pmem = block; size = nsize; }
memorycell * getPtr() { return pmem; }
void setPtr( memorycell * where ) { pmem = where; }
void movePtr( signed int offs ) { pmem += offs; }
void setOffset( int where ) { pmem = &mem[where]; }
int getOffset() {return (int) (pmem-mem);}
void clrMemBlock() { memset( mem, 0, size * sizeof(memorycell)); }
void allocMemBlock(int s)
{ if (mem) delete [] mem; size = s; mem = new memorycell[size]; pmem = mem;}
void enlargeMemBlock(int s )
{
memorycell * nmem = new memorycell[s+size];
if ( mem ) memcpy( nmem, mem, size * sizeof(memorycell));
pmem = (pmem - mem ) + nmem;
if ( mem ) delete [] mem;
mem = nmem;
size += s;
}
void canCarryMore( int s )
{
if ( ((pmem - mem) + s) < size )
return;
enlargeMemBlock(s);
}
int getUsedSize() const { return (int) (pmem - mem); }
int getUsedBytesize() const { return (int) (pmem - mem) * sizeof(memorycell);}
int getSize() const { return size; }
int getFree() const { return size - (pmem - mem); }
void putCell( memorycell mc ) {*pmem =mc; pmem++;}
memorycell getCell() { return *pmem++; }
memorycell getCell(int where) {return mem[where]; }
void setCell( int where, memorycell mc ) {mem[where] = mc;}
void relocCell( int where, int offset ) { mem[where].s.u.number += offset; }
memorycell & operator[] ( int offset ) { return mem[offset]; }
void putInt( int val ) { pmem->vmint = val; pmem++;}
void putFloat( float val ) { pmem->vmfloat = val; pmem++;}
};
#define ALIGNSIZE sizeof( void *)
#define ALIGNMASK ALIGNSIZE - 1
class ConstantsBlock
{
protected:
char * mem;
char * pmem;
int size;
public:
ConstantsBlock() :
mem(0), pmem(0), size(0)
{}
~ConstantsBlock()
{
if (mem) delete [] mem;
}
char * getMem() { return mem; }
const char * getConstMem() const { return mem; }
void setMem( char * block , int nsize)
{ mem = block; pmem = block; size = nsize; }
char * getPtr() { return pmem; }
void setPtr( char * where ) { pmem = where; }
void movePtr( signed int offs ) { pmem += offs; }
void setOffset( int where ) { pmem = &mem[where]; }
int getOffset() { return (int) (pmem - mem);}
void clrMemBlock() { memset( mem, 0, size * sizeof(char)); }
void allocMemBlock(int s)
{ if (mem) delete [] mem; size = s; mem = new char[size]; pmem = mem;}
void enlargeMemBlock(int s )
{
char * nmem = new char[s+size];
if ( mem ) memcpy( nmem, mem, size * sizeof(char));
pmem = (pmem - mem ) + nmem;
if ( mem ) delete [] mem;
mem = nmem;
size += s;
}
int getUsedSize() const { return (int) (pmem - mem); }
int getUsedBytesize() const { return (int) (pmem - mem) * sizeof(char);}
int getSize() const { return size; }
int getFree() const { return size - (pmem - mem); }
char & operator[] ( int offset ) { return mem[offset]; }
void assureFit( int len )
{
if ( getFree() < len )
enlargeMemBlock(1000);
}
void align()
{
int align;
if ( (align = ((int)(pmem-mem)) & ALIGNMASK) )
pmem += (ALIGNSIZE-align);
}
void putString( const char * txt )
{
int len = strlen(txt) +1;
assureFit(len);
memcpy( pmem, txt, len);
pmem += len;
align();
}
void putString( const char * txt, int len )
{
len++;
assureFit(len);
memcpy( pmem, txt, len);
pmem += len;
align();
}
const void * getStruct( int where ) {return &mem[where]; }
void setStruct( int where, const void * str, int len )
{
memcpy( &mem[where], str, len );
}
void putStruct( const void * str, int len )
{
assureFit(len);
memcpy( pmem, str, len );
pmem += len;
align();
}
};
#endif