1/*********************************************************************** 2* * 3* This software is part of the ast package * 4* Copyright (c) 1985-2011 AT&T Intellectual Property * 5* and is licensed under the * 6* Common Public License, Version 1.0 * 7* by AT&T Intellectual Property * 8* * 9* A copy of the License is available at * 10* http://www.opensource.org/licenses/cpl1.0.txt * 11* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 12* * 13* Information and Software Systems Research * 14* AT&T Research * 15* Florham Park NJ * 16* * 17* Glenn Fowler <gsf@research.att.com> * 18* David Korn <dgk@research.att.com> * 19* Phong Vo <kpv@research.att.com> * 20* * 21***********************************************************************/ 22/* 23 * hsearch() for systems that have <search.h> but no hsearch() 24 * why would such a system provide the interface but not the 25 * implementation? that's what happens when one slimes their 26 * way through standards compliance 27 * 28 * NOTE: please excuse the crude feature test 29 */ 30 31#if !_UWIN 32 33void _STUB_hsearch(){} 34 35#else 36 37#if _PACKAGE_ast 38#include <ast.h> 39#endif 40 41#define hcreate ______hcreate 42#define hdestroy ______hdestroy 43#define hsearch ______hsearch 44 45#include <search.h> 46 47#undef hcreate 48#undef hdestroy 49#undef hsearch 50 51#include "dthdr.h" 52 53#if defined(__EXPORT__) 54#define extern __EXPORT__ 55#endif 56 57/* POSIX hsearch library based on libdt 58** Written by Kiem-Phong Vo (AT&T Research, 07/19/95) 59*/ 60 61/* type of objects in hash table */ 62typedef struct _hash_s 63{ Dtlink_t link; 64 ENTRY item; 65} Hash_t; 66 67/* object delete function */ 68#if __STD_C 69static void hashfree(Dt_t* dt, Void_t* obj, Dtdisc_t* disc) 70#else 71static void hashfree(dt, obj, disc) 72Dt_t* dt; 73Void_t* obj; 74Dtdisc_t* disc; 75#endif 76{ 77 free(((Hash_t*)obj)->item.key); 78 free(obj); 79} 80 81static Dt_t* Hashtab; /* object dictionary */ 82static Dtdisc_t Hashdisc = /* discipline */ 83{ sizeof(Dtlink_t), -1, 84 0, 85 NIL(Dtmake_f), hashfree, 86 NIL(Dtcompar_f), /* always use strcmp */ 87 NIL(Dthash_f), 88 NIL(Dtmemory_f), 89 NIL(Dtevent_f) 90}; 91 92extern 93#if __STD_C 94int hcreate(size_t nel) 95#else 96int hcreate(nel) 97size_t nel; 98#endif 99{ 100 if(Hashtab) /* already opened */ 101 return 0; 102 103 if(!(Hashtab = dtopen(&Hashdisc,Dtset)) ) 104 return 0; 105 106 return 1; 107} 108 109extern void hdestroy() 110{ if(Hashtab) 111 dtclose(Hashtab); 112 Hashtab = NIL(Dt_t*); 113} 114 115extern 116#if __STD_C 117ENTRY* hsearch(ENTRY item, ACTION action) 118#else 119ENTRY* hsearch(item, action) 120ENTRY item; 121ACTION action; 122#endif 123{ 124 reg Hash_t* o; 125 126 if(!Hashtab) 127 return NIL(ENTRY*); 128 129 if(!(o = (Hash_t*)dtmatch(Hashtab,item.key)) && action == ENTER && 130 (o = (Hash_t*)malloc(sizeof(Hash_t)) ) ) 131 { o->item = item; 132 o = (Hash_t*)dtinsert(Hashtab,o); 133 } 134 135 return o ? &(o->item) : NIL(ENTRY*); 136} 137 138#endif 139