blob: 7f27e52963b5c92f40484cf949dbe8038db108ad [file]
#define _GNU_SOURCE
#include <search.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* mingw-w64 headers */
#include "libtest.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;
}
static void
noop_free (void *arg)
{
return;
}
/* Number of nodes printed by `print_node` in a call to `twalk` */
static int nodes_printed;
void print_node (const void *ptr, VISIT order, int level)
{
const char *s = *(const char **) ptr;
if (order == postorder || order == leaf) {
nodes_printed += 1;
printf("%s\n", s);
}
}
int main (int argc, char **argv)
{
int exit_code = EXIT_SUCCESS;
void *root = NULL;
void *nodep;
mingw_test_init ();
tsearch("aaa", &root, node_cmp);
tsearch("bbb", &root, node_cmp);
tsearch("ccc", &root, node_cmp);
printf("---------- tree after insertion of 3 nodes:\n");
nodes_printed = 0;
twalk(root, print_node);
if (nodes_printed != 3) {
printf ("ERROR: printed %d nodes when expected %d\n", nodes_printed, 3);
exit_code = EXIT_FAILURE;
}
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");
nodes_printed = 0;
twalk(root, print_node);
if (nodes_printed != 0) {
printf ("ERROR: printed %d nodes when expected %d\n", nodes_printed, 0);
exit_code = EXIT_FAILURE;
}
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");
nodes_printed = 0;
twalk(root, print_node);
if (nodes_printed != 3) {
printf ("ERROR: printed %d nodes when expected %d\n", nodes_printed, 3);
exit_code = EXIT_FAILURE;
}
printf("----------\n");
while (tdelete(NULL, &root, node_any) != NULL)
;
printf("---------- tree after deletion of all nodes using tdelete() only:\n");
nodes_printed = 0;
twalk(root, print_node);
if (nodes_printed != 0) {
printf ("ERROR: printed %d nodes when expected %d\n", nodes_printed, 0);
exit_code = EXIT_FAILURE;
}
printf("----------\n");
tsearch("ggg", &root, node_cmp);
tsearch("hhh", &root, node_cmp);
tsearch("iii", &root, node_cmp);
printf("---------- tree after insertion of 3 new nodes:\n");
nodes_printed = 0;
twalk(root, print_node);
if (nodes_printed != 3) {
printf ("ERROR: printed %d nodes when expected %d\n", nodes_printed, 3);
exit_code = EXIT_FAILURE;
}
printf("----------\n");
tdestroy(root, noop_free);
root = NULL;
printf("---------- tree after deletion of all nodes using tdestroy() only:\n");
nodes_printed = 0;
twalk(root, print_node);
if (nodes_printed != 0) {
printf ("ERROR: printed %d nodes when expected %d\n", nodes_printed, 0);
exit_code = EXIT_FAILURE;
}
printf("----------\n");
printf("Done\n");
return exit_code;
}