register long n, ndx, off, size;
register long n, ndx, off; register size_t size;
hash_access(	HTAB *hashp,	ACTION action,	DBT *key, DBT *val){	register BUFHEAD *rbufp;	BUFHEAD *bufp, *save_bufp;	register uint16 *bp;	register long n, ndx, off, size;	register char *kp;	uint16 pageno;	uint32 ovfl_loop_count=0;    int32 last_overflow_page_no = -1;#ifdef HASH_STATISTICS	hash_accesses++;#endif	off = hashp->BSIZE;	size = key->size;	kp = (char *)key->data;	rbufp = __get_buf(hashp, __call_hash(hashp, kp, size), NULL, 0);	if (!rbufp)		return (DATABASE_CORRUPTED_ERROR);	save_bufp = rbufp;	/* Pin the bucket chain */	rbufp->flags |= BUF_PIN;	for (bp = (uint16 *)rbufp->page, n = *bp++, ndx = 1; ndx < n;)	{		if (bp[1] >= REAL_KEY) {			/* Real key/data pair */			if (size == off - *bp &&			    memcmp(kp, rbufp->page + *bp, size) == 0)				goto found;			off = bp[1];#ifdef HASH_STATISTICS			hash_collisions++;#endif			bp += 2;			ndx += 2;		} else if (bp[1] == OVFLPAGE) {            /* database corruption: overflow loop detection */            if(last_overflow_page_no == (int32)*bp)    			return (DATABASE_CORRUPTED_ERROR);            last_overflow_page_no = *bp;			rbufp = __get_buf(hashp, *bp, rbufp, 0);			if (!rbufp) {				save_bufp->flags &= ~BUF_PIN;				return (DBM_ERROR);			}            ovfl_loop_count++;            if(ovfl_loop_count > MAX_OVERFLOW_HASH_ACCESS_LOOPS)    			return (DATABASE_CORRUPTED_ERROR);			/* FOR LOOP INIT */			bp = (uint16 *)rbufp->page;			n = *bp++;			ndx = 1;			off = hashp->BSIZE;		                } else if (bp[1] < REAL_KEY) {			if ((ndx =			    __find_bigpair(hashp, rbufp, ndx, kp, size)) > 0)				goto found;			if (ndx == -2) {				bufp = rbufp;				if (!(pageno =				    __find_last_page(hashp, &bufp))) {					ndx = 0;					rbufp = bufp;					break;	/* FOR */				}				rbufp = __get_buf(hashp, pageno, bufp, 0);				if (!rbufp) {					save_bufp->flags &= ~BUF_PIN;					return (DBM_ERROR);				}				/* FOR LOOP INIT */				bp = (uint16 *)rbufp->page;				n = *bp++;				ndx = 1;				off = hashp->BSIZE;			} else {				save_bufp->flags &= ~BUF_PIN;				return (DBM_ERROR);			}		}	}	/* Not found */	switch (action) {	case HASH_PUT:	case HASH_PUTNEW:		if (__addel(hashp, rbufp, key, val)) {			save_bufp->flags &= ~BUF_PIN;			return (DBM_ERROR);		} else {			save_bufp->flags &= ~BUF_PIN;			return (SUCCESS);		}	case HASH_GET:	case HASH_DELETE:	default:		save_bufp->flags &= ~BUF_PIN;		return (ABNORMAL);	}found:	switch (action) {	case HASH_PUTNEW:		save_bufp->flags &= ~BUF_PIN;		return (ABNORMAL);	case HASH_GET:		bp = (uint16 *)rbufp->page;		if (bp[ndx + 1] < REAL_KEY) {			if (__big_return(hashp, rbufp, ndx, val, 0))				return (DBM_ERROR);		} else {			val->data = (uint8 *)rbufp->page + (int)bp[ndx + 1];			val->size = bp[ndx] - bp[ndx + 1];		}		break;	case HASH_PUT:		if ((__delpair(hashp, rbufp, ndx)) ||		    (__addel(hashp, rbufp, key, val))) {			save_bufp->flags &= ~BUF_PIN;			return (DBM_ERROR);		}		break;	case HASH_DELETE:		if (__delpair(hashp, rbufp, ndx))			return (DBM_ERROR);		break;	default:		abort();	}	save_bufp->flags &= ~BUF_PIN;	return (SUCCESS);}