163 lines
10 KiB
C++
163 lines
10 KiB
C++
![]() |
/*
|
||
|
** Command & Conquer Generals Zero Hour(tm)
|
||
|
** Copyright 2025 Electronic Arts Inc.
|
||
|
**
|
||
|
** This program is free software: you can redistribute it and/or modify
|
||
|
** it under the terms of the GNU General Public License as published by
|
||
|
** the Free Software Foundation, either version 3 of the License, or
|
||
|
** (at your option) any later version.
|
||
|
**
|
||
|
** This program is distributed in the hope that it will be useful,
|
||
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
** GNU General Public License for more details.
|
||
|
**
|
||
|
** You should have received a copy of the GNU General Public License
|
||
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||
|
***********************************************************************************************
|
||
|
* *
|
||
|
* Project Name : Command & Conquer *
|
||
|
* *
|
||
|
* $Archive:: /Commando/Code/Tools/pluglib/jshell.cpp $*
|
||
|
* *
|
||
|
* $Author:: Greg_h $*
|
||
|
* *
|
||
|
* $Modtime:: 11/07/00 2:32p $*
|
||
|
* *
|
||
|
* $Revision:: 28 $*
|
||
|
* *
|
||
|
*---------------------------------------------------------------------------------------------*
|
||
|
* Functions: *
|
||
|
* Fatal -- General purpose fatal error handler. *
|
||
|
* Set_Bit -- Set bit in a bit array. *
|
||
|
* Get_Bit -- Fetch the bit value from a bit array. *
|
||
|
* First_True_Bit -- Return with the first true bit index. *
|
||
|
* First_False_Bit -- Find the first false bit in the bit array. *
|
||
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||
|
|
||
|
#include "always.h"
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* Set_Bit -- Set bit in a bit array. *
|
||
|
* *
|
||
|
* This routine is used to set (or clear) a bit in a bit array. *
|
||
|
* *
|
||
|
* INPUT: array -- Pointer to the bit array. *
|
||
|
* *
|
||
|
* bit -- The bit number to set. I.e., bit 32 is the first bit in the second *
|
||
|
* long word of memory. *
|
||
|
* *
|
||
|
* value -- The value to set the bit. The only values supported are 0 and 1. *
|
||
|
* *
|
||
|
* OUTPUT: none *
|
||
|
* *
|
||
|
* WARNINGS: Be sure that the array is big enough to set the specified bit. *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 10/06/1997 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
void Set_Bit(void * array, int bit, int value)
|
||
|
{
|
||
|
unsigned char mask = (unsigned char)(1 << (bit % 8));
|
||
|
|
||
|
if (value != 0) {
|
||
|
*((unsigned char *)array + (bit/8)) |= mask;
|
||
|
} else {
|
||
|
*((unsigned char *)array + (bit/8)) &= (unsigned char)~mask;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* Get_Bit -- Fetch the bit value from a bit array. *
|
||
|
* *
|
||
|
* This routine will fetch the specified bit value from the bit array. This is the *
|
||
|
* counterpart function to the Set_Bit() function. *
|
||
|
* *
|
||
|
* INPUT: array -- Pointer to the bit array to fetch the bit value from. *
|
||
|
* *
|
||
|
* bit -- The bit number to fetch. *
|
||
|
* *
|
||
|
* OUTPUT: Returns with the value of the bit. This return value will be either 1 or 0. *
|
||
|
* *
|
||
|
* WARNINGS: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 10/06/1997 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
int Get_Bit(void const * array, int bit)
|
||
|
{
|
||
|
unsigned char mask = (unsigned char)(1 << (bit % 8));
|
||
|
return((*((unsigned char *)array + (bit/8)) & mask) != 0);
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* First_True_Bit -- Return with the first true bit index. *
|
||
|
* *
|
||
|
* This routine will scan the bit array and return with the index for the first true bit *
|
||
|
* in the array. *
|
||
|
* *
|
||
|
* INPUT: array -- Pointer to the bit array to scan. *
|
||
|
* *
|
||
|
* OUTPUT: Returns with the index of the first true (set to 1) bit in the array. *
|
||
|
* *
|
||
|
* WARNINGS: This routine does not stop at the end of the array (it doesn't know where the *
|
||
|
* end is) so there must be at least one true bit in the array or else it will *
|
||
|
* end up scanning past the end (undefined results in that case). *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 10/06/1997 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
int First_True_Bit(void const * array)
|
||
|
{
|
||
|
int index = 0;
|
||
|
while (*((unsigned char *)array) == 0) {
|
||
|
index++;
|
||
|
array = ((char*)array) + 1;
|
||
|
}
|
||
|
int subindex;
|
||
|
for (subindex = 0; subindex < 8; subindex++) {
|
||
|
if (Get_Bit(array, subindex)) break;
|
||
|
}
|
||
|
return(index * 8 + subindex);
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* First_False_Bit -- Find the first false bit in the bit array. *
|
||
|
* *
|
||
|
* This routine will scan the bit array and return with the index of the first false (set *
|
||
|
* to 0) bit found. *
|
||
|
* *
|
||
|
* INPUT: array -- Pointer to the bit array to scan. *
|
||
|
* *
|
||
|
* OUTPUT: Returns with the index of the first false bit found in the array. *
|
||
|
* *
|
||
|
* WARNINGS: This routine will not stop scanning until a false bit was found. This means *
|
||
|
* that there must be at least one false bit in the array or else it will scan *
|
||
|
* past the end of the array. *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 10/06/1997 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
int First_False_Bit(void const * array)
|
||
|
{
|
||
|
int index = 0;
|
||
|
while (*((unsigned char *)array) == 0xFF) {
|
||
|
index++;
|
||
|
array = ((char*)array) + 1;
|
||
|
}
|
||
|
int subindex;
|
||
|
for (subindex = 0; subindex < 8; subindex++) {
|
||
|
if (!Get_Bit(array, subindex)) break;
|
||
|
}
|
||
|
return(index * 8 + subindex);
|
||
|
}
|
||
|
|