Fix error in original commit

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@18994 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
CaS 2004-03-31 21:41:28 +00:00
parent f139273ffa
commit 95dde97de2
3 changed files with 36 additions and 27 deletions

View file

@ -38,7 +38,6 @@ typedef unsigned short unichar;
#endif
#define NSMaximumStringLength (INT_MAX-1)
#define NSHashStringLength 63
enum
{

View file

@ -3808,18 +3808,15 @@ agree, create a new GSUnicodeInlineString otherwise.
- (unsigned) hash
{
unsigned ret = 0;
unsigned len = _self->_count;
int len = _self->_count;
if (len > NSHashStringLength)
len = NSHashStringLength;
if (len)
if (len > 0)
{
const unsigned char *p;
unsigned char_count = 0;
p = _self->_contents.c;
while (*p != 0 && char_count++ < NSHashStringLength)
while (char_count++ < len)
{
unichar c = *p++;
@ -3835,10 +3832,14 @@ agree, create a new GSUnicodeInlineString otherwise.
* an empty cache value, so we MUST NOT return a hash of zero.
*/
if (ret == 0)
{
ret = 0x0fffffff;
}
else
{
ret &= 0x0fffffff;
}
}
else
{
ret = 0x0ffffffe; /* Hash for an empty string. */

View file

@ -2162,28 +2162,31 @@ handle_printf_atsign (FILE *stream,
- (unsigned int) hash
{
unsigned ret = 0;
unsigned len = [self length];
int len = [self length];
if (len > NSHashStringLength)
{
len = NSHashStringLength;
}
if (len > 0)
{
unichar buf[len * MAXDEC + 1];
GSeqStruct s = { buf, len, len * MAXDEC, 0 };
unichar buf[64];
unichar *ptr = (len <= 64) ? buf :
NSZoneMalloc(NSDefaultMallocZone(), len * sizeof(unichar));
unichar *p;
unsigned char_count = 0;
[self getCharacters: buf range: NSMakeRange(0,len)];
GSeq_normalize(&s);
[self getCharacters: ptr range: NSMakeRange(0,len)];
p = buf;
p = ptr;
while (*p && char_count++ < NSHashStringLength)
while (char_count++ < len)
{
ret = (ret << 5) + ret + *p++;
unichar c = *p++;
// FIXME ... should normalize composed character sequences.
ret = (ret << 5) + ret + c;
}
if (ptr != buf)
{
NSZoneFree(NSDefaultMallocZone(), ptr);
}
/*
@ -2191,14 +2194,20 @@ handle_printf_atsign (FILE *stream,
* an empty cache value, so we MUST NOT return a hash of zero.
*/
if (ret == 0)
{
ret = 0x0fffffff;
}
else
{
ret &= 0x0fffffff;
}
return ret;
}
else
{
return 0x0ffffffe; /* Hash for an empty string. */
}
}
// Getting a Shared Prefix