xref: /netbsd-src/external/bsd/openldap/dist/libraries/libldap/testavl.c (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
1*549b59edSchristos /*	$NetBSD: testavl.c,v 1.2 2021/08/14 16:14:56 christos Exp $	*/
2e670fd5cSchristos 
3e670fd5cSchristos /* testavl.c - Test Tim Howes AVL code */
4e670fd5cSchristos /* $OpenLDAP$ */
5e670fd5cSchristos /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
6e670fd5cSchristos  *
7e670fd5cSchristos  * Copyright 1998-2021 The OpenLDAP Foundation.
8e670fd5cSchristos  * All rights reserved.
9e670fd5cSchristos  *
10e670fd5cSchristos  * Redistribution and use in source and binary forms, with or without
11e670fd5cSchristos  * modification, are permitted only as authorized by the OpenLDAP
12e670fd5cSchristos  * Public License.
13e670fd5cSchristos  *
14e670fd5cSchristos  * A copy of this license is available in the file LICENSE in the
15e670fd5cSchristos  * top-level directory of the distribution or, alternatively, at
16e670fd5cSchristos  * <http://www.OpenLDAP.org/license.html>.
17e670fd5cSchristos  */
18e670fd5cSchristos /* Portions Copyright (c) 1993 Regents of the University of Michigan.
19e670fd5cSchristos  * All rights reserved.
20e670fd5cSchristos  *
21e670fd5cSchristos  * Redistribution and use in source and binary forms are permitted
22e670fd5cSchristos  * provided that this notice is preserved and that due credit is given
23e670fd5cSchristos  * to the University of Michigan at Ann Arbor. The name of the University
24e670fd5cSchristos  * may not be used to endorse or promote products derived from this
25e670fd5cSchristos  * software without specific prior written permission. This software
26e670fd5cSchristos  * is provided ``as is'' without express or implied warranty.
27e670fd5cSchristos  */
28e670fd5cSchristos /* ACKNOWLEDGEMENTS:
29e670fd5cSchristos  * This work was originally developed by the University of Michigan
30e670fd5cSchristos  * (as part of U-MICH LDAP).
31e670fd5cSchristos  */
32e670fd5cSchristos 
33e670fd5cSchristos #include <sys/cdefs.h>
34*549b59edSchristos __RCSID("$NetBSD: testavl.c,v 1.2 2021/08/14 16:14:56 christos Exp $");
35e670fd5cSchristos 
36e670fd5cSchristos #include "portable.h"
37e670fd5cSchristos 
38e670fd5cSchristos #include <stdio.h>
39e670fd5cSchristos 
40e670fd5cSchristos #include <ac/stdlib.h>
41e670fd5cSchristos #include <ac/string.h>
42e670fd5cSchristos 
43e670fd5cSchristos #define AVL_INTERNAL
44e670fd5cSchristos #define AVL_NONREENTRANT
45e670fd5cSchristos #include "ldap_avl.h"
46e670fd5cSchristos 
47e670fd5cSchristos static void ravl_print LDAP_P(( Avlnode *root, int depth ));
48e670fd5cSchristos static void myprint LDAP_P(( Avlnode *root ));
49e670fd5cSchristos static int avl_strcmp LDAP_P(( const void *s, const void *t ));
50e670fd5cSchristos 
51e670fd5cSchristos int
main(int argc,char ** argv)52e670fd5cSchristos main( int argc, char **argv )
53e670fd5cSchristos {
54e670fd5cSchristos 	Avlnode	*tree = NULL;
55e670fd5cSchristos 	char	command[ 10 ];
56e670fd5cSchristos 	char	name[ 80 ];
57e670fd5cSchristos 	char	*p;
58e670fd5cSchristos 
59e670fd5cSchristos 	printf( "> " );
60e670fd5cSchristos 	while ( fgets( command, sizeof( command ), stdin ) != NULL ) {
61e670fd5cSchristos 		switch( *command ) {
62e670fd5cSchristos 		case 'n':	/* new tree */
63e670fd5cSchristos 			( void ) ldap_avl_free( tree, free );
64e670fd5cSchristos 			tree = NULL;
65e670fd5cSchristos 			break;
66e670fd5cSchristos 		case 'p':	/* print */
67e670fd5cSchristos 			( void ) myprint( tree );
68e670fd5cSchristos 			break;
69e670fd5cSchristos 		case 't':	/* traverse with first, next */
70e670fd5cSchristos #ifdef AVL_NONREENTRANT
71e670fd5cSchristos 			printf( "***\n" );
72e670fd5cSchristos 			for ( p = (char * ) ldap_avl_getfirst( tree );
73e670fd5cSchristos 			    p != NULL;
74e670fd5cSchristos 				p = (char *) ldap_avl_getnext())
75e670fd5cSchristos 				printf( "%s\n", p );
76e670fd5cSchristos 			printf( "***\n" );
77e670fd5cSchristos #else
78e670fd5cSchristos 			printf( "*** reentrant interface not implemented ***" );
79e670fd5cSchristos #endif
80e670fd5cSchristos 			break;
81e670fd5cSchristos 		case 'f':	/* find */
82e670fd5cSchristos 			printf( "data? " );
83e670fd5cSchristos 			if ( fgets( name, sizeof( name ), stdin ) == NULL )
84e670fd5cSchristos 				exit( EXIT_SUCCESS );
85e670fd5cSchristos 			name[ strlen( name ) - 1 ] = '\0';
86e670fd5cSchristos 			if ( (p = (char *) ldap_avl_find( tree, name, avl_strcmp ))
87e670fd5cSchristos 			    == NULL )
88e670fd5cSchristos 				printf( "Not found.\n\n" );
89e670fd5cSchristos 			else
90e670fd5cSchristos 				printf( "%s\n\n", p );
91e670fd5cSchristos 			break;
92e670fd5cSchristos 		case 'i':	/* insert */
93e670fd5cSchristos 			printf( "data? " );
94e670fd5cSchristos 			if ( fgets( name, sizeof( name ), stdin ) == NULL )
95e670fd5cSchristos 				exit( EXIT_SUCCESS );
96e670fd5cSchristos 			name[ strlen( name ) - 1 ] = '\0';
97e670fd5cSchristos 			if ( ldap_avl_insert( &tree, strdup( name ), avl_strcmp,
98e670fd5cSchristos 			    ldap_avl_dup_error ) != 0 )
99e670fd5cSchristos 				printf( "\nNot inserted!\n" );
100e670fd5cSchristos 			break;
101e670fd5cSchristos 		case 'd':	/* delete */
102e670fd5cSchristos 			printf( "data? " );
103e670fd5cSchristos 			if ( fgets( name, sizeof( name ), stdin ) == NULL )
104e670fd5cSchristos 				exit( EXIT_SUCCESS );
105e670fd5cSchristos 			name[ strlen( name ) - 1 ] = '\0';
106e670fd5cSchristos 			if ( ldap_avl_delete( &tree, name, avl_strcmp ) == NULL )
107e670fd5cSchristos 				printf( "\nNot found!\n" );
108e670fd5cSchristos 			break;
109e670fd5cSchristos 		case 'q':	/* quit */
110e670fd5cSchristos 			exit( EXIT_SUCCESS );
111e670fd5cSchristos 			break;
112e670fd5cSchristos 		case '\n':
113e670fd5cSchristos 			break;
114e670fd5cSchristos 		default:
115e670fd5cSchristos 			printf("Commands: insert, delete, print, new, quit\n");
116e670fd5cSchristos 		}
117e670fd5cSchristos 
118e670fd5cSchristos 		printf( "> " );
119e670fd5cSchristos 	}
120e670fd5cSchristos 
121e670fd5cSchristos 	return( 0 );
122e670fd5cSchristos }
123e670fd5cSchristos 
ravl_print(Avlnode * root,int depth)124e670fd5cSchristos static void ravl_print( Avlnode *root, int depth )
125e670fd5cSchristos {
126e670fd5cSchristos 	int	i;
127e670fd5cSchristos 
128e670fd5cSchristos 	if ( root == 0 )
129e670fd5cSchristos 		return;
130e670fd5cSchristos 
131e670fd5cSchristos 	ravl_print( root->avl_right, depth+1 );
132e670fd5cSchristos 
133e670fd5cSchristos 	for ( i = 0; i < depth; i++ )
134e670fd5cSchristos 		printf( "   " );
135e670fd5cSchristos 	printf( "%s %d\n", (char *) root->avl_data, root->avl_bf );
136e670fd5cSchristos 
137e670fd5cSchristos 	ravl_print( root->avl_left, depth+1 );
138e670fd5cSchristos }
139e670fd5cSchristos 
myprint(Avlnode * root)140e670fd5cSchristos static void myprint( Avlnode *root )
141e670fd5cSchristos {
142e670fd5cSchristos 	printf( "********\n" );
143e670fd5cSchristos 
144e670fd5cSchristos 	if ( root == 0 )
145e670fd5cSchristos 		printf( "\tNULL\n" );
146e670fd5cSchristos 	else
147e670fd5cSchristos 		ravl_print( root, 0 );
148e670fd5cSchristos 
149e670fd5cSchristos 	printf( "********\n" );
150e670fd5cSchristos }
151e670fd5cSchristos 
avl_strcmp(const void * s,const void * t)152e670fd5cSchristos static int avl_strcmp( const void *s, const void *t )
153e670fd5cSchristos {
154e670fd5cSchristos 	return strcmp( s, t );
155e670fd5cSchristos }
156