* Refactor HashString and HashStringIgnoreCase to be a (very tiny) bit more readable

* Create a dedicated function for conversion of ASCII characters into upper case: upcaseASCII
 * Make HashStringIgnoreCase use upcaseASCII instead of an ugly bitmask hack which won't even work as expected on all strings!!

git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@1830 4a71c877-e1ca-e34f-864e-861f7616d084
master
Giel van Schijndel 2007-06-06 13:22:21 +00:00
parent 00b8c344ad
commit cc5de7ec37
1 changed files with 31 additions and 13 deletions

View File

@ -430,42 +430,60 @@ BOOL loadFileToBufferNoError(const char *pFileName, char *pFileBuffer, UDWORD bu
/***************************************************************************/
UDWORD HashString( const char *c )
{
UDWORD iHashValue, i;
UDWORD iHashValue;
assert(c!=NULL);
assert(*c!=0x0);
assert(c != NULL);
assert(*c != 0x0);
for ( iHashValue=0; *c; ++c )
for (iHashValue = 0; *c; ++c)
{
unsigned int i;
iHashValue = ( iHashValue << ONE_EIGHTH ) + *c;
if ( (i = iHashValue & HIGH_BITS) != 0 )
i = iHashValue & HIGH_BITS;
if ( i != 0 )
{
iHashValue = ( iHashValue ^ ( i >> THREE_QUARTERS ) ) &
~HIGH_BITS;
}
}
// printf("%%%%%%%% String:%s Hash:%0x\n",String,iHashValue);
debug(LOG_NEVER, "HashString: string: %s, hash: %0x\n", c, iHashValue);
return iHashValue;
}
/* Converts lower case ASCII characters into upper case characters
* \param c the character to convert
* \return an upper case ASCII character
*/
static inline char upcaseASCII(char c)
{
// If this is _not_ a lower case character simply return
if (c < 'a' || c > 'z')
return c;
// Otherwise substract 32 to make the lower case character an upper case one
else
return c - 32;
}
UDWORD HashStringIgnoreCase( const char *c )
{
UDWORD iHashValue, i;
UDWORD iHashValue;
assert(c!=NULL);
assert(*c!=0x0);
assert(c != NULL);
assert(*c != 0x0);
for ( iHashValue=0; *c; ++c )
for (iHashValue=0; *c; ++c)
{
iHashValue = ( iHashValue << ONE_EIGHTH ) + ((*c)&(0xdf));
unsigned int i;
iHashValue = ( iHashValue << ONE_EIGHTH ) + upcaseASCII(*c);
if ( (i = iHashValue & HIGH_BITS) != 0 )
i = iHashValue & HIGH_BITS;
if ( i != 0 )
{
iHashValue = ( iHashValue ^ ( i >> THREE_QUARTERS ) ) &
~HIGH_BITS;
}
}
// printf("%%%%%%%% (Ignorcase) String:%s Hash:%0x\n",String,iHashValue);
debug(LOG_NEVER, "HashStringIgnoreCase: string: %s, hash: %0x\n", c, iHashValue);
return iHashValue;
}