#include "config.h" /* * Hash.c -- * * Source code for Hash, a utility procedure used by the hash * table library. * * Copyright 1988 Regents of the University of California * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without * fee is hereby granted, provided that the above copyright * notice appear in all copies. The University of California * makes no representations about the suitability of this * software for any purpose. It is provided "as is" without * express or implied warranty. */ /* AIX requires this to be the first thing in the file. */ #ifdef __GNUC__ #define alloca __builtin_alloca #else /* not __GNUC__ */ #ifdef HAVE_ALLOCA_H #include <alloca.h> #else /* not HAVE_ALLOCA_H */ #ifdef _AIX #pragma alloca #endif /* not _AIX */ #endif /* not HAVE_ALLOCA_H */ #endif /* not __GNUC__ */ #include "hash.h" #include "list.h" extern char to_lower _ANSI_ARGS_((char)); /* *--------------------------------------------------------- * * Hash -- * This is a local procedure to compute a hash table * bucket address based on a string value. * * Results: * The return value is an integer between 0 and size - 1. * * Side Effects: * None. * * Design: * It is expected that most keys are decimal numbers, * so the algorithm behaves accordingly. The randomizing * code is stolen straight from the rand library routine. * *--------------------------------------------------------- */ int Hash(tablePtr, key) register Hash_Table *tablePtr; register char *key; { register int i = 0; register int j; register int *intPtr; register char *ptr; switch (tablePtr->keyType) { case HASH_STRCASE_KEYS: ptr = (char *)alloca(strlen(key)+1); for(j = 0; key[j]; ptr[j] = to_lower(key[j]), j++); ptr[j] = 0; key = ptr; case HASH_STRING_KEYS: while (*key != 0) { i = (i * 10) + (*key++ - '0'); } break; case HASH_ONE_WORD_KEYS: i = (int) key; break; case 2: i = ((int *) key)[0] + ((int *) key)[1]; break; default: j = tablePtr->keyType; intPtr = (int *) key; do { i += *intPtr++; j--; } while (j > 0); break; } return(((i*1103515245 + 12345) >> tablePtr->downShift) & tablePtr->mask); }