hashalloc.c revision da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Copyright (c) 1985-2007 AT&T Knowledge Ventures *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* by AT&T Knowledge Ventures *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Research
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * hash table library
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const char id_hash[] = "\n@(#)$Id: hash (AT&T Research) 1996-08-11 $\0\n";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * create a new hash table
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int internal;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * check for HASH_region which must be first
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(tab = (Hash_table_t*)(*region)(handle, NiL, sizeof(Hash_table_t), 0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tab->bucketsize = (sizeof(Hash_header_t) + sizeof(char*) - 1) / sizeof(char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(tab->root = (Hash_root_t*)(*region)(handle, NiL, sizeof(Hash_root_t), 0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(tab->root->local = newof(0, Hash_local_t, 1, 0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = (va_arg(ap, int) + sizeof(char*) - 1) / sizeof(char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tab->root->local->compare = va_arg(ap, Hash_compare_f);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tab->size & (tab->size - 1)) tab->flags |= HASH_FIXED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(tab->table = (Hash_bucket_t**)(*region)(handle, NiL, sizeof(Hash_bucket_t*) * tab->size, 0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memset(tab->table, 0, sizeof(Hash_bucket_t*) * tab->size);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!(tab->table = newof(0, Hash_bucket_t*, tab->size, 0))) goto out;