added Kai's testcases for tsearch() & co.

git-svn-id: svn+ssh://svn.code.sf.net/p/mingw-w64/code/stable/v2.x@4461 4407c894-4637-0410-b4f5-ada5f102cad1
diff --git a/mingw-w64-crt/testcases/t_tsearch.c b/mingw-w64-crt/testcases/t_tsearch.c
new file mode 100644
index 0000000..c4d8258
--- /dev/null
+++ b/mingw-w64-crt/testcases/t_tsearch.c
@@ -0,0 +1,109 @@
+/*
+
+Code exposing two POSIX-incompatibilities in search.h from mingw.org:
+
+- compilation causes a NULL-warning, although key=NULL is allowed:
+  "warning: null argument where non-null required (argument 1) [-Wnonnull]"
+
+- the second deletion method using tdelete() only causes the following
+  assertion at runtime:
+
+     Assertion failed! File:
+../../../build/mingw/mingw-w64-crt/misc/tdelete.c, Line 33
+     Expression: vkey != NULL. abnormal program termination
+
+These issues are fixed in the mingw-w64 svn as of rev. 4413
+
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <search.h>
+
+static int node_cmp (const void *a, const void *b)
+{
+ return strcmp((const char *) a, (const char *) b);
+}
+
+/* match any node... */
+static int node_any (const void *a, const void *b)
+{
+ return 0;
+}
+
+void print_node (const void *ptr, VISIT order, int level)
+{
+ const char *s = *(const char **) ptr;
+ if (order == postorder || order == leaf)
+   printf("%s\n", s);
+}
+
+int main (int argc, char **argv)
+{
+ void *root = NULL;
+ void *nodep;
+
+ tsearch("aaa", &root, node_cmp);
+ tsearch("bbb", &root, node_cmp);
+ tsearch("ccc", &root, node_cmp);
+ printf("---------- tree after insertion of 3 nodes:\n");
+ twalk(root, print_node);
+
+ printf("----------\n");
+
+ while ((nodep = tfind(NULL, &root, node_any)))
+ {
+   const char *key = * (const char **) nodep;
+   tdelete(key, &root, node_cmp);
+ }
+ printf("---------- tree after deletion of all nodes using tfind()+tdelete():\n");
+ twalk(root, print_node);
+ printf("----------\n");
+
+ tsearch("ddd", &root, node_cmp);
+ tsearch("eee", &root, node_cmp);
+ tsearch("fff", &root, node_cmp);
+ printf("---------- tree after insertion of 3 new nodes:\n");
+ twalk(root, print_node);
+ printf("----------\n");
+ while (tdelete(NULL, &root, node_any) != NULL)
+   ;
+ printf("---------- tree after deletion of all nodes using tdelete() only:\n");
+ twalk(root, print_node);
+ printf("----------\n");
+ printf("Passed\n");
+ return 0;
+}
+
+/*
+------------ requested output:
+$ valgrind ./search_test
+==9853== Memcheck, a memory error detector
+==9853== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
+==9853== Using Valgrind-3.7.0.SVN and LibVEX; rerun with -h for copyright info
+==9853== Command: ./search_test
+==9853==
+---------- tree after insertion of 3 nodes:
+aaa
+bbb
+ccc
+----------
+---------- tree after deletion of all nodes using tfind()+tdelete():
+----------
+---------- tree after insertion of 3 new nodes:
+ddd
+eee
+fff
+----------
+---------- tree after deletion of all nodes using tdelete() only:
+----------
+==9853==
+==9853== HEAP SUMMARY:
+==9853==     in use at exit: 0 bytes in 0 blocks
+==9853==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
+==9853==
+==9853== All heap blocks were freed -- no leaks are possible
+==9853==
+==9853== For counts of detected and suppressed errors, rerun with: -v
+==9853== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
+*/