X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=lib%2Fjsw%2Fjsw_atree.c;h=d73e22afc18898ad80d579f5c61efa0e2ce4075f;hb=09490cd2433e3c37a0d85220b4f12f01e6740d46;hp=36a90a78ca2bac43596265d6908d2b7034732dc5;hpb=94724d7dd33cf19e283d86109adc037c0d771b6d;p=zpackage diff --git a/lib/jsw/jsw_atree.c b/lib/jsw/jsw_atree.c index 36a90a7..d73e22a 100644 --- a/lib/jsw/jsw_atree.c +++ b/lib/jsw/jsw_atree.c @@ -1,3 +1,4 @@ +#define _POSIX_C_SOURCE 200809L /* Andersson tree library @@ -13,9 +14,11 @@ 4) Bug in jsw_aerase: Search for successor should save the path */ -#include "jsw_atree.h" +#include "jsw.h" #include +#include +#include #ifndef HEIGHT_LIMIT #define HEIGHT_LIMIT 64 /* Tallest allowable tree */ @@ -64,6 +67,10 @@ struct jsw_atrav { } \ } while(0) +int jsw_afind_strcmp(const void *a, const void *b) { + return strcmp(a, b); +} + static jsw_anode_t *new_node ( jsw_atree_t *tree, void *data ) { jsw_anode_t *rn = malloc ( sizeof *rn ); @@ -78,6 +85,10 @@ static jsw_anode_t *new_node ( jsw_atree_t *tree, void *data ) return rn; } +jsw_atree_t *jsw_anew_str(void) { + return jsw_anew(jsw_afind_strcmp, (dup_f)strdup, (rel_f)free); +} + jsw_atree_t *jsw_anew ( cmp_f cmp, dup_f dup, rel_f rel ) { jsw_atree_t *rt = malloc ( sizeof *rt ); @@ -106,10 +117,16 @@ jsw_atree_t *jsw_anew ( cmp_f cmp, dup_f dup, rel_f rel ) return rt; } -void jsw_adelete ( jsw_atree_t *tree ) -{ - jsw_anode_t *it = tree->root; - jsw_anode_t *save; +void jsw_adelete(jsw_atree_t *tree) { + jsw_anode_t *it; + jsw_anode_t *save; + + if (!tree) { + return; + } + + it = tree->root; + /* Destruction by rotation */ while ( it != tree->nil ) { @@ -134,12 +151,12 @@ void jsw_adelete ( jsw_atree_t *tree ) free ( tree ); } -void *jsw_afind ( jsw_atree_t *tree, void *data ) -{ +void *jsw_afind ( jsw_atree_t *tree, void *data) { jsw_anode_t *it = tree->root; + int cmp = 0; while ( it != tree->nil ) { - int cmp = tree->cmp ( it->data, data ); + cmp = tree->cmp(it->data, data); if ( cmp == 0 ) break;