]> granicus.if.org Git - graphviz/commitdiff
Remove exits from rbtree
authorEmden Gansner <erg@research.att.com>
Wed, 4 Jan 2012 21:34:05 +0000 (16:34 -0500)
committerEmden Gansner <erg@research.att.com>
Wed, 4 Jan 2012 21:34:05 +0000 (16:34 -0500)
lib/rbtree/misc.c
lib/rbtree/misc.h
lib/rbtree/red_black_tree.c
lib/rbtree/red_black_tree.h

index 0e2ad85223795699368161d24a9ebd2686eba59f..36d0d853c2a700a4d4b89757181a71e3255b9bcb 100755 (executable)
@@ -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);
   }
 }
index 34f063758628815de0d988efdb684f4fd9698a26..be440eeb5bd1537c337ec997668cfb3bb6441e2d 100755 (executable)
@@ -13,6 +13,9 @@ extern "C" {
 #endif
 
 #include <stdlib.h>
+#include <setjmp.h>
+
+extern jmp_buf rb_jbuf;
 
 /*  CONVENTIONS:  All data structures for red-black trees have the prefix */
 /*                "rb_" to prevent name conflicts. */
index dca2fa03411d6fe6532825cb073595cbbfdf4d11..6d1ef929e7509e27a28e943173447152ca055714 100755 (executable)
@@ -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 */
index fcdc644bcd704e5b69a60e9889736535ac186ca6..ba822a56430f8ff649eca5a20dfdfe8d1d1312b7 100755 (executable)
@@ -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;