From e1a3698061d4e4de9fe22055fc90ac3a2ee511db Mon Sep 17 00:00:00 2001 From: Emden Gansner Date: Wed, 4 Jan 2012 16:34:05 -0500 Subject: [PATCH] Remove exits from rbtree --- lib/rbtree/misc.c | 10 +++++----- lib/rbtree/misc.h | 3 +++ lib/rbtree/red_black_tree.c | 17 +++++++++++++++-- lib/rbtree/red_black_tree.h | 2 +- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/lib/rbtree/misc.c b/lib/rbtree/misc.c index 0e2ad8522..36d0d853c 100755 --- a/lib/rbtree/misc.c +++ b/lib/rbtree/misc.c @@ -32,8 +32,8 @@ void Assert(int assertion, char* error) { if(!assertion) { - printf("Assertion Failed: %s\n",error); - exit(-1); + fprintf(stderr, "Assertion Failed: %s\n",error); + longjmp(rb_jbuf, 1); } } @@ -59,9 +59,9 @@ void * SafeMalloc(size_t size) { if ( (result = malloc(size)) ) { /* assignment intentional */ return(result); } else { - printf("memory overflow: malloc failed in SafeMalloc."); - printf(" Exiting Program.\n"); - exit(-1); + fprintf(stderr, "memory overflow: malloc failed in SafeMalloc."); + /* printf(" Exiting Program.\n"); */ + longjmp(rb_jbuf, 2); return(0); } } diff --git a/lib/rbtree/misc.h b/lib/rbtree/misc.h index 34f063758..be440eeb5 100755 --- a/lib/rbtree/misc.h +++ b/lib/rbtree/misc.h @@ -13,6 +13,9 @@ extern "C" { #endif #include +#include + +extern jmp_buf rb_jbuf; /* CONVENTIONS: All data structures for red-black trees have the prefix */ /* "rb_" to prevent name conflicts. */ diff --git a/lib/rbtree/red_black_tree.c b/lib/rbtree/red_black_tree.c index dca2fa034..6d1ef929e 100755 --- a/lib/rbtree/red_black_tree.c +++ b/lib/rbtree/red_black_tree.c @@ -37,10 +37,18 @@ rb_red_blk_tree* RBTreeCreate( int (*CompFunc) (const void*,const void*), void (*InfoDestFunc) (void*), void (*PrintFunc) (const void*), void (*PrintInfo)(void*)) { - rb_red_blk_tree* newTree; + rb_red_blk_tree* newTree = NULL; rb_red_blk_node* temp; + if (setjmp(rb_jbuf)) { + if (newTree) { + if (newTree->nil) free (newTree->nil); + free (newTree); + } + return NULL; + } newTree=(rb_red_blk_tree*) SafeMalloc(sizeof(rb_red_blk_tree)); + newTree->nil = newTree->root = NULL; newTree->Compare= CompFunc; newTree->DestroyKey= DestFunc; newTree->PrintKey= PrintFunc; @@ -238,6 +246,8 @@ rb_red_blk_node * RBTreeInsert(rb_red_blk_tree* tree, void* key, void* info) { rb_red_blk_node * x; rb_red_blk_node * newNode; + if (setjmp(rb_jbuf)) + return NULL; x=(rb_red_blk_node*) SafeMalloc(sizeof(rb_red_blk_node)); x->key=key; x->info=info; @@ -643,7 +653,7 @@ void RBDelete(rb_red_blk_tree* tree, rb_red_blk_node* z){ /***********************************************************************/ -/* FUNCTION: RBDEnumerate */ +/* FUNCTION: RBEnumerate */ /**/ /* INPUTS: tree is the tree to look for keys >= low */ /* and <= high with respect to the Compare function */ @@ -659,6 +669,9 @@ stk_stack* RBEnumerate(rb_red_blk_tree* tree, void* low, void* high) { rb_red_blk_node* x=tree->root->left; rb_red_blk_node* lastBest=nil; + if (setjmp(rb_jbuf)) { + return NULL; + } enumResultStack=StackCreate(); while(nil != x) { if ( 1 == (tree->Compare(x->key,high)) ) { /* x->key > high */ diff --git a/lib/rbtree/red_black_tree.h b/lib/rbtree/red_black_tree.h index fcdc644bc..ba822a564 100755 --- a/lib/rbtree/red_black_tree.h +++ b/lib/rbtree/red_black_tree.h @@ -35,7 +35,7 @@ extern "C" { /* comment out the line below to remove all the debugging assertion */ /* checks from the compiled code. */ -#define DEBUG_ASSERT 1 +/* #define DEBUG_ASSERT 1 */ typedef struct rb_red_blk_node { void* key; -- 2.49.0