xref: /minix3/crypto/external/bsd/heimdal/dist/lib/roken/tsearch-test.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc /*	$NetBSD: tsearch-test.c,v 1.1.1.2 2014/04/24 12:45:52 pettai Exp $	*/
2ebfedea0SLionel Sambuc 
3ebfedea0SLionel Sambuc /*
4ebfedea0SLionel Sambuc  * Tree search generalized from Knuth (6.2.2) Algorithm T just like
5ebfedea0SLionel Sambuc  * the AT&T man page says.
6ebfedea0SLionel Sambuc  *
7ebfedea0SLionel Sambuc  * The node_t structure is for internal use only, lint doesn't grok it.
8ebfedea0SLionel Sambuc  *
9ebfedea0SLionel Sambuc  * Written by reading the System V Interface Definition, not the code.
10ebfedea0SLionel Sambuc  *
11ebfedea0SLionel Sambuc  * Totally public domain.
12ebfedea0SLionel Sambuc  */
13ebfedea0SLionel Sambuc 
14ebfedea0SLionel Sambuc #include <config.h>
15ebfedea0SLionel Sambuc 
16ebfedea0SLionel Sambuc #include <krb5/roken.h>
17ebfedea0SLionel Sambuc #include "search.h"
18ebfedea0SLionel Sambuc 
19ebfedea0SLionel Sambuc struct node {
20ebfedea0SLionel Sambuc     char *string;
21ebfedea0SLionel Sambuc     int order;
22ebfedea0SLionel Sambuc };
23ebfedea0SLionel Sambuc 
24*0a6a1f1dSLionel Sambuc extern void *rk_tdelete(const void *, void **,
25ebfedea0SLionel Sambuc 		 int (*)(const void *, const void *));
26ebfedea0SLionel Sambuc extern void *rk_tfind(const void *, void * const *,
27ebfedea0SLionel Sambuc 	       int (*)(const void *, const void *));
28ebfedea0SLionel Sambuc extern void *rk_tsearch(const void *, void **, int (*)(const void *, const void *));
29ebfedea0SLionel Sambuc extern void rk_twalk(const void *, void (*)(const void *, VISIT, int));
30ebfedea0SLionel Sambuc 
31ebfedea0SLionel Sambuc void *rootnode = NULL;
32ebfedea0SLionel Sambuc int numerr = 0;
33ebfedea0SLionel Sambuc 
34ebfedea0SLionel Sambuc /*
35ebfedea0SLionel Sambuc  *  This routine compares two nodes, based on an
36ebfedea0SLionel Sambuc  *  alphabetical ordering of the string field.
37ebfedea0SLionel Sambuc  */
38ebfedea0SLionel Sambuc int
node_compare(const void * node1,const void * node2)39ebfedea0SLionel Sambuc node_compare(const void *node1, const void *node2)
40ebfedea0SLionel Sambuc {
41ebfedea0SLionel Sambuc     return strcmp(((const struct node *) node1)->string,
42ebfedea0SLionel Sambuc 		  ((const struct node *) node2)->string);
43ebfedea0SLionel Sambuc }
44ebfedea0SLionel Sambuc 
45ebfedea0SLionel Sambuc static int walkorder = -1;
46ebfedea0SLionel Sambuc 
47ebfedea0SLionel Sambuc void
list_node(const void * ptr,VISIT order,int level)48ebfedea0SLionel Sambuc list_node(const void *ptr, VISIT order, int level)
49ebfedea0SLionel Sambuc {
50ebfedea0SLionel Sambuc     const struct node *p = *(const struct node **) ptr;
51ebfedea0SLionel Sambuc 
52ebfedea0SLionel Sambuc     if (order == postorder || order == leaf)  {
53ebfedea0SLionel Sambuc 	walkorder++;
54ebfedea0SLionel Sambuc 	if (p->order != walkorder) {
55ebfedea0SLionel Sambuc 	    warnx("sort failed: expected %d next, got %d\n", walkorder,
56ebfedea0SLionel Sambuc 		  p->order);
57ebfedea0SLionel Sambuc 	    numerr++;
58ebfedea0SLionel Sambuc 	}
59ebfedea0SLionel Sambuc     }
60ebfedea0SLionel Sambuc }
61ebfedea0SLionel Sambuc 
62ebfedea0SLionel Sambuc int
main(int argc,char ** argv)63ebfedea0SLionel Sambuc main(int argc, char **argv)
64ebfedea0SLionel Sambuc {
65ebfedea0SLionel Sambuc     int numtest = 1;
66ebfedea0SLionel Sambuc     struct node *t, *p, tests[] = {
67ebfedea0SLionel Sambuc 	{ "", 0 },
68ebfedea0SLionel Sambuc 	{ "ab", 3 },
69ebfedea0SLionel Sambuc 	{ "abc", 4 },
70ebfedea0SLionel Sambuc 	{ "abcdefg", 8 },
71ebfedea0SLionel Sambuc 	{ "abcd", 5 },
72ebfedea0SLionel Sambuc 	{ "a", 2 },
73ebfedea0SLionel Sambuc 	{ "abcdef", 7 },
74ebfedea0SLionel Sambuc 	{ "abcde", 6 },
75ebfedea0SLionel Sambuc 	{ "=", 1 },
76ebfedea0SLionel Sambuc 	{ NULL }
77ebfedea0SLionel Sambuc     };
78ebfedea0SLionel Sambuc 
79ebfedea0SLionel Sambuc     for(t = tests; t->string; t++) {
80ebfedea0SLionel Sambuc 	/* Better not be there */
81ebfedea0SLionel Sambuc 	p = (struct node *)rk_tfind((void *)t, (void **)&rootnode,
82ebfedea0SLionel Sambuc 				    node_compare);
83ebfedea0SLionel Sambuc 
84ebfedea0SLionel Sambuc 	if (p) {
85ebfedea0SLionel Sambuc 	    warnx("erroneous list: found %d\n", p->order);
86ebfedea0SLionel Sambuc 	    numerr++;
87ebfedea0SLionel Sambuc 	}
88ebfedea0SLionel Sambuc 
89ebfedea0SLionel Sambuc 	/* Put node into the tree. */
90ebfedea0SLionel Sambuc 	p = (struct node *) rk_tsearch((void *)t, (void **)&rootnode,
91ebfedea0SLionel Sambuc 				       node_compare);
92ebfedea0SLionel Sambuc 
93ebfedea0SLionel Sambuc 	if (!p) {
94ebfedea0SLionel Sambuc 	    warnx("erroneous list: missing %d\n", t->order);
95ebfedea0SLionel Sambuc 	    numerr++;
96ebfedea0SLionel Sambuc 	}
97ebfedea0SLionel Sambuc     }
98ebfedea0SLionel Sambuc 
99ebfedea0SLionel Sambuc     rk_twalk(rootnode, list_node);
100ebfedea0SLionel Sambuc 
101ebfedea0SLionel Sambuc     for(t = tests; t->string; t++) {
102ebfedea0SLionel Sambuc 	/* Better be there */
103ebfedea0SLionel Sambuc 	p =  (struct node *) rk_tfind((void *)t, (void **)&rootnode,
104ebfedea0SLionel Sambuc 				      node_compare);
105ebfedea0SLionel Sambuc 
106ebfedea0SLionel Sambuc 	if (!p) {
107ebfedea0SLionel Sambuc 	    warnx("erroneous list: missing %d\n", t->order);
108ebfedea0SLionel Sambuc 	    numerr++;
109ebfedea0SLionel Sambuc 	}
110ebfedea0SLionel Sambuc 
111ebfedea0SLionel Sambuc 	/* pull out node */
112ebfedea0SLionel Sambuc 	(void) rk_tdelete((void *)t, (void **)&rootnode,
113ebfedea0SLionel Sambuc 			  node_compare);
114ebfedea0SLionel Sambuc 
115ebfedea0SLionel Sambuc 	/* Better not be there */
116ebfedea0SLionel Sambuc 	p =  (struct node *) rk_tfind((void *)t, (void **)&rootnode,
117ebfedea0SLionel Sambuc 				      node_compare);
118ebfedea0SLionel Sambuc 
119ebfedea0SLionel Sambuc 	if (p) {
120ebfedea0SLionel Sambuc 	    warnx("erroneous list: found %d\n", p->order);
121ebfedea0SLionel Sambuc 	    numerr++;
122ebfedea0SLionel Sambuc 	}
123ebfedea0SLionel Sambuc 
124ebfedea0SLionel Sambuc     }
125ebfedea0SLionel Sambuc 
126ebfedea0SLionel Sambuc     return numerr;
127ebfedea0SLionel Sambuc }
128