mud++0.35/etc/
mud++0.35/etc/guilds/
mud++0.35/help/propert/
mud++0.35/mudC/
mud++0.35/player/
mud++0.35/src/interface/
mud++0.35/src/os/cygwin32/
mud++0.35/src/os/win32/
mud++0.35/src/os/win32/bcppbuilder/
mud++0.35/src/osaddon/
mud++0.35/src/util/
/*
....[@@@..[@@@..............[@.................. 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