/*--------------------------------------------------------------------------*
* ** WolfPaw 3.0 ** *
*--------------------------------------------------------------------------*
* WolfPaw 3.0 (c) 1997 - 1999 by Dale Corse *
*--------------------------------------------------------------------------*
* The WolfPaw Coding Team is headed by: Greywolf *
* With the Assitance from: Callinon, Dhamon, Sentra, Wyverns, Altrag *
* Scryn, Thoric, Justice, Tricops and Brogar. *
*--------------------------------------------------------------------------*
* Based on SMAUG 1.2a. Copyright 1994 - 1996 by Derek Snider *
* SMAUG Coding Team: Thoric, Altrag, Blodkai, Narn, Haus, Scryn, Rennard, *
* Swordbearer, Gorog, Grishnakh and Tricops. *
*--------------------------------------------------------------------------*
* Merc 2.1 Diku MUD Improvments (C) 1992 - 1993 by Michael Chastain, *
* Michael Quan, and Michael Tse. *
* Original Diku MUD (C) 1990 - 1991 by Sebastian Hammer, Michael Seifert, *
* Hans Hendrik Strfeldt, Tom Madsen, and Katja Nyboe. *
*--------------------------------------------------------------------------*
* Extended BiVector Module *
*--------------------------------------------------------------------------*/
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <fcntl.h>
#include <errno.h>
#include "mud.h"
/*
* Extended Bitvector Routines -Thoric
*/
/* check to see if the extended bitvector is completely empty */
bool ext_is_empty( EXT_BV *bits )
{
int x;
for ( x = 0; x < XBI; x++ )
if ( bits->bits[x] != 0 )
return FALSE;
return TRUE;
}
void ext_clear_bits( EXT_BV *bits )
{
int x;
for ( x = 0; x < XBI; x++ )
bits->bits[x] = 0;
}
/* for use by xHAS_BITS() -- works like IS_SET() */
int ext_has_bits( EXT_BV *var, EXT_BV *bits )
{
int x, bit;
for ( x = 0; x < XBI; x++ )
if ( (bit=(var->bits[x] & bits->bits[x])) != 0 )
return bit;
return 0;
}
/* for use by xSAME_BITS() -- works like == */
bool ext_same_bits( EXT_BV *var, EXT_BV *bits )
{
int x;
for ( x = 0; x < XBI; x++ )
if ( var->bits[x] != bits->bits[x] )
return FALSE;
return TRUE;
}
/* for use by xSET_BITS() -- works like SET_BIT() */
void ext_set_bits( EXT_BV *var, EXT_BV *bits )
{
int x;
for ( x = 0; x < XBI; x++ )
var->bits[x] |= bits->bits[x];
}
/* for use by xREMOVE_BITS() -- works like REMOVE_BIT() */
void ext_remove_bits( EXT_BV *var, EXT_BV *bits )
{
int x;
for ( x = 0; x < XBI; x++ )
var->bits[x] &= ~(bits->bits[x]);
}
/* for use by xTOGGLE_BITS() -- works like TOGGLE_BIT() */
void ext_toggle_bits( EXT_BV *var, EXT_BV *bits )
{
int x;
for ( x = 0; x < XBI; x++ )
var->bits[x] ^= bits->bits[x];
}
/*
* Read an extended bitvector from a file. -Thoric
*/
EXT_BV fread_bitvector( FILE *fp )
{
EXT_BV ret;
int c, x = 0;
int num = 0;
memset( &ret, '\0', sizeof(ret) );
for ( ;; )
{
num = fread_number(fp);
if ( x < XBI )
ret.bits[x] = num;
++x;
if ( (c=getc(fp)) != '&' )
{
ungetc(c, fp);
break;
}
}
return ret;
}
/* return a string for writing a bitvector to a file */
char *print_bitvector( EXT_BV *bits )
{
static char buf[XBI * 12];
char *p = buf;
int x, cnt = 0;
if ( xIS_EMPTY(*bits) )
return "0";
for ( cnt = XBI-1; cnt > 0; cnt-- )
if ( bits->bits[cnt] )
break;
for ( x = 0; x <= cnt; x++ )
{
sprintf(p, "%d", bits->bits[x]);
p += strlen(p);
if ( x < cnt )
*p++ = '&';
}
*p = '\0';
return buf;
}
/*
* Write an extended bitvector to a file -Thoric
*/
void fwrite_bitvector( EXT_BV *bits, FILE *fp )
{
fputs( print_bitvector(bits), fp );
}
EXT_BV meb( int bit )
{
EXT_BV bits;
xCLEAR_BITS(bits);
if ( bit >= 0 )
xSET_BIT(bits, bit);
return bits;
}
EXT_BV multimeb( int bit, ... )
{
EXT_BV bits;
va_list param;
int b;
xCLEAR_BITS(bits);
if ( bit < 0 )
return bits;
xSET_BIT(bits, bit);
va_start(param, bit);
while ((b = va_arg(param, int)) != -1)
xSET_BIT(bits, b);
va_end(param);
return bits;
}