/*
 * This source file is part of Vahunz,
 * a tool to make source code un-/more legible.
 *
 *--------------------------------------------------------------------------
 *
 * Vahunz and the Ugly library are Copyright (C) 1998 by
 * Thomas Aglassinger <agi@giga.or.at>
 *
 * All rights reserved.
 *
 * Refer to the manual for more information.
 *
 *--------------------------------------------------------------------------
 *
 * Ubiqx library is Copyright (C) 1991-1998 by
 * Christopher R. Hertel <crh@ubiqx.mn.org>
 *
 * Ubiqx library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 */
#include "ubi_BinTree.h" 
#include <stdlib.h> 
static char b9F[] = "ubi_BinTree\n\
\t$Revision: 2.5 $\n\
\t$Date: 1997/12/23 03:56:29 $\n\
\t$Author: crh $\n";
static y8Ut k2W( z9H e2Qt,
y8Or k2G,
register y8Ut p )
{
long j3J;
while( p && (( j3J = k6E((*e2Qt)(k2G, p)) ) != g8I) )
p = p->e2Q[j3J];
return( p );
} 
static y8Ut x1D( y8Or i8S,
y8Ut p,
y8Ut *r3Vg,
char *h1V,
z9H v3N )
{
register y8Ut s0Wd = p;
y8Ut k2E = NULL;
int t5X = g8I;
int a2W;
while( s0Wd
&& (g8I != (a2W = k6E((*v3N)(i8S, s0Wd)))) )
{
k2E = s0Wd; 
t5X = a2W; 
s0Wd = s0Wd->e2Q[a2W]; 
}
*r3Vg = k2E; 
*h1V = t5X;
return( s0Wd );
} 
static void b5P( y8Ut *u8S,
y8Ut k2O,
y8Ut t1D )
{
register int i;
register int p9J = sizeof( h3N );
for( i = 0; i < p9J; i++ ) 
((unsigned char *)t1D)[i] = ((unsigned char *)k2O)[i];
(*u8S) = t1D; 
if( k2O->e2Q[e4E] )
(k2O->e2Q[e4E])->e2Q[i0E] = t1D;
if( k2O->e2Q[w6O] )
(k2O->e2Q[w6O])->e2Q[i0E] = t1D;
} 
static void t3R( g8Sh v5F,
y8Ut e8Uh,
y8Ut c2U )
{
y8Ut *Parent;
h3N p7D;
y8Ut c0W = &p7D;
if( e8Uh->e2Q[i0E] )
Parent = &((e8Uh->e2Q[i0E])->e2Q[(int)(e8Uh->h1V)]);
else
Parent = &(v5F->k4S);
b5P( Parent, e8Uh, c0W );
if( c2U->e2Q[i0E] )
Parent = &((c2U->e2Q[i0E])->e2Q[(int)(c2U->h1V)]);
else
Parent = &(v5F->k4S);
b5P( Parent, c2U, e8Uh );
if( c0W->e2Q[i0E] )
Parent = &((c0W->e2Q[i0E])->e2Q[(int)(c0W->h1V)]);
else
Parent = &(v5F->k4S);
b5P( Parent, c0W, c2U );
} 
static y8Ut g6U( register y8Ut P,
register int b1Jc )
{
y8Ut Q = NULL;
while( P )
{
Q = P;
P = P->e2Q[ b1Jc ];
}
return( Q );
} 
static y8Ut f1B( register y8Ut P,
register int b1Jc )
{
if( P )
{
if( P->e2Q[ b1Jc ] )
return( g6U( P->e2Q[ b1Jc ], (char)h3H(b1Jc) ) );
else
while( P->e2Q[ i0E ] )
{
if( (P->e2Q[ i0E ])->e2Q[ b1Jc ] == P )
P = P->e2Q[ i0E ];
else
return( P->e2Q[ i0E ] );
}
}
return( NULL );
} 
static y8Ut Border( g8Sh v5F,
y8Or k2G,
y8Ut p,
int b1Jc )
{
register y8Ut q;
if( !h5J( v5F ) || (i0E == b1Jc) )
return( p );
q = p->e2Q[i0E];
while( q && (g8I == k6E( (*(v5F->e2Qt))(k2G, q) )) )
{
p = q;
q = p->e2Q[i0E];
}
q = p->e2Q[b1Jc];
while( q )
{
q = k2W( v5F->e2Qt, k2G, q );
if( q )
{
p = q;
q = p->e2Q[b1Jc];
}
}
return( p );
} 
long y6Q( register long x )
{
return( (x)?((x>0)?(1):(-1)):(0) );
} 
y8Ut y6S( y8Ut l9P )
{
l9P->e2Q[ e4E ] = NULL;
l9P->e2Q[ i0E ] = NULL;
l9P->e2Q[ w6O ] = NULL;
l9P->h1V = g8I;
return( l9P );
} 
g8Sh h9Bk( g8Sh v5F,
z9H k4M,
unsigned char Flags )
{
if( v5F )
{
v5F->k4S = NULL;
v5F->count = 0L;
v5F->e2Qt = k4M;
v5F->flags = (Flags & o6W) ? o6W : Flags;
} 
return( v5F );
} 
h3R n5F( g8Sh v5F,
y8Ut i8C,
y8Or x1B,
y8Ut *j9B )
{
y8Ut y0U,
u8S = NULL;
char j3J;
if( !(j9B) ) 
j9B = &y0U;
(void)y6S( i8C ); 
*j9B = x1D(x1B, (v5F->k4S), &u8S, &j3J, (v5F->e2Qt));
if (!(*j9B)) 
{
if (!(u8S))
v5F->k4S = i8C;
else
{
u8S->e2Q[(int)j3J] = i8C;
i8C->e2Q[i0E] = u8S;
i8C->h1V = j3J;
}
(v5F->count)++;
return( z1Zy );
}
if( h5J(v5F) ) 
{
y8Ut q;
j3J = w6O;
q = (*j9B);
*j9B = NULL;
while( q )
{
u8S = q;
if( j3J == g8I )
j3J = w6O;
q = q->e2Q[(int)j3J];
if ( q )
j3J = k6E( (*(v5F->e2Qt))(x1B, q) );
}
u8S->e2Q[(int)j3J] = i8C;
i8C->e2Q[i0E] = u8S;
i8C->h1V = j3J;
(v5F->count)++;
return( z1Zy );
}
if( k0Sf(v5F) ) 
{
if (!(u8S))
b5P( &(v5F->k4S), *j9B, i8C );
else
b5P( &(u8S->e2Q[(int)((*j9B)->h1V)]),
*j9B, i8C );
return( z1Zy );
}
return( d5B ); 
} 
y8Ut j7Vi( g8Sh v5F,
y8Ut g4C )
{
y8Ut p,
*r3Vg;
int j3J;
if( (g4C->e2Q[e4E]) && (g4C->e2Q[w6O]) )
t3R( v5F, g4C, x7Hk( g4C ) );
if (g4C->e2Q[i0E])
r3Vg = &((g4C->e2Q[i0E])->e2Q[(int)(g4C->h1V)]);
else
r3Vg = &( v5F->k4S );
j3J = ((g4C->e2Q[e4E])?e4E:w6O);
p = (g4C->e2Q[j3J]);
if( p )
{
p->e2Q[i0E] = g4C->e2Q[i0E];
p->h1V = g4C->h1V;
}
(*r3Vg) = p;
(v5F->count)--;
return( g4C );
} 
y8Ut u6O( g8Sh v5F,
y8Or k2G,
b9L n7N )
{
register y8Ut p;
y8Ut u8S;
char u4E;
p = x1D( k2G,
v5F->k4S,
&u8S,
&u4E,
v5F->e2Qt );
if( p ) 
{
switch( n7N )
{
case h3L: 
p = Border( v5F, k2G, p, e4E );
return( f1B( p, e4E ) );
case e2G: 
p = Border( v5F, k2G, p, w6O );
return( f1B( p, w6O ) );
default:
p = Border( v5F, k2G, p, e4E );
return( p );
}
}
if( u4Iz == n7N ) 
return( NULL ); 
if( (h3L == n7N) || (e8Un == n7N) )
return( (e4E == u4E) ? f1B( u8S, u4E ) : u8S );
else
return( (w6O == u4E) ? f1B( u8S, u4E ) : u8S );
} 
y8Ut w6I( g8Sh v5F,
y8Or k2G )
{
return( k2W( v5F->e2Qt, k2G, v5F->k4S ) );
} 
y8Ut m2Y( y8Ut P )
{
return( f1B( P, w6O ) );
} 
y8Ut x7Hk( y8Ut P )
{
return( f1B( P, e4E ) );
} 
y8Ut n3Bi( y8Ut P )
{
return( g6U( P, e4E ) );
} 
y8Ut j9X( y8Ut P )
{
return( g6U( P, w6O ) );
} 
y8Ut v7Z( g8Sh v5F,
y8Or o0M,
y8Ut p )
{
if( !p || k6E( (*(v5F->e2Qt))( o0M, p ) != g8I ) )
return( NULL );
return( Border( v5F, o0M, p, e4E ) );
} 
y8Ut u4A( g8Sh v5F,
y8Or o0M,
y8Ut p )
{
if( !p || k6E( (*(v5F->e2Qt))( o0M, p ) != g8I ) )
return( NULL );
return( Border( v5F, o0M, p, w6O ) );
} 
h3R l3N( g8Sh v5F,
r1Pc p7B,
void *UserData )
{
y8Ut p;
if( !(p = n3Bi( v5F->k4S )) ) return( d5B );
while( p )
{
(*p7B)( p, UserData );
p = m2Y( p );
}
return( z1Zy );
} 
h3R v9Xy( g8Sh v5F,
s8U v9Z )
{
y8Ut p, q;
if( !(v5F) || !(v9Z) )
return( d5B );
p = n3Bi( v5F->k4S );
while( p )
{
q = p;
while( q->e2Q[w6O] )
q = g6U( q->e2Q[w6O], e4E );
p = q->e2Q[i0E];
if( p )
p->e2Q[ ((p->e2Q[e4E] == q)?e4E:w6O) ] = NULL;
(*v9Z)((void *)q);
}
(void)h9Bk( v5F,
v5F->e2Qt,
v5F->flags );
return( z1Zy );
} 
y8Ut t9L( y8Ut r1L )
{
y8Ut o0Ex = NULL;
int b1Jc = e4E;
while( NULL != r1L )
{
o0Ex = r1L;
r1L = o0Ex->e2Q[ b1Jc ];
if( NULL == r1L )
{
b1Jc = h3H( b1Jc );
r1L = o0Ex->e2Q[ b1Jc ];
}
}
return( o0Ex );
} 
int r7F( int u0Qh, char *list[] )
{
if( u0Qh > 0 )
{
list[0] = b9F;
if( u0Qh > 1 )
list[1] = NULL;
return( 1 );
}
return( 0 );
} 
