Module Name:    src
Committed By:   christos
Date:           Sun Jul 20 20:17:21 UTC 2014

Modified Files:
        src/include: search.h
        src/lib/libc/stdlib: hcreate.3 hcreate.c
        src/tests/lib/libc/stdlib: t_hsearch.c

Log Message:
amend the new destroy function to take function pointers.


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/include/search.h
cvs rdiff -u -r1.12 -r1.13 src/lib/libc/stdlib/hcreate.3
cvs rdiff -u -r1.9 -r1.10 src/lib/libc/stdlib/hcreate.c
cvs rdiff -u -r1.3 -r1.4 src/tests/lib/libc/stdlib/t_hsearch.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/include/search.h
diff -u src/include/search.h:1.21 src/include/search.h:1.22
--- src/include/search.h:1.21	Sun Jul 20 09:34:17 2014
+++ src/include/search.h	Sun Jul 20 16:17:21 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: search.h,v 1.21 2014/07/20 13:34:17 christos Exp $	*/
+/*	$NetBSD: search.h,v 1.22 2014/07/20 20:17:21 christos Exp $	*/
 
 /*
  * Written by J.T. Conklin <j...@netbsd.org>
@@ -62,12 +62,10 @@ void	 hdestroy(void);
 ENTRY	*hsearch(ENTRY, ACTION);
 
 #ifdef _NETBSD_SOURCE
-#define FREE_KEY 1
-#define FREE_DATA 2
-void	 hdestroy1(int);
+void	 hdestroy1(void (*)(void *), void (*)(void *));
 int	 hcreate_r(size_t, struct hsearch_data *);
 void	 hdestroy_r(struct hsearch_data *);
-void	 hdestroy1_r(struct hsearch_data *, int);
+void	 hdestroy1_r(struct hsearch_data *, void (*)(void *), void (*)(void *));
 int	 hsearch_r(ENTRY, ACTION, ENTRY **, struct hsearch_data *);
 #endif /* _NETBSD_SOURCE */
 

Index: src/lib/libc/stdlib/hcreate.3
diff -u src/lib/libc/stdlib/hcreate.3:1.12 src/lib/libc/stdlib/hcreate.3:1.13
--- src/lib/libc/stdlib/hcreate.3:1.12	Sun Jul 20 09:41:14 2014
+++ src/lib/libc/stdlib/hcreate.3	Sun Jul 20 16:17:21 2014
@@ -1,4 +1,4 @@
-.\" 	$NetBSD: hcreate.3,v 1.12 2014/07/20 13:41:14 wiz Exp $
+.\" 	$NetBSD: hcreate.3,v 1.13 2014/07/20 20:17:21 christos Exp $
 .\"
 .\" Copyright (c) 1999 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -51,11 +51,11 @@
 .Ft void
 .Fn hdestroy "void"
 .Ft void
-.Fn hdestroy1 "int flags"
+.Fn hdestroy1 "void (*freekey)(void *)" "void (*freedata)(void *)"
 .Ft void
 .Fn hdestroy_r "struct hsearch_data *table"
 .Ft void
-.Fn hdestroy1_r "struct hsearch_data *table" "int flags"
+.Fn hdestroy1_r "struct hsearch_data *table" "void (*freekey)(void *)" "void (*freedata)(void *)"
 .Ft ENTRY *
 .Fn hsearch "ENTRY item" "ACTION action"
 .Ft int
@@ -166,27 +166,23 @@ function provided, the
 .Fn hdestroy1
 and
 .Fn hdestroy1_r
-allow controlling if the
+allow controlling how the
 .Fa key
 or
 .Fa value
 will be freed using the
-.Fa flags
-argument.
-If the bit
-.Dv FREE_KEY
-is set, then the
+provided functions in the
+.Fa freekey
+and
+.Fa freedata
+arguments.
+If they are
+.Dv NULL ,
+then
 .Fa key
-of each entry will be
-passed to
-.Xr free 3 .
-If the bit
-.Dv FREE_VALUE
-is set, then the
+and
 .Fa value
-of each entry will be
-passed to
-.Xr free 3 .
+are not freed.
 .Pp
 The
 .Fn hcreate_r ,

Index: src/lib/libc/stdlib/hcreate.c
diff -u src/lib/libc/stdlib/hcreate.c:1.9 src/lib/libc/stdlib/hcreate.c:1.10
--- src/lib/libc/stdlib/hcreate.c:1.9	Sun Jul 20 09:34:17 2014
+++ src/lib/libc/stdlib/hcreate.c	Sun Jul 20 16:17:21 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: hcreate.c,v 1.9 2014/07/20 13:34:17 christos Exp $ */
+/* $NetBSD: hcreate.c,v 1.10 2014/07/20 20:17:21 christos Exp $ */
 
 /*
  * Copyright (c) 2001 Christopher G. Demetriou
@@ -43,7 +43,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: hcreate.c,v 1.9 2014/07/20 13:34:17 christos Exp $");
+__RCSID("$NetBSD: hcreate.c,v 1.10 2014/07/20 20:17:21 christos Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #if !defined(lint)
@@ -141,20 +141,21 @@ hcreate_r(size_t nel, struct hsearch_dat
 }
 
 void
-hdestroy1(int flags)
+hdestroy1(void (*freekey)(void *), void (*freedata)(void *))
 {
 	_DIAGASSERT(htable.table != NULL);
-	hdestroy1_r(&htable, flags);
+	hdestroy1_r(&htable, freekey, freedata);
 }
 
 void
 hdestroy(void)
 {
-	hdestroy1(0);
+	hdestroy1(NULL, NULL);
 }
 
 void
-hdestroy1_r(struct hsearch_data *head, int flags)
+hdestroy1_r(struct hsearch_data *head, void (*freekey)(void *),
+    void (*freedata)(void *))
 {
 	struct internal_entry *ie;
 	size_t idx;
@@ -172,10 +173,10 @@ hdestroy1_r(struct hsearch_data *head, i
 		while (!SLIST_EMPTY(&table[idx])) {
 			ie = SLIST_FIRST(&table[idx]);
 			SLIST_REMOVE_HEAD(&table[idx], link);
-			if (flags & FREE_KEY)
-				free(ie->ent.key);
-			if (flags & FREE_DATA)
-				free(ie->ent.data);
+			if (freekey)
+				(*freekey)(ie->ent.key);
+			if (freedata)
+				(*freedata)(ie->ent.data);
 			free(ie);
 		}
 	}
@@ -185,7 +186,7 @@ hdestroy1_r(struct hsearch_data *head, i
 void
 hdestroy_r(struct hsearch_data *head)
 {
-	hdestroy1_r(head, 0);
+	hdestroy1_r(head, NULL, NULL);
 }
 
 ENTRY *

Index: src/tests/lib/libc/stdlib/t_hsearch.c
diff -u src/tests/lib/libc/stdlib/t_hsearch.c:1.3 src/tests/lib/libc/stdlib/t_hsearch.c:1.4
--- src/tests/lib/libc/stdlib/t_hsearch.c:1.3	Thu Sep 15 10:51:06 2011
+++ src/tests/lib/libc/stdlib/t_hsearch.c	Sun Jul 20 16:17:21 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: t_hsearch.c,v 1.3 2011/09/15 14:51:06 christos Exp $ */
+/* $NetBSD: t_hsearch.c,v 1.4 2014/07/20 20:17:21 christos Exp $ */
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -63,12 +63,13 @@
 #include <sys/cdefs.h>
 __COPYRIGHT("@(#) Copyright (c) 2008\
  The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_hsearch.c,v 1.3 2011/09/15 14:51:06 christos Exp $");
+__RCSID("$NetBSD: t_hsearch.c,v 1.4 2014/07/20 20:17:21 christos Exp $");
 
 #include <errno.h>
 #include <search.h>
 #include <string.h>
 #include <stdio.h>
+#include <stdlib.h>
 
 #include <atf-c.h>
 
@@ -97,13 +98,13 @@ ATF_TC_BODY(hsearch_basic, tc)
 		ch[0] = 'a' + i;
 		e.key = strdup(ch);	/* ptr to provided key is kept! */
 		ATF_REQUIRE(e.key != NULL);
-		e.data = (void *)(long)i;
+		e.data = (void *)(intptr_t)i;
 
 		ep = hsearch(e, ENTER);
 
 		ATF_REQUIRE(ep != NULL);
 		ATF_REQUIRE_STREQ(ep->key, ch);
-		ATF_REQUIRE_EQ((long)ep->data, i);
+		ATF_REQUIRE_EQ((intptr_t)ep->data, i);
 	}
 
 	/* e.key should be constant from here on down. */
@@ -117,10 +118,10 @@ ATF_TC_BODY(hsearch_basic, tc)
 
 		ATF_REQUIRE(ep != NULL);
 		ATF_REQUIRE_STREQ(ep->key, ch);
-		ATF_REQUIRE_EQ((long)ep->data, i);
+		ATF_REQUIRE_EQ((intptr_t)ep->data, i);
 	}
 
-	hdestroy();
+	hdestroy1(free, NULL);
 }
 
 ATF_TC(hsearch_duplicate);
@@ -137,24 +138,23 @@ ATF_TC_BODY(hsearch_duplicate, tc)
 
 	REQUIRE_ERRNO(hcreate(16));
 
-	e.key = strdup("a");
-	ATF_REQUIRE(e.key != NULL);
-	e.data = (void *)(long) 0;
+	e.key = __UNCONST("a");
+	e.data = (void *)(intptr_t) 0;
 
 	ep = hsearch(e, ENTER);
 
 	ATF_REQUIRE(ep != NULL);
 	ATF_REQUIRE_STREQ(ep->key, "a");
-	ATF_REQUIRE_EQ((long)ep->data, 0);
+	ATF_REQUIRE_EQ((intptr_t)ep->data, 0);
 
-	e.data = (void *)(long)12345;
+	e.data = (void *)(intptr_t)12345;
 
 	ep = hsearch(e, ENTER);
 	ep = hsearch(e, FIND);
 
 	ATF_REQUIRE(ep != NULL);
 	ATF_REQUIRE_STREQ(ep->key, "a");
-	ATF_REQUIRE_EQ((long)ep->data, 0);
+	ATF_REQUIRE_EQ((intptr_t)ep->data, 0);
 
 	hdestroy();
 }
@@ -173,7 +173,7 @@ ATF_TC_BODY(hsearch_nonexistent, tc)
 
 	REQUIRE_ERRNO(hcreate(16));
 
-	e.key = strdup("A");
+	e.key = __UNCONST("A");
 	ep = hsearch(e, FIND);
 	ATF_REQUIRE_EQ(ep, NULL);
 
@@ -191,44 +191,40 @@ ATF_TC_HEAD(hsearch_two, tc)
 ATF_TC_BODY(hsearch_two, tc)
 {
 	ENTRY e, *ep, *ep2;
-	char *sa, *sb;
-
-	ATF_REQUIRE((sa = strdup("a")) != NULL);
-	ATF_REQUIRE((sb = strdup("b")) != NULL);
 
 	REQUIRE_ERRNO(hcreate(16));
 
-	e.key = sa;
-	e.data = (void*)(long)0;
+	e.key = __UNCONST("a");
+	e.data = (void*)(intptr_t)0;
 
 	ep = hsearch(e, ENTER);
 
 	ATF_REQUIRE(ep != NULL);
 	ATF_REQUIRE_STREQ(ep->key, "a");
-	ATF_REQUIRE_EQ((long)ep->data, 0);
+	ATF_REQUIRE_EQ((intptr_t)ep->data, 0);
 
-	e.key = sb;
-	e.data = (void*)(long)1;
+	e.key = __UNCONST("b");
+	e.data = (void*)(intptr_t)1;
 
 	ep = hsearch(e, ENTER);
 
 	ATF_REQUIRE(ep != NULL);
 	ATF_REQUIRE_STREQ(ep->key, "b");
-	ATF_REQUIRE_EQ((long)ep->data, 1);
+	ATF_REQUIRE_EQ((intptr_t)ep->data, 1);
 
-	e.key = sa;
+	e.key = __UNCONST("a");
 	ep = hsearch(e, FIND);
 
-	e.key = sb;
+	e.key = __UNCONST("b");
 	ep2 = hsearch(e, FIND);
 
 	ATF_REQUIRE(ep != NULL);
 	ATF_REQUIRE_STREQ(ep->key, "a");
-	ATF_REQUIRE_EQ((long)ep->data, 0);
+	ATF_REQUIRE_EQ((intptr_t)ep->data, 0);
 
 	ATF_REQUIRE(ep2 != NULL);
 	ATF_REQUIRE_STREQ(ep2->key, "b");
-	ATF_REQUIRE_EQ((long)ep2->data, 1);
+	ATF_REQUIRE_EQ((intptr_t)ep2->data, 1);
 
 	hdestroy();
 }
@@ -257,12 +253,12 @@ ATF_TC_BODY(hsearch_r_basic, tc)
 		ch[0] = 'a' + i;
 		e.key = strdup(ch);	/* ptr to provided key is kept! */
 		ATF_REQUIRE(e.key != NULL);
-		e.data = (void *)(long)i;
+		e.data = (void *)(intptr_t)i;
 
 		ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1);
 		ATF_REQUIRE(ep != NULL);
 		ATF_REQUIRE_STREQ(ep->key, ch);
-		ATF_REQUIRE_EQ((long)ep->data, i);
+		ATF_REQUIRE_EQ((intptr_t)ep->data, i);
 	}
 
 	/* e.key should be constant from here on down. */
@@ -275,10 +271,10 @@ ATF_TC_BODY(hsearch_r_basic, tc)
 		ATF_REQUIRE(hsearch_r(e, FIND, &ep, &t) == 1);
 		ATF_REQUIRE(ep != NULL);
 		ATF_REQUIRE_STREQ(ep->key, ch);
-		ATF_REQUIRE_EQ((long)ep->data, i);
+		ATF_REQUIRE_EQ((intptr_t)ep->data, i);
 	}
 
-	hdestroy_r(&t);
+	hdestroy1_r(&t, free, NULL);
 }
 
 ATF_TC(hsearch_r_duplicate);
@@ -296,23 +292,22 @@ ATF_TC_BODY(hsearch_r_duplicate, tc)
 
 	REQUIRE_ERRNO(hcreate_r(16, &t));
 
-	e.key = strdup("a");
-	ATF_REQUIRE(e.key != NULL);
-	e.data = (void *)(long) 0;
+	e.key = __UNCONST("a");
+	e.data = (void *)(intptr_t) 0;
 
 	ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1);
 	ATF_REQUIRE(ep != NULL);
 	ATF_REQUIRE_STREQ(ep->key, "a");
-	ATF_REQUIRE_EQ((long)ep->data, 0);
+	ATF_REQUIRE_EQ((intptr_t)ep->data, 0);
 
-	e.data = (void *)(long)12345;
+	e.data = (void *)(intptr_t)12345;
 
 	ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1);
 	ATF_REQUIRE(hsearch_r(e, FIND, &ep, &t) == 1);
 
 	ATF_REQUIRE(ep != NULL);
 	ATF_REQUIRE_STREQ(ep->key, "a");
-	ATF_REQUIRE_EQ((long)ep->data, 0);
+	ATF_REQUIRE_EQ((intptr_t)ep->data, 0);
 
 	hdestroy_r(&t);
 }
@@ -332,7 +327,7 @@ ATF_TC_BODY(hsearch_r_nonexistent, tc)
 
 	REQUIRE_ERRNO(hcreate_r(16, &t));
 
-	e.key = strdup("A");
+	e.key = __UNCONST("A");
 	ATF_REQUIRE(hsearch_r(e, FIND, &ep, &t) == 1);
 	ATF_REQUIRE_EQ(ep, NULL);
 
@@ -350,43 +345,39 @@ ATF_TC_HEAD(hsearch_r_two, tc)
 ATF_TC_BODY(hsearch_r_two, tc)
 {
 	ENTRY e, *ep, *ep2;
-	char *sa, *sb;
 	struct hsearch_data t;
 
-	ATF_REQUIRE((sa = strdup("a")) != NULL);
-	ATF_REQUIRE((sb = strdup("b")) != NULL);
-
 	REQUIRE_ERRNO(hcreate_r(16, &t));
 
-	e.key = sa;
-	e.data = (void*)(long)0;
+	e.key = __UNCONST("a");
+	e.data = (void*)(intptr_t)0;
 
 	ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1);
 	ATF_REQUIRE(ep != NULL);
 	ATF_REQUIRE_STREQ(ep->key, "a");
-	ATF_REQUIRE_EQ((long)ep->data, 0);
+	ATF_REQUIRE_EQ((intptr_t)ep->data, 0);
 
-	e.key = sb;
-	e.data = (void*)(long)1;
+	e.key = __UNCONST("b");
+	e.data = (void*)(intptr_t)1;
 
 	ATF_REQUIRE(hsearch_r(e, ENTER, &ep, &t) == 1);
 	ATF_REQUIRE(ep != NULL);
 	ATF_REQUIRE_STREQ(ep->key, "b");
-	ATF_REQUIRE_EQ((long)ep->data, 1);
+	ATF_REQUIRE_EQ((intptr_t)ep->data, 1);
 
-	e.key = sa;
+	e.key = __UNCONST("a");
 	ATF_REQUIRE(hsearch_r(e, FIND, &ep, &t) == 1);
 
-	e.key = sb;
+	e.key = __UNCONST("b");
 	ATF_REQUIRE(hsearch_r(e, FIND, &ep2, &t) == 1);
 
 	ATF_REQUIRE(ep != NULL);
 	ATF_REQUIRE_STREQ(ep->key, "a");
-	ATF_REQUIRE_EQ((long)ep->data, 0);
+	ATF_REQUIRE_EQ((intptr_t)ep->data, 0);
 
 	ATF_REQUIRE(ep2 != NULL);
 	ATF_REQUIRE_STREQ(ep2->key, "b");
-	ATF_REQUIRE_EQ((long)ep2->data, 1);
+	ATF_REQUIRE_EQ((intptr_t)ep2->data, 1);
 
 	hdestroy_r(&t);
 }

Reply via email to