@ -1387,10 +1387,30 @@ hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
status - > hashp = hashp ;
status - > hashp = hashp ;
status - > curBucket = 0 ;
status - > curBucket = 0 ;
status - > curEntry = NULL ;
status - > curEntry = NULL ;
status - > hasHashvalue = false ;
if ( ! hashp - > frozen )
if ( ! hashp - > frozen )
register_seq_scan ( hashp ) ;
register_seq_scan ( hashp ) ;
}
}
/*
* Same as above but scan by the given hash value .
* See also hash_seq_search ( ) .
*/
void
hash_seq_init_with_hash_value ( HASH_SEQ_STATUS * status , HTAB * hashp ,
uint32 hashvalue )
{
HASHBUCKET * bucketPtr ;
hash_seq_init ( status , hashp ) ;
status - > hasHashvalue = true ;
status - > hashvalue = hashvalue ;
status - > curBucket = hash_initial_lookup ( hashp , hashvalue , & bucketPtr ) ;
status - > curEntry = * bucketPtr ;
}
void *
void *
hash_seq_search ( HASH_SEQ_STATUS * status )
hash_seq_search ( HASH_SEQ_STATUS * status )
{
{
@ -1404,6 +1424,24 @@ hash_seq_search(HASH_SEQ_STATUS *status)
uint32 curBucket ;
uint32 curBucket ;
HASHELEMENT * curElem ;
HASHELEMENT * curElem ;
if ( status - > hasHashvalue )
{
/*
* Scan entries only in the current bucket because only this bucket
* can contain entries with the given hash value .
*/
while ( ( curElem = status - > curEntry ) ! = NULL )
{
status - > curEntry = curElem - > link ;
if ( status - > hashvalue ! = curElem - > hashvalue )
continue ;
return ( void * ) ELEMENTKEY ( curElem ) ;
}
hash_seq_term ( status ) ;
return NULL ;
}
if ( ( curElem = status - > curEntry ) ! = NULL )
if ( ( curElem = status - > curEntry ) ! = NULL )
{
{
/* Continuing scan of curBucket... */
/* Continuing scan of curBucket... */