SmaugWizard/Backup/
SmaugWizard/Backup/L/
SmaugWizard/Boards/
SmaugWizard/Building/
SmaugWizard/Corpses/
SmaugWizard/Councils/
SmaugWizard/Deity/
SmaugWizard/Gods/
SmaugWizard/MudProgs/
SmaugWizard/Player/L/
SmaugWizard/Src/
SmaugWizard/Src/res/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |				*
 * -----------------------------------------------------------|   \\._.//	*
 * SmaugWiz (C) 1998 by Russ Pillsbury (Windows NT version)   |   (0...0)	*
 * -----------------------------------------------------------|    ).:.(	*
 * SMAUG (C) 1994, 1995, 1996 by Derek Snider                 |    {o o}	*
 * -----------------------------------------------------------|   / ' ' \	*
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |~'~.VxvxV.~'~*
 * Scryn, Swordbearer, Rennard, Tricops, and Gorog.           |				*
 * ------------------------------------------------------------------------ *
 * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael        *
 * Chastain, Michael Quan, and Mitchell Tse.                                *
 * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik Staerfeldt, Tom Madsen, and Katja Nyboe.    *
 * ------------------------------------------------------------------------ *
 *			    Smaug BitVector Implementation file							*
 ***************************************************************************/

#include	"stdafx.h"

#include	"smaug.h"
#include	"BitVector.h"


// SetBits sets all the bits from the input vector, and does not
// modify any other bits.
void CBitVector::SetBits (const CBitVector& in)
{
	for (int i=0; i < 4; ++i)
		bits [i] |= in.bits [i];
}


// ClearBits clears all the bits which are set in the input vector,
// and does not modify any other bits.
void CBitVector::ClearBits (const CBitVector& in)
{
	for (int i=0; i < 4; ++i)
		bits [i] &= ~in.bits [i];
}


const CBitVector& CBitVector::operator= (const CBitVector& in)
{
	for (int i=0; i < 4; ++i)
		bits [i] = in.bits [i];

	return *this;
}


BOOL CBitVector::operator== (const CBitVector& in) const
{
	for (int i=0; i < 4; ++i)
		if (bits [i] != in.bits [i])
			return FALSE;

	return TRUE;
}


// Read a BitVector from a static string
void CBitVector::Parse (char*& pLine)
{
	for (int i=0; i < 4; ++i) {
		bits [i] = ParseNumber (pLine);
		if (*pLine != '&')
			break;
		++pLine;
	}
}


void CBitVector::ParseString (char*& pLine, const char* names [], int size)
{
	char	*word;

	while (*pLine) {
		word = ParseWord (pLine);
		int	len = strlen (word);
		if (word [len-1] == '~')
			word [len-1] = 0;

		for (int i=0; i < size; ++i)
			if (! stricmp (names [i], word)) {
				SetBit (i);
				break;
			}
	}
}


CString CBitVector::PrintVector () const
{
	CString	s;
	char	nbuf [64];
	int     i, j;

	for (i=3; i > 0; --i)
		if (bits [i])
			break;

	for (j=0; j <= i; ++j) {
		sprintf (nbuf, "%d", bits [j]);
		s += nbuf;
		if (j < i)
			s += '&';
	}
	return s;
}


CString CBitVector::PrintString (const char* names [], int size) const
{
	CString	s;

	BOOL	bFirst = TRUE;
	for (int i=0; i < size; ++i)
		if (IsSet (i)) {
			if (! bFirst)
				s += ' ';
			s += names [i];
			bFirst = FALSE;
		}

	return s;
}


int ConvertBvToBit (int bv)
{
	int	bit = -1;

	for (int i=0; i < 32; ++i)
		if (bv & (1 << i)) {
			bit = i;
			break;
		}

	return bit;
}