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