/*--------------------------------------------------------------------------* * ** 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; }