1da2e3ebdSchin /*********************************************************************** 2da2e3ebdSchin * * 3da2e3ebdSchin * This software is part of the ast package * 4*b30d1939SAndy Fiddaman * Copyright (c) 1985-2011 AT&T Intellectual Property * 5da2e3ebdSchin * and is licensed under the * 6*b30d1939SAndy Fiddaman * Eclipse Public License, Version 1.0 * 77c2fbfb3SApril Chin * by AT&T Intellectual Property * 8da2e3ebdSchin * * 9da2e3ebdSchin * A copy of the License is available at * 10*b30d1939SAndy Fiddaman * http://www.eclipse.org/org/documents/epl-v10.html * 11*b30d1939SAndy Fiddaman * (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12da2e3ebdSchin * * 13da2e3ebdSchin * Information and Software Systems Research * 14da2e3ebdSchin * AT&T Research * 15da2e3ebdSchin * Florham Park NJ * 16da2e3ebdSchin * * 17da2e3ebdSchin * Glenn Fowler <gsf@research.att.com> * 18da2e3ebdSchin * David Korn <dgk@research.att.com> * 19da2e3ebdSchin * Phong Vo <kpv@research.att.com> * 20da2e3ebdSchin * * 21da2e3ebdSchin ***********************************************************************/ 22da2e3ebdSchin #pragma prototyped 23da2e3ebdSchin /* 24da2e3ebdSchin * Glenn Fowler 25da2e3ebdSchin * AT&T Research 26da2e3ebdSchin * 27da2e3ebdSchin * hash table library private definitions 28da2e3ebdSchin */ 29da2e3ebdSchin 30da2e3ebdSchin #ifndef _HASHLIB_H 31da2e3ebdSchin #define _HASHLIB_H 32da2e3ebdSchin 33da2e3ebdSchin #include <ast.h> 34da2e3ebdSchin 35da2e3ebdSchin #define hash_info _hash_info_ 36da2e3ebdSchin 37da2e3ebdSchin typedef void* (*Hash_alloc_f)(size_t); 38da2e3ebdSchin typedef int (*Hash_compare_f)(const char*, const char*, ...); 39da2e3ebdSchin typedef unsigned int (*Hash_hash_f)(const char*, ...); 40da2e3ebdSchin typedef void (*Hash_free_f)(void*); 41da2e3ebdSchin typedef void* (*Hash_region_f)(void*, void*, size_t, int); 42da2e3ebdSchin 43da2e3ebdSchin typedef struct /* root local pointers */ 44da2e3ebdSchin { 45da2e3ebdSchin Hash_hash_f hash; /* name hash routine */ 46da2e3ebdSchin Hash_compare_f compare; /* name comparision routine */ 47da2e3ebdSchin Hash_alloc_f alloc; /* value allocation routine */ 48da2e3ebdSchin Hash_free_f free; /* value free routine */ 49da2e3ebdSchin Hash_region_f region; /* region alloc/free routine */ 50da2e3ebdSchin void* handle; /* region handle arg */ 51da2e3ebdSchin } Hash_local_t; 52da2e3ebdSchin 53da2e3ebdSchin #define _HASH_POSITION_PRIVATE_ \ 54da2e3ebdSchin Hash_table_t* tab; /* table pointer */ \ 55da2e3ebdSchin int flags; /* scan flags */ \ 56da2e3ebdSchin Hash_bucket_t** slot; /* table slot */ \ 57da2e3ebdSchin Hash_bucket_t** limit; /* slot limit */ 58da2e3ebdSchin 59da2e3ebdSchin #define _HASH_LAST_PRIVATE_ \ 60da2e3ebdSchin const char* name; /* last lookup name */ \ 61da2e3ebdSchin unsigned int hash; /* last lookup hash */ 62da2e3ebdSchin 63da2e3ebdSchin #define _HASH_ROOT_PRIVATE_ \ 64da2e3ebdSchin int namesize; /* fixed name size: 0 => string */ \ 65da2e3ebdSchin int meanchain; /* resize mean chain length */ \ 66da2e3ebdSchin Hash_local_t* local; /* root local pointers */ \ 67da2e3ebdSchin Hash_root_t* next; /* next in list of all roots */ \ 68da2e3ebdSchin Hash_table_t* references; /* referencing table list */ 69da2e3ebdSchin 70da2e3ebdSchin #define _HASH_TABLE_PRIVATE_ \ 71da2e3ebdSchin unsigned char frozen; /* table freeze nesting */ \ 72da2e3ebdSchin unsigned char bucketsize; /* min bucket size in char*'s */ \ 73da2e3ebdSchin Hash_bucket_t** table; /* hash slot table */ \ 74da2e3ebdSchin Hash_table_t* next; /* root reference list link */ 75da2e3ebdSchin 76da2e3ebdSchin #include <hash.h> 77da2e3ebdSchin 78da2e3ebdSchin #define HASHMINSIZE (1<<4) /* min table slots (power of 2) */ 79da2e3ebdSchin #define HASHMEANCHAIN 2 /* def resize mean chain len */ 80da2e3ebdSchin 81da2e3ebdSchin #define HASHMOD(t,h) (h &= (t->size - 1)) 82da2e3ebdSchin #define HASHVAL(x) ((x)&~HASH_FLAGS) 83da2e3ebdSchin 84da2e3ebdSchin #define HASH(r,n,h) if (r->local->hash) h = r->namesize ? (*r->local->hash)(n, r->namesize) : (*r->local->hash)(n);\ 85da2e3ebdSchin else\ 86da2e3ebdSchin {\ 87da2e3ebdSchin register const char* _hash_s1 = n;\ 88da2e3ebdSchin h = 0;\ 89da2e3ebdSchin if (r->namesize)\ 90da2e3ebdSchin {\ 91da2e3ebdSchin register const char* _hash_s2 = _hash_s1 + r->namesize;\ 92da2e3ebdSchin while (_hash_s1 < _hash_s2) HASHPART(h, *_hash_s1++);\ 93da2e3ebdSchin }\ 94da2e3ebdSchin else while (*_hash_s1) HASHPART(h, *_hash_s1++);\ 95da2e3ebdSchin } 96da2e3ebdSchin 97da2e3ebdSchin typedef struct /* library private info */ 98da2e3ebdSchin { 99da2e3ebdSchin Hash_root_t* list; /* root table list */ 100da2e3ebdSchin } Hash_info_t; 101da2e3ebdSchin 102da2e3ebdSchin extern Hash_info_t hash_info; 103da2e3ebdSchin 104da2e3ebdSchin #endif 105