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 /*
23da2e3ebdSchin  * hsearch() for systems that have <search.h> but no hsearch()
24da2e3ebdSchin  * why would such a system provide the interface but not the
25da2e3ebdSchin  * implementation? that's what happens when one slimes their
26da2e3ebdSchin  * way through standards compliance
27da2e3ebdSchin  *
28da2e3ebdSchin  * NOTE: please excuse the crude feature test
29da2e3ebdSchin  */
30da2e3ebdSchin 
31da2e3ebdSchin #if !_UWIN
32da2e3ebdSchin 
_STUB_hsearch()33da2e3ebdSchin void _STUB_hsearch(){}
34da2e3ebdSchin 
35da2e3ebdSchin #else
36da2e3ebdSchin 
37da2e3ebdSchin #if _PACKAGE_ast
38da2e3ebdSchin #include	<ast.h>
39da2e3ebdSchin #endif
40da2e3ebdSchin 
41da2e3ebdSchin #define hcreate		______hcreate
42da2e3ebdSchin #define hdestroy	______hdestroy
43da2e3ebdSchin #define hsearch		______hsearch
44da2e3ebdSchin 
45da2e3ebdSchin #include	<search.h>
46da2e3ebdSchin 
47da2e3ebdSchin #undef	hcreate
48da2e3ebdSchin #undef	hdestroy
49da2e3ebdSchin #undef	hsearch
50da2e3ebdSchin 
51da2e3ebdSchin #include	"dthdr.h"
52da2e3ebdSchin 
53da2e3ebdSchin #if defined(__EXPORT__)
54da2e3ebdSchin #define extern	__EXPORT__
55da2e3ebdSchin #endif
56da2e3ebdSchin 
57da2e3ebdSchin /*	POSIX hsearch library based on libdt
58da2e3ebdSchin **	Written by Kiem-Phong Vo (AT&T Research, 07/19/95)
59da2e3ebdSchin */
60da2e3ebdSchin 
61da2e3ebdSchin /* type of objects in hash table */
62da2e3ebdSchin typedef struct _hash_s
63da2e3ebdSchin {	Dtlink_t	link;
64da2e3ebdSchin 	ENTRY		item;
65da2e3ebdSchin } Hash_t;
66da2e3ebdSchin 
67da2e3ebdSchin /* object delete function */
68da2e3ebdSchin #if __STD_C
hashfree(Dt_t * dt,Void_t * obj,Dtdisc_t * disc)69da2e3ebdSchin static void hashfree(Dt_t* dt, Void_t* obj, Dtdisc_t* disc)
70da2e3ebdSchin #else
71da2e3ebdSchin static void hashfree(dt, obj, disc)
72da2e3ebdSchin Dt_t*		dt;
73da2e3ebdSchin Void_t*		obj;
74da2e3ebdSchin Dtdisc_t*	disc;
75da2e3ebdSchin #endif
76da2e3ebdSchin {
77da2e3ebdSchin 	free(((Hash_t*)obj)->item.key);
78da2e3ebdSchin 	free(obj);
79da2e3ebdSchin }
80da2e3ebdSchin 
81da2e3ebdSchin static Dt_t*	Hashtab;	/* object dictionary	*/
82da2e3ebdSchin static Dtdisc_t	Hashdisc =	/* discipline		*/
83da2e3ebdSchin {	sizeof(Dtlink_t), -1,
84da2e3ebdSchin 	0,
85da2e3ebdSchin 	NIL(Dtmake_f), hashfree,
86da2e3ebdSchin 	NIL(Dtcompar_f),	/* always use strcmp	*/
87da2e3ebdSchin 	NIL(Dthash_f),
88da2e3ebdSchin 	NIL(Dtmemory_f),
89da2e3ebdSchin 	NIL(Dtevent_f)
90da2e3ebdSchin };
91da2e3ebdSchin 
92da2e3ebdSchin extern
93da2e3ebdSchin #if __STD_C
hcreate(size_t nel)94da2e3ebdSchin int hcreate(size_t nel)
95da2e3ebdSchin #else
96da2e3ebdSchin int hcreate(nel)
97da2e3ebdSchin size_t	nel;
98da2e3ebdSchin #endif
99da2e3ebdSchin {
100da2e3ebdSchin 	if(Hashtab)	/* already opened */
101da2e3ebdSchin 		return 0;
102da2e3ebdSchin 
103da2e3ebdSchin 	if(!(Hashtab = dtopen(&Hashdisc,Dtset)) )
104da2e3ebdSchin 		return 0;
105da2e3ebdSchin 
106da2e3ebdSchin 	return 1;
107da2e3ebdSchin }
108da2e3ebdSchin 
hdestroy()109da2e3ebdSchin extern void hdestroy()
110da2e3ebdSchin {	if(Hashtab)
111da2e3ebdSchin 		dtclose(Hashtab);
112da2e3ebdSchin 	Hashtab = NIL(Dt_t*);
113da2e3ebdSchin }
114da2e3ebdSchin 
115da2e3ebdSchin extern
116da2e3ebdSchin #if __STD_C
hsearch(ENTRY item,ACTION action)117da2e3ebdSchin ENTRY* hsearch(ENTRY item, ACTION action)
118da2e3ebdSchin #else
119da2e3ebdSchin ENTRY* hsearch(item, action)
120da2e3ebdSchin ENTRY	item;
121da2e3ebdSchin ACTION	action;
122da2e3ebdSchin #endif
123da2e3ebdSchin {
124da2e3ebdSchin 	reg Hash_t*	o;
125da2e3ebdSchin 
126da2e3ebdSchin 	if(!Hashtab)
127da2e3ebdSchin 		return NIL(ENTRY*);
128da2e3ebdSchin 
129da2e3ebdSchin 	if(!(o = (Hash_t*)dtmatch(Hashtab,item.key)) && action == ENTER &&
130da2e3ebdSchin 	   (o = (Hash_t*)malloc(sizeof(Hash_t)) ) )
131da2e3ebdSchin 	{	o->item = item;
132da2e3ebdSchin 		o = (Hash_t*)dtinsert(Hashtab,o);
133da2e3ebdSchin 	}
134da2e3ebdSchin 
135da2e3ebdSchin 	return o ? &(o->item) : NIL(ENTRY*);
136da2e3ebdSchin }
137da2e3ebdSchin 
138da2e3ebdSchin #endif
139