1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin * *
3da2e3ebdSchin * This software is part of the ast package *
4*3e14f97fSRoger A. Faulkner * Copyright (c) 1985-2010 AT&T Intellectual Property *
5da2e3ebdSchin * and is licensed under the *
6da2e3ebdSchin * Common Public License, Version 1.0 *
77c2fbfb3SApril Chin * by AT&T Intellectual Property *
8da2e3ebdSchin * *
9da2e3ebdSchin * A copy of the License is available at *
10da2e3ebdSchin * http://www.opensource.org/licenses/cpl1.0.txt *
11da2e3ebdSchin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
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