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 7857718be8SEnji Cooper ATF_TC(hsearch_basic); 7957718be8SEnji Cooper ATF_TC_HEAD(hsearch_basic, tc) 8057718be8SEnji Cooper { 8157718be8SEnji Cooper 8257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks basic insertions and searching"); 8357718be8SEnji Cooper } 8457718be8SEnji Cooper 8557718be8SEnji Cooper ATF_TC_BODY(hsearch_basic, tc) 8657718be8SEnji Cooper { 8757718be8SEnji Cooper ENTRY e, *ep; 8857718be8SEnji Cooper char ch[2]; 8957718be8SEnji Cooper int i; 9057718be8SEnji Cooper 9157718be8SEnji Cooper REQUIRE_ERRNO(hcreate(16) != 0); 9257718be8SEnji Cooper 9357718be8SEnji Cooper /* ch[1] should be constant from here on down. */ 9457718be8SEnji Cooper ch[1] = '\0'; 9557718be8SEnji Cooper 9657718be8SEnji Cooper /* Basic insertions. Check enough that there'll be collisions. */ 9757718be8SEnji Cooper for (i = 0; i < 26; i++) { 9857718be8SEnji Cooper ch[0] = 'a' + i; 9957718be8SEnji Cooper e.key = strdup(ch); /* ptr to provided key is kept! */ 10057718be8SEnji Cooper ATF_REQUIRE(e.key != NULL); 10157718be8SEnji Cooper e.data = (void *)(intptr_t)i; 10257718be8SEnji Cooper 10357718be8SEnji Cooper ep = hsearch(e, ENTER); 10457718be8SEnji Cooper 10557718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 10657718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, ch); 10757718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, i); 10857718be8SEnji Cooper } 10957718be8SEnji Cooper 11057718be8SEnji Cooper /* e.key should be constant from here on down. */ 11157718be8SEnji Cooper e.key = ch; 11257718be8SEnji Cooper 11357718be8SEnji Cooper /* Basic lookups. */ 11457718be8SEnji Cooper for (i = 0; i < 26; i++) { 11557718be8SEnji Cooper ch[0] = 'a' + i; 11657718be8SEnji Cooper 11757718be8SEnji Cooper ep = hsearch(e, FIND); 11857718be8SEnji Cooper 11957718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 12057718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, ch); 12157718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, i); 12257718be8SEnji Cooper } 12357718be8SEnji Cooper 124f2b9adffSEnji Cooper #ifdef __NetBSD__ 12557718be8SEnji Cooper hdestroy1(free, NULL); 126f2b9adffSEnji Cooper #else 127f2b9adffSEnji Cooper hdestroy(); 128b3a6b001SEnji Cooper #endif 129f2b9adffSEnji Cooper } 13057718be8SEnji Cooper 13157718be8SEnji Cooper ATF_TC(hsearch_duplicate); 13257718be8SEnji Cooper ATF_TC_HEAD(hsearch_duplicate, tc) 13357718be8SEnji Cooper { 13457718be8SEnji Cooper 13557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks that inserting duplicate " 13657718be8SEnji Cooper "doesn't overwrite existing data"); 13757718be8SEnji Cooper } 13857718be8SEnji Cooper 13957718be8SEnji Cooper ATF_TC_BODY(hsearch_duplicate, tc) 14057718be8SEnji Cooper { 14157718be8SEnji Cooper ENTRY e, *ep; 14257718be8SEnji Cooper 14357718be8SEnji Cooper REQUIRE_ERRNO(hcreate(16)); 14457718be8SEnji Cooper 14557718be8SEnji Cooper e.key = __UNCONST("a"); 14657718be8SEnji Cooper e.data = (void *)(intptr_t) 0; 14757718be8SEnji Cooper 14857718be8SEnji Cooper ep = hsearch(e, ENTER); 14957718be8SEnji Cooper 15057718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 15157718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 15257718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 15357718be8SEnji Cooper 15457718be8SEnji Cooper e.data = (void *)(intptr_t)12345; 15557718be8SEnji Cooper 15657718be8SEnji Cooper ep = hsearch(e, ENTER); 15757718be8SEnji Cooper ep = hsearch(e, FIND); 15857718be8SEnji Cooper 15957718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 16057718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 16157718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 16257718be8SEnji Cooper 16357718be8SEnji Cooper hdestroy(); 16457718be8SEnji Cooper } 16557718be8SEnji Cooper 16657718be8SEnji Cooper ATF_TC(hsearch_nonexistent); 16757718be8SEnji Cooper ATF_TC_HEAD(hsearch_nonexistent, tc) 16857718be8SEnji Cooper { 16957718be8SEnji Cooper 17057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", 17157718be8SEnji Cooper "Checks searching for non-existent entry"); 17257718be8SEnji Cooper } 17357718be8SEnji Cooper 17457718be8SEnji Cooper ATF_TC_BODY(hsearch_nonexistent, tc) 17557718be8SEnji Cooper { 17657718be8SEnji Cooper ENTRY e, *ep; 17757718be8SEnji Cooper 17857718be8SEnji Cooper REQUIRE_ERRNO(hcreate(16)); 17957718be8SEnji Cooper 18057718be8SEnji Cooper e.key = __UNCONST("A"); 18157718be8SEnji Cooper ep = hsearch(e, FIND); 18257718be8SEnji Cooper ATF_REQUIRE_EQ(ep, NULL); 18357718be8SEnji Cooper 18457718be8SEnji Cooper hdestroy(); 18557718be8SEnji Cooper } 18657718be8SEnji Cooper 18757718be8SEnji Cooper ATF_TC(hsearch_two); 18857718be8SEnji Cooper ATF_TC_HEAD(hsearch_two, tc) 18957718be8SEnji Cooper { 19057718be8SEnji Cooper 19157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", 19257718be8SEnji Cooper "Checks that searching doesn't overwrite previous search results"); 19357718be8SEnji Cooper } 19457718be8SEnji Cooper 19557718be8SEnji Cooper ATF_TC_BODY(hsearch_two, tc) 19657718be8SEnji Cooper { 19757718be8SEnji Cooper ENTRY e, *ep, *ep2; 19857718be8SEnji Cooper 19957718be8SEnji Cooper REQUIRE_ERRNO(hcreate(16)); 20057718be8SEnji Cooper 20157718be8SEnji Cooper e.key = __UNCONST("a"); 20257718be8SEnji Cooper e.data = (void*)(intptr_t)0; 20357718be8SEnji Cooper 20457718be8SEnji Cooper ep = hsearch(e, ENTER); 20557718be8SEnji Cooper 20657718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 20757718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 20857718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 20957718be8SEnji Cooper 21057718be8SEnji Cooper e.key = __UNCONST("b"); 21157718be8SEnji Cooper e.data = (void*)(intptr_t)1; 21257718be8SEnji Cooper 21357718be8SEnji Cooper ep = hsearch(e, ENTER); 21457718be8SEnji Cooper 21557718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 21657718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "b"); 21757718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 1); 21857718be8SEnji Cooper 21957718be8SEnji Cooper e.key = __UNCONST("a"); 22057718be8SEnji Cooper ep = hsearch(e, FIND); 22157718be8SEnji Cooper 22257718be8SEnji Cooper e.key = __UNCONST("b"); 22357718be8SEnji Cooper ep2 = hsearch(e, FIND); 22457718be8SEnji Cooper 22557718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 22657718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 22757718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 22857718be8SEnji Cooper 22957718be8SEnji Cooper ATF_REQUIRE(ep2 != NULL); 23057718be8SEnji Cooper ATF_REQUIRE_STREQ(ep2->key, "b"); 23157718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep2->data, 1); 23257718be8SEnji Cooper 23357718be8SEnji Cooper hdestroy(); 23457718be8SEnji Cooper } 23557718be8SEnji Cooper 23692e8bbfdSEnji Cooper #if defined(__FreeBSD__) && 1100027 <= __FreeBSD_version 23757718be8SEnji Cooper ATF_TC(hsearch_r_basic); 23857718be8SEnji Cooper ATF_TC_HEAD(hsearch_r_basic, tc) 23957718be8SEnji Cooper { 24057718be8SEnji Cooper 24157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks basic insertions and searching"); 24257718be8SEnji Cooper } 24357718be8SEnji Cooper 24457718be8SEnji Cooper ATF_TC_BODY(hsearch_r_basic, tc) 24557718be8SEnji Cooper { 24657718be8SEnji Cooper ENTRY e, *ep; 24757718be8SEnji Cooper char ch[2]; 24857718be8SEnji Cooper int i; 24957718be8SEnji Cooper struct hsearch_data t; 25057718be8SEnji Cooper 25157718be8SEnji Cooper REQUIRE_ERRNO(hcreate_r(16, &t) != 0); 25257718be8SEnji Cooper 25357718be8SEnji Cooper /* ch[1] should be constant from here on down. */ 25457718be8SEnji Cooper ch[1] = '\0'; 25557718be8SEnji Cooper 25657718be8SEnji Cooper /* Basic insertions. Check enough that there'll be collisions. */ 25757718be8SEnji Cooper for (i = 0; i < 26; i++) { 25857718be8SEnji Cooper ch[0] = 'a' + i; 25957718be8SEnji Cooper e.key = strdup(ch); /* ptr to provided key is kept! */ 26057718be8SEnji Cooper ATF_REQUIRE(e.key != NULL); 26157718be8SEnji Cooper e.data = (void *)(intptr_t)i; 26257718be8SEnji Cooper 26357718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1); 26457718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 26557718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, ch); 26657718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, i); 26757718be8SEnji Cooper } 26857718be8SEnji Cooper 26957718be8SEnji Cooper /* e.key should be constant from here on down. */ 27057718be8SEnji Cooper e.key = ch; 27157718be8SEnji Cooper 27257718be8SEnji Cooper /* Basic lookups. */ 27357718be8SEnji Cooper for (i = 0; i < 26; i++) { 27457718be8SEnji Cooper ch[0] = 'a' + i; 27557718be8SEnji Cooper 27657718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, FIND, &ep, &t) == 1); 27757718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 27857718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, ch); 27957718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, i); 28057718be8SEnji Cooper } 28157718be8SEnji Cooper 282f2b9adffSEnji Cooper #ifdef __NetBSD__ 28357718be8SEnji Cooper hdestroy1_r(&t, free, NULL); 284f2b9adffSEnji Cooper #else 285f2b9adffSEnji Cooper hdestroy_r(&t); 286f2b9adffSEnji Cooper #endif 28757718be8SEnji Cooper } 288b3a6b001SEnji Cooper #endif 28957718be8SEnji Cooper 29057718be8SEnji Cooper ATF_TC(hsearch_r_duplicate); 29157718be8SEnji Cooper ATF_TC_HEAD(hsearch_r_duplicate, tc) 29257718be8SEnji Cooper { 29357718be8SEnji Cooper 29457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks that inserting duplicate " 29557718be8SEnji Cooper "doesn't overwrite existing data"); 29657718be8SEnji Cooper } 29757718be8SEnji Cooper 29857718be8SEnji Cooper ATF_TC_BODY(hsearch_r_duplicate, tc) 29957718be8SEnji Cooper { 30057718be8SEnji Cooper ENTRY e, *ep; 30157718be8SEnji Cooper struct hsearch_data t; 30257718be8SEnji Cooper 30357718be8SEnji Cooper REQUIRE_ERRNO(hcreate_r(16, &t)); 30457718be8SEnji Cooper 30557718be8SEnji Cooper e.key = __UNCONST("a"); 30657718be8SEnji Cooper e.data = (void *)(intptr_t) 0; 30757718be8SEnji Cooper 30857718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1); 30957718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 31057718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 31157718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 31257718be8SEnji Cooper 31357718be8SEnji Cooper e.data = (void *)(intptr_t)12345; 31457718be8SEnji Cooper 31557718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1); 31657718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, FIND, &ep, &t) == 1); 31757718be8SEnji Cooper 31857718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 31957718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 32057718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 32157718be8SEnji Cooper 32257718be8SEnji Cooper hdestroy_r(&t); 32357718be8SEnji Cooper } 32457718be8SEnji Cooper 32557718be8SEnji Cooper ATF_TC(hsearch_r_nonexistent); 32657718be8SEnji Cooper ATF_TC_HEAD(hsearch_r_nonexistent, tc) 32757718be8SEnji Cooper { 32857718be8SEnji Cooper 32957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", 33057718be8SEnji Cooper "Checks searching for non-existent entry"); 33157718be8SEnji Cooper } 33257718be8SEnji Cooper 33357718be8SEnji Cooper ATF_TC_BODY(hsearch_r_nonexistent, tc) 33457718be8SEnji Cooper { 33557718be8SEnji Cooper ENTRY e, *ep; 33657718be8SEnji Cooper struct hsearch_data t; 33757718be8SEnji Cooper 33857718be8SEnji Cooper REQUIRE_ERRNO(hcreate_r(16, &t)); 33957718be8SEnji Cooper 340*7047ed68SEnji Cooper #ifdef __FreeBSD__ 341*7047ed68SEnji Cooper atf_tc_expect_fail("behavior doesn't match docs; see bug # 216872"); 342*7047ed68SEnji Cooper #endif 34357718be8SEnji Cooper e.key = __UNCONST("A"); 34457718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, FIND, &ep, &t) == 1); 34557718be8SEnji Cooper ATF_REQUIRE_EQ(ep, NULL); 34657718be8SEnji Cooper 34757718be8SEnji Cooper hdestroy_r(&t); 34857718be8SEnji Cooper } 34957718be8SEnji Cooper 35057718be8SEnji Cooper ATF_TC(hsearch_r_two); 35157718be8SEnji Cooper ATF_TC_HEAD(hsearch_r_two, tc) 35257718be8SEnji Cooper { 35357718be8SEnji Cooper 35457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", 35557718be8SEnji Cooper "Checks that searching doesn't overwrite previous search results"); 35657718be8SEnji Cooper } 35757718be8SEnji Cooper 35857718be8SEnji Cooper ATF_TC_BODY(hsearch_r_two, tc) 35957718be8SEnji Cooper { 36057718be8SEnji Cooper ENTRY e, *ep, *ep2; 36157718be8SEnji Cooper struct hsearch_data t; 36257718be8SEnji Cooper 36357718be8SEnji Cooper REQUIRE_ERRNO(hcreate_r(16, &t)); 36457718be8SEnji Cooper 36557718be8SEnji Cooper e.key = __UNCONST("a"); 36657718be8SEnji Cooper e.data = (void*)(intptr_t)0; 36757718be8SEnji Cooper 36857718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1); 36957718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 37057718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 37157718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 37257718be8SEnji Cooper 37357718be8SEnji Cooper e.key = __UNCONST("b"); 37457718be8SEnji Cooper e.data = (void*)(intptr_t)1; 37557718be8SEnji Cooper 37657718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1); 37757718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 37857718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "b"); 37957718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 1); 38057718be8SEnji Cooper 38157718be8SEnji Cooper e.key = __UNCONST("a"); 38257718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, FIND, &ep, &t) == 1); 38357718be8SEnji Cooper 38457718be8SEnji Cooper e.key = __UNCONST("b"); 38557718be8SEnji Cooper ATF_REQUIRE(hsearch_r(e, FIND, &ep2, &t) == 1); 38657718be8SEnji Cooper 38757718be8SEnji Cooper ATF_REQUIRE(ep != NULL); 38857718be8SEnji Cooper ATF_REQUIRE_STREQ(ep->key, "a"); 38957718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep->data, 0); 39057718be8SEnji Cooper 39157718be8SEnji Cooper ATF_REQUIRE(ep2 != NULL); 39257718be8SEnji Cooper ATF_REQUIRE_STREQ(ep2->key, "b"); 39357718be8SEnji Cooper ATF_REQUIRE_EQ((intptr_t)ep2->data, 1); 39457718be8SEnji Cooper 39557718be8SEnji Cooper hdestroy_r(&t); 39657718be8SEnji Cooper } 39757718be8SEnji Cooper 39857718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 39957718be8SEnji Cooper { 40057718be8SEnji Cooper 40157718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_basic); 40257718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_duplicate); 40357718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_nonexistent); 40457718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_two); 40557718be8SEnji Cooper 40692e8bbfdSEnji Cooper #if defined(__FreeBSD__) && 1100027 <= __FreeBSD_version 40757718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_r_basic); 40857718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_r_duplicate); 40957718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_r_nonexistent); 41057718be8SEnji Cooper ATF_TP_ADD_TC(tp, hsearch_r_two); 41192e8bbfdSEnji Cooper #endif 41257718be8SEnji Cooper 41357718be8SEnji Cooper return atf_no_error(); 41457718be8SEnji Cooper } 415