157718be8SEnji Cooper /* $NetBSD: t_hsearch.c,v 1.4 2014/07/20 20:17:21 christos Exp $ */ 257718be8SEnji Cooper 357718be8SEnji Cooper /*- 457718be8SEnji Cooper * Copyright (c) 2008 The NetBSD Foundation, Inc. 557718be8SEnji Cooper * All rights reserved. 657718be8SEnji Cooper * 757718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 857718be8SEnji Cooper * modification, are permitted provided that the following conditions 957718be8SEnji Cooper * are met: 1057718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 1157718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 1257718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 1357718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 1457718be8SEnji Cooper * documentation and/or other materials provided with the distribution. 1557718be8SEnji Cooper * 1657718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 1757718be8SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 1857718be8SEnji Cooper * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1957718be8SEnji Cooper * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 2057718be8SEnji Cooper * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2157718be8SEnji Cooper * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2257718be8SEnji Cooper * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2357718be8SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2457718be8SEnji Cooper * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2557718be8SEnji Cooper * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2657718be8SEnji Cooper * POSSIBILITY OF SUCH DAMAGE. 2757718be8SEnji Cooper */ 2857718be8SEnji Cooper 2957718be8SEnji Cooper /* 3057718be8SEnji Cooper * Copyright (c) 2001 Christopher G. Demetriou 3157718be8SEnji Cooper * All rights reserved. 3257718be8SEnji Cooper * 3357718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 3457718be8SEnji Cooper * modification, are permitted provided that the following conditions 3557718be8SEnji Cooper * are met: 3657718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 3757718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 3857718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 3957718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 4057718be8SEnji Cooper * documentation and/or other materials provided with the distribution. 4157718be8SEnji Cooper * 3. All advertising materials mentioning features or use of this software 4257718be8SEnji Cooper * must display the following acknowledgement: 4357718be8SEnji Cooper * This product includes software developed for the 4457718be8SEnji Cooper * NetBSD Project. See http://www.NetBSD.org/ for 4557718be8SEnji Cooper * information about NetBSD. 4657718be8SEnji Cooper * 4. The name of the author may not be used to endorse or promote products 4757718be8SEnji Cooper * derived from this software without specific prior written permission. 4857718be8SEnji Cooper * 4957718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 5057718be8SEnji Cooper * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 5157718be8SEnji Cooper * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 5257718be8SEnji Cooper * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 5357718be8SEnji Cooper * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 5457718be8SEnji Cooper * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 5557718be8SEnji Cooper * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 5657718be8SEnji Cooper * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 5757718be8SEnji Cooper * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 5857718be8SEnji Cooper * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 5957718be8SEnji Cooper * 6057718be8SEnji Cooper * <<Id: LICENSE,v 1.2 2000/06/14 15:57:33 cgd Exp>> 6157718be8SEnji Cooper */ 6257718be8SEnji Cooper 6357718be8SEnji Cooper #include <sys/cdefs.h> 6457718be8SEnji Cooper __COPYRIGHT("@(#) Copyright (c) 2008\ 6557718be8SEnji Cooper The NetBSD Foundation, inc. All rights reserved."); 6657718be8SEnji Cooper __RCSID("$NetBSD: t_hsearch.c,v 1.4 2014/07/20 20:17:21 christos Exp $"); 6757718be8SEnji Cooper 6857718be8SEnji Cooper #include <errno.h> 6957718be8SEnji Cooper #include <search.h> 7057718be8SEnji Cooper #include <string.h> 7157718be8SEnji Cooper #include <stdio.h> 7257718be8SEnji Cooper #include <stdlib.h> 7357718be8SEnji Cooper 7457718be8SEnji Cooper #include <atf-c.h> 7557718be8SEnji Cooper 7657718be8SEnji Cooper #define REQUIRE_ERRNO(x) ATF_REQUIRE_MSG(x, "%s", strerror(errno)) 7757718be8SEnji Cooper 78*b3a6b001SEnji Cooper #if defined(__NetBSD__) 7957718be8SEnji Cooper ATF_TC(hsearch_basic); 8057718be8SEnji Cooper ATF_TC_HEAD(hsearch_basic, tc) 8157718be8SEnji Cooper { 8257718be8SEnji Cooper 8357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks basic insertions and searching"); 8457718be8SEnji Cooper } 8557718be8SEnji Cooper 8657718be8SEnji Cooper ATF_TC_BODY(hsearch_basic, tc) 8757718be8SEnji Cooper { 8857718be8SEnji Cooper ENTRY e, *ep; 8957718be8SEnji Cooper char ch[2]; 9057718be8SEnji Cooper int i; 9157718be8SEnji Cooper 9257718be8SEnji Cooper REQUIRE_ERRNO(hcreate(16) != 0); 9357718be8SEnji Cooper 9457718be8SEnji Cooper /* ch[1] should be constant from here on down. */ 9557718be8SEnji Cooper ch[1] = '\0'; 9657718be8SEnji Cooper 9757718be8SEnji Cooper /* Basic insertions. Check enough that there'll be collisions. */ 9857718be8SEnji Cooper for (i = 0; i < 26; i++) { 9957718be8SEnji Cooper ch[0] = 'a' + i; 10057718be8SEnji Cooper e.key = strdup(ch); /* ptr to provided key is kept! */ 10157718be8SEnji Cooper ATF_REQUIRE(e.key != NULL); 10257718be8SEnji Cooper e.data = (void *)(intptr_t)i; 10357718be8SEnji Cooper 10457718be8SEnji Cooper ep = hsearch(e, ENTER); 10557718be8SEnji Cooper 10657718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 10757718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, ch); 10857718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, i); 10957718be8SEnji Cooper } 11057718be8SEnji Cooper 11157718be8SEnji Cooper /* e.key should be constant from here on down. */ 11257718be8SEnji Cooper e.key = ch; 11357718be8SEnji Cooper 11457718be8SEnji Cooper /* Basic lookups. */ 11557718be8SEnji Cooper for (i = 0; i < 26; i++) { 11657718be8SEnji Cooper ch[0] = 'a' + i; 11757718be8SEnji Cooper 11857718be8SEnji Cooper ep = hsearch(e, FIND); 11957718be8SEnji Cooper 12057718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 12157718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, ch); 12257718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, i); 12357718be8SEnji Cooper } 12457718be8SEnji Cooper 12557718be8SEnji Cooper hdestroy1(free, NULL); 12657718be8SEnji Cooper } 127*b3a6b001SEnji Cooper #endif 12857718be8SEnji Cooper 12957718be8SEnji Cooper ATF_TC(hsearch_duplicate); 13057718be8SEnji Cooper ATF_TC_HEAD(hsearch_duplicate, tc) 13157718be8SEnji Cooper { 13257718be8SEnji Cooper 13357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks that inserting duplicate " 13457718be8SEnji Cooper "doesn't overwrite existing data"); 13557718be8SEnji Cooper } 13657718be8SEnji Cooper 13757718be8SEnji Cooper ATF_TC_BODY(hsearch_duplicate, tc) 13857718be8SEnji Cooper { 13957718be8SEnji Cooper ENTRY e, *ep; 14057718be8SEnji Cooper 14157718be8SEnji Cooper REQUIRE_ERRNO(hcreate(16)); 14257718be8SEnji Cooper 14357718be8SEnji Cooper e.key = __UNCONST("a"); 14457718be8SEnji Cooper e.data = (void *)(intptr_t) 0; 14557718be8SEnji Cooper 14657718be8SEnji Cooper ep = hsearch(e, ENTER); 14757718be8SEnji Cooper 14857718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 14957718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 15057718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 15157718be8SEnji Cooper 15257718be8SEnji Cooper e.data = (void *)(intptr_t)12345; 15357718be8SEnji Cooper 15457718be8SEnji Cooper ep = hsearch(e, ENTER); 15557718be8SEnji Cooper ep = hsearch(e, FIND); 15657718be8SEnji Cooper 15757718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 15857718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 15957718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 16057718be8SEnji Cooper 16157718be8SEnji Cooper hdestroy(); 16257718be8SEnji Cooper } 16357718be8SEnji Cooper 16457718be8SEnji Cooper ATF_TC(hsearch_nonexistent); 16557718be8SEnji Cooper ATF_TC_HEAD(hsearch_nonexistent, tc) 16657718be8SEnji Cooper { 16757718be8SEnji Cooper 16857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", 16957718be8SEnji Cooper "Checks searching for non-existent entry"); 17057718be8SEnji Cooper } 17157718be8SEnji Cooper 17257718be8SEnji Cooper ATF_TC_BODY(hsearch_nonexistent, tc) 17357718be8SEnji Cooper { 17457718be8SEnji Cooper ENTRY e, *ep; 17557718be8SEnji Cooper 17657718be8SEnji Cooper REQUIRE_ERRNO(hcreate(16)); 17757718be8SEnji Cooper 17857718be8SEnji Cooper e.key = __UNCONST("A"); 17957718be8SEnji Cooper ep = hsearch(e, FIND); 18057718be8SEnji Cooper ATF_REQUIRE_EQ(ep, NULL); 18157718be8SEnji Cooper 18257718be8SEnji Cooper hdestroy(); 18357718be8SEnji Cooper } 18457718be8SEnji Cooper 18557718be8SEnji Cooper ATF_TC(hsearch_two); 18657718be8SEnji Cooper ATF_TC_HEAD(hsearch_two, tc) 18757718be8SEnji Cooper { 18857718be8SEnji Cooper 18957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", 19057718be8SEnji Cooper "Checks that searching doesn't overwrite previous search results"); 19157718be8SEnji Cooper } 19257718be8SEnji Cooper 19357718be8SEnji Cooper ATF_TC_BODY(hsearch_two, tc) 19457718be8SEnji Cooper { 19557718be8SEnji Cooper ENTRY e, *ep, *ep2; 19657718be8SEnji Cooper 19757718be8SEnji Cooper REQUIRE_ERRNO(hcreate(16)); 19857718be8SEnji Cooper 19957718be8SEnji Cooper e.key = __UNCONST("a"); 20057718be8SEnji Cooper e.data = (void*)(intptr_t)0; 20157718be8SEnji Cooper 20257718be8SEnji Cooper ep = hsearch(e, ENTER); 20357718be8SEnji Cooper 20457718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 20557718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 20657718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 20757718be8SEnji Cooper 20857718be8SEnji Cooper e.key = __UNCONST("b"); 20957718be8SEnji Cooper e.data = (void*)(intptr_t)1; 21057718be8SEnji Cooper 21157718be8SEnji Cooper ep = hsearch(e, ENTER); 21257718be8SEnji Cooper 21357718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 21457718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "b"); 21557718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 1); 21657718be8SEnji Cooper 21757718be8SEnji Cooper e.key = __UNCONST("a"); 21857718be8SEnji Cooper ep = hsearch(e, FIND); 21957718be8SEnji Cooper 22057718be8SEnji Cooper e.key = __UNCONST("b"); 22157718be8SEnji Cooper ep2 = hsearch(e, FIND); 22257718be8SEnji Cooper 22357718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 22457718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 22557718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 22657718be8SEnji Cooper 22757718be8SEnji Cooper ATF_REQUIRE(ep2 != NULL); 22857718be8SEnji Cooper ATF_REQUIRE_STREQ(ep2->key, "b"); 22957718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep2->data, 1); 23057718be8SEnji Cooper 23157718be8SEnji Cooper hdestroy(); 23257718be8SEnji Cooper } 23357718be8SEnji Cooper 234*b3a6b001SEnji Cooper #if defined(__NetBSD__) 23557718be8SEnji Cooper ATF_TC(hsearch_r_basic); 23657718be8SEnji Cooper ATF_TC_HEAD(hsearch_r_basic, tc) 23757718be8SEnji Cooper { 23857718be8SEnji Cooper 23957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks basic insertions and searching"); 24057718be8SEnji Cooper } 24157718be8SEnji Cooper 24257718be8SEnji Cooper ATF_TC_BODY(hsearch_r_basic, tc) 24357718be8SEnji Cooper { 24457718be8SEnji Cooper ENTRY e, *ep; 24557718be8SEnji Cooper char ch[2]; 24657718be8SEnji Cooper int i; 24757718be8SEnji Cooper struct hsearch_data t; 24857718be8SEnji Cooper 24957718be8SEnji Cooper REQUIRE_ERRNO(hcreate_r(16, &t) != 0); 25057718be8SEnji Cooper 25157718be8SEnji Cooper /* ch[1] should be constant from here on down. */ 25257718be8SEnji Cooper ch[1] = '\0'; 25357718be8SEnji Cooper 25457718be8SEnji Cooper /* Basic insertions. Check enough that there'll be collisions. */ 25557718be8SEnji Cooper for (i = 0; i < 26; i++) { 25657718be8SEnji Cooper ch[0] = 'a' + i; 25757718be8SEnji Cooper e.key = strdup(ch); /* ptr to provided key is kept! */ 25857718be8SEnji Cooper ATF_REQUIRE(e.key != NULL); 25957718be8SEnji Cooper e.data = (void *)(intptr_t)i; 26057718be8SEnji Cooper 26157718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1); 26257718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 26357718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, ch); 26457718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, i); 26557718be8SEnji Cooper } 26657718be8SEnji Cooper 26757718be8SEnji Cooper /* e.key should be constant from here on down. */ 26857718be8SEnji Cooper e.key = ch; 26957718be8SEnji Cooper 27057718be8SEnji Cooper /* Basic lookups. */ 27157718be8SEnji Cooper for (i = 0; i < 26; i++) { 27257718be8SEnji Cooper ch[0] = 'a' + i; 27357718be8SEnji Cooper 27457718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, FIND, &ep, &t) == 1); 27557718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 27657718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, ch); 27757718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, i); 27857718be8SEnji Cooper } 27957718be8SEnji Cooper 28057718be8SEnji Cooper hdestroy1_r(&t, free, NULL); 28157718be8SEnji Cooper } 282*b3a6b001SEnji Cooper #endif 28357718be8SEnji Cooper 28457718be8SEnji Cooper ATF_TC(hsearch_r_duplicate); 28557718be8SEnji Cooper ATF_TC_HEAD(hsearch_r_duplicate, tc) 28657718be8SEnji Cooper { 28757718be8SEnji Cooper 28857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks that inserting duplicate " 28957718be8SEnji Cooper "doesn't overwrite existing data"); 29057718be8SEnji Cooper } 29157718be8SEnji Cooper 29257718be8SEnji Cooper ATF_TC_BODY(hsearch_r_duplicate, tc) 29357718be8SEnji Cooper { 29457718be8SEnji Cooper ENTRY e, *ep; 29557718be8SEnji Cooper struct hsearch_data t; 29657718be8SEnji Cooper 29757718be8SEnji Cooper REQUIRE_ERRNO(hcreate_r(16, &t)); 29857718be8SEnji Cooper 29957718be8SEnji Cooper e.key = __UNCONST("a"); 30057718be8SEnji Cooper e.data = (void *)(intptr_t) 0; 30157718be8SEnji Cooper 30257718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1); 30357718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 30457718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 30557718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 30657718be8SEnji Cooper 30757718be8SEnji Cooper e.data = (void *)(intptr_t)12345; 30857718be8SEnji Cooper 30957718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1); 31057718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, FIND, &ep, &t) == 1); 31157718be8SEnji Cooper 31257718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 31357718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 31457718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 31557718be8SEnji Cooper 31657718be8SEnji Cooper hdestroy_r(&t); 31757718be8SEnji Cooper } 31857718be8SEnji Cooper 31957718be8SEnji Cooper ATF_TC(hsearch_r_nonexistent); 32057718be8SEnji Cooper ATF_TC_HEAD(hsearch_r_nonexistent, tc) 32157718be8SEnji Cooper { 32257718be8SEnji Cooper 32357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", 32457718be8SEnji Cooper "Checks searching for non-existent entry"); 32557718be8SEnji Cooper } 32657718be8SEnji Cooper 32757718be8SEnji Cooper ATF_TC_BODY(hsearch_r_nonexistent, tc) 32857718be8SEnji Cooper { 32957718be8SEnji Cooper ENTRY e, *ep; 33057718be8SEnji Cooper struct hsearch_data t; 33157718be8SEnji Cooper 33257718be8SEnji Cooper REQUIRE_ERRNO(hcreate_r(16, &t)); 33357718be8SEnji Cooper 33457718be8SEnji Cooper e.key = __UNCONST("A"); 33557718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, FIND, &ep, &t) == 1); 33657718be8SEnji Cooper ATF_REQUIRE_EQ(ep, NULL); 33757718be8SEnji Cooper 33857718be8SEnji Cooper hdestroy_r(&t); 33957718be8SEnji Cooper } 34057718be8SEnji Cooper 34157718be8SEnji Cooper ATF_TC(hsearch_r_two); 34257718be8SEnji Cooper ATF_TC_HEAD(hsearch_r_two, tc) 34357718be8SEnji Cooper { 34457718be8SEnji Cooper 34557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", 34657718be8SEnji Cooper "Checks that searching doesn't overwrite previous search results"); 34757718be8SEnji Cooper } 34857718be8SEnji Cooper 34957718be8SEnji Cooper ATF_TC_BODY(hsearch_r_two, tc) 35057718be8SEnji Cooper { 35157718be8SEnji Cooper ENTRY e, *ep, *ep2; 35257718be8SEnji Cooper struct hsearch_data t; 35357718be8SEnji Cooper 35457718be8SEnji Cooper REQUIRE_ERRNO(hcreate_r(16, &t)); 35557718be8SEnji Cooper 35657718be8SEnji Cooper e.key = __UNCONST("a"); 35757718be8SEnji Cooper e.data = (void*)(intptr_t)0; 35857718be8SEnji Cooper 35957718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1); 36057718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 36157718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 36257718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 36357718be8SEnji Cooper 36457718be8SEnji Cooper e.key = __UNCONST("b"); 36557718be8SEnji Cooper e.data = (void*)(intptr_t)1; 36657718be8SEnji Cooper 36757718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1); 36857718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 36957718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "b"); 37057718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 1); 37157718be8SEnji Cooper 37257718be8SEnji Cooper e.key = __UNCONST("a"); 37357718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, FIND, &ep, &t) == 1); 37457718be8SEnji Cooper 37557718be8SEnji Cooper e.key = __UNCONST("b"); 37657718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, FIND, &ep2, &t) == 1); 37757718be8SEnji Cooper 37857718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 37957718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 38057718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 38157718be8SEnji Cooper 38257718be8SEnji Cooper ATF_REQUIRE(ep2 != NULL); 38357718be8SEnji Cooper ATF_REQUIRE_STREQ(ep2->key, "b"); 38457718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep2->data, 1); 38557718be8SEnji Cooper 38657718be8SEnji Cooper hdestroy_r(&t); 38757718be8SEnji Cooper } 38857718be8SEnji Cooper 38957718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 39057718be8SEnji Cooper { 39157718be8SEnji Cooper 392*b3a6b001SEnji Cooper #if defined(__NetBSD__) 39357718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_basic); 394*b3a6b001SEnji Cooper #endif 39557718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_duplicate); 39657718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_nonexistent); 39757718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_two); 39857718be8SEnji Cooper 399*b3a6b001SEnji Cooper #if defined(__NetBSD__) 40057718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_r_basic); 401*b3a6b001SEnji Cooper #endif 40257718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_r_duplicate); 40357718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_r_nonexistent); 40457718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_r_two); 40557718be8SEnji Cooper 40657718be8SEnji Cooper return atf_no_error(); 40757718be8SEnji Cooper } 408