diff options
| author | hasso <hasso> | 2004-09-10 20:48:21 +0000 | 
|---|---|---|
| committer | hasso <hasso> | 2004-09-10 20:48:21 +0000 | 
| commit | f390d2c7839c04100e4de8246215ce10ea96b653 (patch) | |
| tree | 9910d250bfb6605d44e7104ef786ba0c84ddb01a /isisd/dict.c | |
| parent | f3f27f60fdfc81fce2944ee89087417b04935663 (diff) | |
Indentation only. No any functional changes.
Diffstat (limited to 'isisd/dict.c')
| -rw-r--r-- | isisd/dict.c | 2090 | 
1 files changed, 1137 insertions, 953 deletions
| diff --git a/isisd/dict.c b/isisd/dict.c index 4c787ac5..86206a3b 100644 --- a/isisd/dict.c +++ b/isisd/dict.c @@ -14,7 +14,7 @@   * into proprietary software; there is no requirement for such software to   * contain a copyright notice related to this source.   * - * $Id: dict.c,v 1.1 2003/12/23 08:09:47 jardin Exp $ + * $Id: dict.c,v 1.2 2004/09/10 20:48:21 hasso Exp $   * $Name:  $   */ @@ -25,7 +25,8 @@  #include "dict.h"  #ifdef KAZLIB_RCSID -static const char rcsid[] = "$Id: dict.c,v 1.1 2003/12/23 08:09:47 jardin Exp $"; +static const char rcsid[] = +  "$Id: dict.c,v 1.2 2004/09/10 20:48:21 hasso Exp $";  #endif  /* @@ -62,8 +63,8 @@ static const char rcsid[] = "$Id: dict.c,v 1.1 2003/12/23 08:09:47 jardin Exp $"  #define dict_nil(D) (&(D)->nilnode)  #define DICT_DEPTH_MAX 64 -static dnode_t *dnode_alloc(void *context); -static void dnode_free(dnode_t *node, void *context); +static dnode_t *dnode_alloc (void *context); +static void dnode_free (dnode_t * node, void *context);  /*   * Perform a ``left rotation'' adjustment on the tree.  The given node P and @@ -72,28 +73,32 @@ static void dnode_free(dnode_t *node, void *context);   * for P.  The ordering of the keys within the tree is thus preserved.   */ -static void rotate_left(dnode_t *upper) +static void +rotate_left (dnode_t * upper)  { -    dnode_t *lower, *lowleft, *upparent; +  dnode_t *lower, *lowleft, *upparent; -    lower = upper->right; -    upper->right = lowleft = lower->left; -    lowleft->parent = upper; +  lower = upper->right; +  upper->right = lowleft = lower->left; +  lowleft->parent = upper; -    lower->parent = upparent = upper->parent; +  lower->parent = upparent = upper->parent; -    /* don't need to check for root node here because root->parent is -       the sentinel nil node, and root->parent->left points back to root */ +  /* don't need to check for root node here because root->parent is +     the sentinel nil node, and root->parent->left points back to root */ -    if (upper == upparent->left) { -	upparent->left = lower; -    } else { -	assert (upper == upparent->right); -	upparent->right = lower; +  if (upper == upparent->left) +    { +      upparent->left = lower; +    } +  else +    { +      assert (upper == upparent->right); +      upparent->right = lower;      } -    lower->left = upper; -    upper->parent = lower; +  lower->left = upper; +  upper->parent = lower;  }  /* @@ -101,25 +106,29 @@ static void rotate_left(dnode_t *upper)   * the same procedure, but with left and right interchanged.   */ -static void rotate_right(dnode_t *upper) +static void +rotate_right (dnode_t * upper)  { -    dnode_t *lower, *lowright, *upparent; +  dnode_t *lower, *lowright, *upparent; -    lower = upper->left; -    upper->left = lowright = lower->right; -    lowright->parent = upper; +  lower = upper->left; +  upper->left = lowright = lower->right; +  lowright->parent = upper; -    lower->parent = upparent = upper->parent; +  lower->parent = upparent = upper->parent; -    if (upper == upparent->right) { -	upparent->right = lower; -    } else { -	assert (upper == upparent->left); -	upparent->left = lower; +  if (upper == upparent->right) +    { +      upparent->right = lower; +    } +  else +    { +      assert (upper == upparent->left); +      upparent->left = lower;      } -    lower->right = upper; -    upper->parent = lower; +  lower->right = upper; +  upper->parent = lower;  }  /* @@ -127,13 +136,14 @@ static void rotate_right(dnode_t *upper)   * node and free everything under it.  Used by dict_free().   */ -static void free_nodes(dict_t *dict, dnode_t *node, dnode_t *nil) +static void +free_nodes (dict_t * dict, dnode_t * node, dnode_t * nil)  { -    if (node == nil) -	return; -    free_nodes(dict, node->left, nil); -    free_nodes(dict, node->right, nil); -    dict->freenode(node, dict->context); +  if (node == nil) +    return; +  free_nodes (dict, node->left, nil); +  free_nodes (dict, node->right, nil); +  dict->freenode (node, dict->context);  }  /* @@ -145,26 +155,32 @@ static void free_nodes(dict_t *dict, dnode_t *node, dnode_t *nil)   * debugging purposes.    */ -static int verify_bintree(dict_t *dict) +static int +verify_bintree (dict_t * dict)  { -    dnode_t *first, *next; +  dnode_t *first, *next; -    first = dict_first(dict); +  first = dict_first (dict); -    if (dict->dupes) { -	while (first && (next = dict_next(dict, first))) { -	    if (dict->compare(first->key, next->key) > 0) -		return 0; -	    first = next; +  if (dict->dupes) +    { +      while (first && (next = dict_next (dict, first))) +	{ +	  if (dict->compare (first->key, next->key) > 0) +	    return 0; +	  first = next;  	} -    } else { -	while (first && (next = dict_next(dict, first))) { -	    if (dict->compare(first->key, next->key) >= 0) -		return 0; -	    first = next; +    } +  else +    { +      while (first && (next = dict_next (dict, first))) +	{ +	  if (dict->compare (first->key, next->key) >= 0) +	    return 0; +	  first = next;  	}      } -    return 1; +  return 1;  } @@ -181,29 +197,32 @@ static int verify_bintree(dict_t *dict)   * subtree is not red-black.   */ -static unsigned int verify_redblack(dnode_t *nil, dnode_t *root) +static unsigned int +verify_redblack (dnode_t * nil, dnode_t * root)  { -    unsigned height_left, height_right; +  unsigned height_left, height_right; -    if (root != nil) { -	height_left = verify_redblack(nil, root->left); -	height_right = verify_redblack(nil, root->right); -	if (height_left == 0 || height_right == 0) +  if (root != nil) +    { +      height_left = verify_redblack (nil, root->left); +      height_right = verify_redblack (nil, root->right); +      if (height_left == 0 || height_right == 0) +	return 0; +      if (height_left != height_right) +	return 0; +      if (root->color == dnode_red) +	{ +	  if (root->left->color != dnode_black)  	    return 0; -	if (height_left != height_right) +	  if (root->right->color != dnode_black)  	    return 0; -	if (root->color == dnode_red) { -	    if (root->left->color != dnode_black) -		return 0; -	    if (root->right->color != dnode_black) -		return 0; -	    return height_left; +	  return height_left;  	} -	if (root->color != dnode_black) -	    return 0; -	return height_left + 1; -    }  -    return 1; +      if (root->color != dnode_black) +	return 0; +      return height_left + 1; +    } +  return 1;  }  /* @@ -212,13 +231,14 @@ static unsigned int verify_redblack(dnode_t *nil, dnode_t *root)   * detect a mismatch.   */ -static dictcount_t verify_node_count(dnode_t *nil, dnode_t *root) +static dictcount_t +verify_node_count (dnode_t * nil, dnode_t * root)  { -    if (root == nil) -	return 0; -    else -	return 1 + verify_node_count(nil, root->left) -	    + verify_node_count(nil, root->right); +  if (root == nil) +    return 0; +  else +    return 1 + verify_node_count (nil, root->left) +      + verify_node_count (nil, root->right);  }  /* @@ -228,54 +248,58 @@ static dictcount_t verify_node_count(dnode_t *nil, dnode_t *root)   * returns zero. It is intended for debugging purposes.   */ -static int verify_dict_has_node(dnode_t *nil, dnode_t *root, dnode_t *node) +static int +verify_dict_has_node (dnode_t * nil, dnode_t * root, dnode_t * node)  { -    if (root != nil) { -	return root == node -		|| verify_dict_has_node(nil, root->left, node) -		|| verify_dict_has_node(nil, root->right, node); +  if (root != nil) +    { +      return root == node +	|| verify_dict_has_node (nil, root->left, node) +	|| verify_dict_has_node (nil, root->right, node);      } -    return 0; +  return 0;  } -  /*   * Dynamically allocate and initialize a dictionary object.   */ -dict_t *dict_create(dictcount_t maxcount, dict_comp_t comp) +dict_t * +dict_create (dictcount_t maxcount, dict_comp_t comp)  { -    dict_t *new = malloc(sizeof *new); - -    if (new) { -	new->compare = comp; -	new->allocnode = dnode_alloc; -	new->freenode = dnode_free; -	new->context = NULL; -	new->nodecount = 0; -	new->maxcount = maxcount; -	new->nilnode.left = &new->nilnode; -	new->nilnode.right = &new->nilnode; -	new->nilnode.parent = &new->nilnode; -	new->nilnode.color = dnode_black; -	new->dupes = 0; +  dict_t *new = malloc (sizeof *new); + +  if (new) +    { +      new->compare = comp; +      new->allocnode = dnode_alloc; +      new->freenode = dnode_free; +      new->context = NULL; +      new->nodecount = 0; +      new->maxcount = maxcount; +      new->nilnode.left = &new->nilnode; +      new->nilnode.right = &new->nilnode; +      new->nilnode.parent = &new->nilnode; +      new->nilnode.color = dnode_black; +      new->dupes = 0;      } -    return new; +  return new;  }  /*   * Select a different set of node allocator routines.   */ -void dict_set_allocator(dict_t *dict, dnode_alloc_t al, -	dnode_free_t fr, void *context) +void +dict_set_allocator (dict_t * dict, dnode_alloc_t al, +		    dnode_free_t fr, void *context)  { -    assert (dict_count(dict) == 0); -    assert ((al == NULL && fr == NULL) || (al != NULL && fr != NULL)); +  assert (dict_count (dict) == 0); +  assert ((al == NULL && fr == NULL) || (al != NULL && fr != NULL)); -    dict->allocnode = al ? al : dnode_alloc; -    dict->freenode = fr ? fr : dnode_free; -    dict->context = context; +  dict->allocnode = al ? al : dnode_alloc; +  dict->freenode = fr ? fr : dnode_free; +  dict->context = context;  }  /* @@ -283,10 +307,11 @@ void dict_set_allocator(dict_t *dict, dnode_alloc_t al,   * from the tree before deleting it is required.   */ -void dict_destroy(dict_t *dict) +void +dict_destroy (dict_t * dict)  { -    assert (dict_isempty(dict)); -    free(dict); +  assert (dict_isempty (dict)); +  free (dict);  }  /* @@ -294,112 +319,117 @@ void dict_destroy(dict_t *dict)   * installed free routine. The dictionary is emptied.   */ -void dict_free_nodes(dict_t *dict) +void +dict_free_nodes (dict_t * dict)  { -    dnode_t *nil = dict_nil(dict), *root = dict_root(dict); -    free_nodes(dict, root, nil); -    dict->nodecount = 0; -    dict->nilnode.left = &dict->nilnode; -    dict->nilnode.right = &dict->nilnode; +  dnode_t *nil = dict_nil (dict), *root = dict_root (dict); +  free_nodes (dict, root, nil); +  dict->nodecount = 0; +  dict->nilnode.left = &dict->nilnode; +  dict->nilnode.right = &dict->nilnode;  }  /*   * Obsolescent function, equivalent to dict_free_nodes   */ -void dict_free(dict_t *dict) +void +dict_free (dict_t * dict)  {  #ifdef KAZLIB_OBSOLESCENT_DEBUG -    assert ("call to obsolescent function dict_free()" && 0); +  assert ("call to obsolescent function dict_free()" && 0);  #endif -    dict_free_nodes(dict); +  dict_free_nodes (dict);  }  /*   * Initialize a user-supplied dictionary object.   */ -dict_t *dict_init(dict_t *dict, dictcount_t maxcount, dict_comp_t comp) +dict_t * +dict_init (dict_t * dict, dictcount_t maxcount, dict_comp_t comp)  { -    dict->compare = comp; -    dict->allocnode = dnode_alloc; -    dict->freenode = dnode_free; -    dict->context = NULL; -    dict->nodecount = 0; -    dict->maxcount = maxcount; -    dict->nilnode.left = &dict->nilnode; -    dict->nilnode.right = &dict->nilnode; -    dict->nilnode.parent = &dict->nilnode; -    dict->nilnode.color = dnode_black; -    dict->dupes = 0; -    return dict; +  dict->compare = comp; +  dict->allocnode = dnode_alloc; +  dict->freenode = dnode_free; +  dict->context = NULL; +  dict->nodecount = 0; +  dict->maxcount = maxcount; +  dict->nilnode.left = &dict->nilnode; +  dict->nilnode.right = &dict->nilnode; +  dict->nilnode.parent = &dict->nilnode; +  dict->nilnode.color = dnode_black; +  dict->dupes = 0; +  return dict;  }  /*    * Initialize a dictionary in the likeness of another dictionary   */ -void dict_init_like(dict_t *dict, const dict_t *template) +void +dict_init_like (dict_t * dict, const dict_t * template)  { -    dict->compare = template->compare; -    dict->allocnode = template->allocnode; -    dict->freenode = template->freenode; -    dict->context = template->context; -    dict->nodecount = 0; -    dict->maxcount = template->maxcount; -    dict->nilnode.left = &dict->nilnode; -    dict->nilnode.right = &dict->nilnode; -    dict->nilnode.parent = &dict->nilnode; -    dict->nilnode.color = dnode_black; -    dict->dupes = template->dupes; - -    assert (dict_similar(dict, template)); +  dict->compare = template->compare; +  dict->allocnode = template->allocnode; +  dict->freenode = template->freenode; +  dict->context = template->context; +  dict->nodecount = 0; +  dict->maxcount = template->maxcount; +  dict->nilnode.left = &dict->nilnode; +  dict->nilnode.right = &dict->nilnode; +  dict->nilnode.parent = &dict->nilnode; +  dict->nilnode.color = dnode_black; +  dict->dupes = template->dupes; + +  assert (dict_similar (dict, template));  }  /*   * Remove all nodes from the dictionary (without freeing them in any way).   */ -static void dict_clear(dict_t *dict) +static void +dict_clear (dict_t * dict)  { -    dict->nodecount = 0; -    dict->nilnode.left = &dict->nilnode; -    dict->nilnode.right = &dict->nilnode; -    dict->nilnode.parent = &dict->nilnode; -    assert (dict->nilnode.color == dnode_black); +  dict->nodecount = 0; +  dict->nilnode.left = &dict->nilnode; +  dict->nilnode.right = &dict->nilnode; +  dict->nilnode.parent = &dict->nilnode; +  assert (dict->nilnode.color == dnode_black);  } -  /*   * Verify the integrity of the dictionary structure.  This is provided for   * debugging purposes, and should be placed in assert statements.   Just because   * this function succeeds doesn't mean that the tree is not corrupt. Certain   * corruptions in the tree may simply cause undefined behavior. - */  + */ -int dict_verify(dict_t *dict) +int +dict_verify (dict_t * dict)  { -    dnode_t *nil = dict_nil(dict), *root = dict_root(dict); +  dnode_t *nil = dict_nil (dict), *root = dict_root (dict); -    /* check that the sentinel node and root node are black */ -    if (root->color != dnode_black) -	return 0; -    if (nil->color != dnode_black) -	return 0; -    if (nil->right != nil) -	return 0; -    /* nil->left is the root node; check that its parent pointer is nil */ -    if (nil->left->parent != nil) -	return 0; -    /* perform a weak test that the tree is a binary search tree */ -    if (!verify_bintree(dict)) -	return 0; -    /* verify that the tree is a red-black tree */ -    if (!verify_redblack(nil, root)) -	return 0; -    if (verify_node_count(nil, root) != dict_count(dict)) -	return 0; -    return 1; +  /* check that the sentinel node and root node are black */ +  if (root->color != dnode_black) +    return 0; +  if (nil->color != dnode_black) +    return 0; +  if (nil->right != nil) +    return 0; +  /* nil->left is the root node; check that its parent pointer is nil */ +  if (nil->left->parent != nil) +    return 0; +  /* perform a weak test that the tree is a binary search tree */ +  if (!verify_bintree (dict)) +    return 0; +  /* verify that the tree is a red-black tree */ +  if (!verify_redblack (nil, root)) +    return 0; +  if (verify_node_count (nil, root) != dict_count (dict)) +    return 0; +  return 1;  }  /* @@ -407,24 +437,25 @@ int dict_verify(dict_t *dict)   * allocator functions, and same status as to whether duplicates are allowed.   */ -int dict_similar(const dict_t *left, const dict_t *right) +int +dict_similar (const dict_t * left, const dict_t * right)  { -    if (left->compare != right->compare) -	return 0; +  if (left->compare != right->compare) +    return 0; -    if (left->allocnode != right->allocnode) -	return 0; +  if (left->allocnode != right->allocnode) +    return 0; -    if (left->freenode != right->freenode) -	return 0; +  if (left->freenode != right->freenode) +    return 0; -    if (left->context != right->context) -	return 0; +  if (left->context != right->context) +    return 0; -    if (left->dupes != right->dupes) -	return 0; +  if (left->dupes != right->dupes) +    return 0; -    return 1; +  return 1;  }  /* @@ -434,37 +465,45 @@ int dict_similar(const dict_t *left, const dict_t *right)   * located node is returned.   */ -dnode_t *dict_lookup(dict_t *dict, const void *key) +dnode_t * +dict_lookup (dict_t * dict, const void *key)  { -    dnode_t *root = dict_root(dict); -    dnode_t *nil = dict_nil(dict); -    dnode_t *saved; -    int result; - -    /* simple binary search adapted for trees that contain duplicate keys */ - -    while (root != nil) { -	result = dict->compare(key, root->key); -	if (result < 0) -	    root = root->left; -	else if (result > 0) -	    root = root->right; -	else { -	    if (!dict->dupes) {	/* no duplicates, return match		*/ -		return root; -	    } else {		/* could be dupes, find leftmost one	*/ -		do { -		    saved = root; -		    root = root->left; -		    while (root != nil && dict->compare(key, root->key)) -			root = root->right; -		} while (root != nil); -		return saved; +  dnode_t *root = dict_root (dict); +  dnode_t *nil = dict_nil (dict); +  dnode_t *saved; +  int result; + +  /* simple binary search adapted for trees that contain duplicate keys */ + +  while (root != nil) +    { +      result = dict->compare (key, root->key); +      if (result < 0) +	root = root->left; +      else if (result > 0) +	root = root->right; +      else +	{ +	  if (!dict->dupes) +	    {			/* no duplicates, return match          */ +	      return root; +	    } +	  else +	    {			/* could be dupes, find leftmost one    */ +	      do +		{ +		  saved = root; +		  root = root->left; +		  while (root != nil && dict->compare (key, root->key)) +		    root = root->right; +		} +	      while (root != nil); +	      return saved;  	    }  	}      } -    return NULL; +  return NULL;  }  /* @@ -472,31 +511,41 @@ dnode_t *dict_lookup(dict_t *dict, const void *key)   * greater than the given key.  If there is no such node, return null.   */ -dnode_t *dict_lower_bound(dict_t *dict, const void *key) +dnode_t * +dict_lower_bound (dict_t * dict, const void *key)  { -    dnode_t *root = dict_root(dict); -    dnode_t *nil = dict_nil(dict); -    dnode_t *tentative = 0; - -    while (root != nil) { -	int result = dict->compare(key, root->key); - -	if (result > 0) { -	    root = root->right; -	} else if (result < 0) { -	    tentative = root; -	    root = root->left; -	} else { -	    if (!dict->dupes) { -	    	return root; -	    } else { -		tentative = root; -		root = root->left; +  dnode_t *root = dict_root (dict); +  dnode_t *nil = dict_nil (dict); +  dnode_t *tentative = 0; + +  while (root != nil) +    { +      int result = dict->compare (key, root->key); + +      if (result > 0) +	{ +	  root = root->right; +	} +      else if (result < 0) +	{ +	  tentative = root; +	  root = root->left; +	} +      else +	{ +	  if (!dict->dupes) +	    { +	      return root;  	    } -	}  +	  else +	    { +	      tentative = root; +	      root = root->left; +	    } +	}      } -     -    return tentative; + +  return tentative;  }  /* @@ -504,31 +553,41 @@ dnode_t *dict_lower_bound(dict_t *dict, const void *key)   * lower than the given key.  If there is no such node, return null.   */ -dnode_t *dict_upper_bound(dict_t *dict, const void *key) +dnode_t * +dict_upper_bound (dict_t * dict, const void *key)  { -    dnode_t *root = dict_root(dict); -    dnode_t *nil = dict_nil(dict); -    dnode_t *tentative = 0; - -    while (root != nil) { -	int result = dict->compare(key, root->key); - -	if (result < 0) { -	    root = root->left; -	} else if (result > 0) { -	    tentative = root; -	    root = root->right; -	} else { -	    if (!dict->dupes) { -	    	return root; -	    } else { -		tentative = root; -		root = root->right; +  dnode_t *root = dict_root (dict); +  dnode_t *nil = dict_nil (dict); +  dnode_t *tentative = 0; + +  while (root != nil) +    { +      int result = dict->compare (key, root->key); + +      if (result < 0) +	{ +	  root = root->left; +	} +      else if (result > 0) +	{ +	  tentative = root; +	  root = root->right; +	} +      else +	{ +	  if (!dict->dupes) +	    { +	      return root; +	    } +	  else +	    { +	      tentative = root; +	      root = root->right;  	    } -	}  +	}      } -     -    return tentative; + +  return tentative;  }  /* @@ -539,95 +598,109 @@ dnode_t *dict_upper_bound(dict_t *dict, const void *key)   * function returns true).   */ -void dict_insert(dict_t *dict, dnode_t *node, const void *key) +void +dict_insert (dict_t * dict, dnode_t * node, const void *key)  { -    dnode_t *where = dict_root(dict), *nil = dict_nil(dict); -    dnode_t *parent = nil, *uncle, *grandpa; -    int result = -1; - -    node->key = key; - -    assert (!dict_isfull(dict)); -    assert (!dict_contains(dict, node)); -    assert (!dnode_is_in_a_dict(node)); - -    /* basic binary tree insert */ - -    while (where != nil) { -	parent = where; -	result = dict->compare(key, where->key); -	/* trap attempts at duplicate key insertion unless it's explicitly allowed */ -	assert (dict->dupes || result != 0); -	if (result < 0) -	    where = where->left; -	else -	    where = where->right; +  dnode_t *where = dict_root (dict), *nil = dict_nil (dict); +  dnode_t *parent = nil, *uncle, *grandpa; +  int result = -1; + +  node->key = key; + +  assert (!dict_isfull (dict)); +  assert (!dict_contains (dict, node)); +  assert (!dnode_is_in_a_dict (node)); + +  /* basic binary tree insert */ + +  while (where != nil) +    { +      parent = where; +      result = dict->compare (key, where->key); +      /* trap attempts at duplicate key insertion unless it's explicitly allowed */ +      assert (dict->dupes || result != 0); +      if (result < 0) +	where = where->left; +      else +	where = where->right;      } -    assert (where == nil); - -    if (result < 0) -	parent->left = node; -    else -	parent->right = node; - -    node->parent = parent; -    node->left = nil; -    node->right = nil; - -    dict->nodecount++; - -    /* red black adjustments */ - -    node->color = dnode_red; - -    while (parent->color == dnode_red) { -	grandpa = parent->parent; -	if (parent == grandpa->left) { -	    uncle = grandpa->right; -	    if (uncle->color == dnode_red) {	/* red parent, red uncle */ -		parent->color = dnode_black; -		uncle->color = dnode_black; -		grandpa->color = dnode_red; -		node = grandpa; -		parent = grandpa->parent; -	    } else {				/* red parent, black uncle */ -	    	if (node == parent->right) { -		    rotate_left(parent); -		    parent = node; -		    assert (grandpa == parent->parent); -		    /* rotation between parent and child preserves grandpa */ +  assert (where == nil); + +  if (result < 0) +    parent->left = node; +  else +    parent->right = node; + +  node->parent = parent; +  node->left = nil; +  node->right = nil; + +  dict->nodecount++; + +  /* red black adjustments */ + +  node->color = dnode_red; + +  while (parent->color == dnode_red) +    { +      grandpa = parent->parent; +      if (parent == grandpa->left) +	{ +	  uncle = grandpa->right; +	  if (uncle->color == dnode_red) +	    {			/* red parent, red uncle */ +	      parent->color = dnode_black; +	      uncle->color = dnode_black; +	      grandpa->color = dnode_red; +	      node = grandpa; +	      parent = grandpa->parent; +	    } +	  else +	    {			/* red parent, black uncle */ +	      if (node == parent->right) +		{ +		  rotate_left (parent); +		  parent = node; +		  assert (grandpa == parent->parent); +		  /* rotation between parent and child preserves grandpa */  		} -		parent->color = dnode_black; -		grandpa->color = dnode_red; -		rotate_right(grandpa); -		break; +	      parent->color = dnode_black; +	      grandpa->color = dnode_red; +	      rotate_right (grandpa); +	      break; +	    } +	} +      else +	{			/* symmetric cases: parent == parent->parent->right */ +	  uncle = grandpa->left; +	  if (uncle->color == dnode_red) +	    { +	      parent->color = dnode_black; +	      uncle->color = dnode_black; +	      grandpa->color = dnode_red; +	      node = grandpa; +	      parent = grandpa->parent;  	    } -	} else { 	/* symmetric cases: parent == parent->parent->right */ -	    uncle = grandpa->left; -	    if (uncle->color == dnode_red) { -		parent->color = dnode_black; -		uncle->color = dnode_black; -		grandpa->color = dnode_red; -		node = grandpa; -		parent = grandpa->parent; -	    } else { -	    	if (node == parent->left) { -		    rotate_right(parent); -		    parent = node; -		    assert (grandpa == parent->parent); +	  else +	    { +	      if (node == parent->left) +		{ +		  rotate_right (parent); +		  parent = node; +		  assert (grandpa == parent->parent);  		} -		parent->color = dnode_black; -		grandpa->color = dnode_red; -		rotate_left(grandpa); -		break; +	      parent->color = dnode_black; +	      grandpa->color = dnode_red; +	      rotate_left (grandpa); +	      break;  	    }  	}      } -    dict_root(dict)->color = dnode_black; +  dict_root (dict)->color = dnode_black; -    assert (dict_verify(dict)); +  assert (dict_verify (dict));  }  /* @@ -636,173 +709,201 @@ void dict_insert(dict_t *dict, dnode_t *node, const void *key)   * deleted node is returned.   */ -dnode_t *dict_delete(dict_t *dict, dnode_t *delete) +dnode_t * +dict_delete (dict_t * dict, dnode_t * delete)  { -    dnode_t *nil = dict_nil(dict), *child, *delparent = delete->parent; - -    /* basic deletion */ - -    assert (!dict_isempty(dict)); -    assert (dict_contains(dict, delete)); - -    /* -     * If the node being deleted has two children, then we replace it with its -     * successor (i.e. the leftmost node in the right subtree.) By doing this, -     * we avoid the traditional algorithm under which the successor's key and -     * value *only* move to the deleted node and the successor is spliced out -     * from the tree. We cannot use this approach because the user may hold -     * pointers to the successor, or nodes may be inextricably tied to some -     * other structures by way of embedding, etc. So we must splice out the -     * node we are given, not some other node, and must not move contents from -     * one node to another behind the user's back. -     */ - -    if (delete->left != nil && delete->right != nil) { -	dnode_t *next = dict_next(dict, delete); -	dnode_t *nextparent = next->parent; -	dnode_color_t nextcolor = next->color; - -	assert (next != nil); -	assert (next->parent != nil); -	assert (next->left == nil); - -	/* -	 * First, splice out the successor from the tree completely, by -	 * moving up its right child into its place. -	 */ - -	child = next->right; -	child->parent = nextparent; - -	if (nextparent->left == next) { -	    nextparent->left = child; -	} else { -	    assert (nextparent->right == next); -	    nextparent->right = child; +  dnode_t *nil = dict_nil (dict), *child, *delparent = delete->parent; + +  /* basic deletion */ + +  assert (!dict_isempty (dict)); +  assert (dict_contains (dict, delete)); + +  /* +   * If the node being deleted has two children, then we replace it with its +   * successor (i.e. the leftmost node in the right subtree.) By doing this, +   * we avoid the traditional algorithm under which the successor's key and +   * value *only* move to the deleted node and the successor is spliced out +   * from the tree. We cannot use this approach because the user may hold +   * pointers to the successor, or nodes may be inextricably tied to some +   * other structures by way of embedding, etc. So we must splice out the +   * node we are given, not some other node, and must not move contents from +   * one node to another behind the user's back. +   */ + +  if (delete->left != nil && delete->right != nil) +    { +      dnode_t *next = dict_next (dict, delete); +      dnode_t *nextparent = next->parent; +      dnode_color_t nextcolor = next->color; + +      assert (next != nil); +      assert (next->parent != nil); +      assert (next->left == nil); + +      /* +       * First, splice out the successor from the tree completely, by +       * moving up its right child into its place. +       */ + +      child = next->right; +      child->parent = nextparent; + +      if (nextparent->left == next) +	{ +	  nextparent->left = child;  	} +      else +	{ +	  assert (nextparent->right == next); +	  nextparent->right = child; +	} + +      /* +       * Now that the successor has been extricated from the tree, install it +       * in place of the node that we want deleted. +       */ -	/* -	 * Now that the successor has been extricated from the tree, install it -	 * in place of the node that we want deleted. -	 */ - -	next->parent = delparent; -	next->left = delete->left; -	next->right = delete->right; -	next->left->parent = next; -	next->right->parent = next; -	next->color = delete->color; -	delete->color = nextcolor; - -	if (delparent->left == delete) { -	    delparent->left = next; -	} else { -	    assert (delparent->right == delete); -	    delparent->right = next; +      next->parent = delparent; +      next->left = delete->left; +      next->right = delete->right; +      next->left->parent = next; +      next->right->parent = next; +      next->color = delete->color; +      delete->color = nextcolor; + +      if (delparent->left == delete) +	{ +	  delparent->left = next; +	} +      else +	{ +	  assert (delparent->right == delete); +	  delparent->right = next;  	} -    } else { -	assert (delete != nil); -	assert (delete->left == nil || delete->right == nil); +    } +  else +    { +      assert (delete != nil); +      assert (delete->left == nil || delete->right == nil); -	child = (delete->left != nil) ? delete->left : delete->right; +      child = (delete->left != nil) ? delete->left : delete->right; -	child->parent = delparent = delete->parent;	     +      child->parent = delparent = delete->parent; -	if (delete == delparent->left) { -	    delparent->left = child;     -	} else { -	    assert (delete == delparent->right); -	    delparent->right = child; +      if (delete == delparent->left) +	{ +	  delparent->left = child; +	} +      else +	{ +	  assert (delete == delparent->right); +	  delparent->right = child;  	}      } -    delete->parent = NULL; -    delete->right = NULL; -    delete->left = NULL; +  delete->parent = NULL; +  delete->right = NULL; +  delete->left = NULL; -    dict->nodecount--; +  dict->nodecount--; -    assert (verify_bintree(dict)); +  assert (verify_bintree (dict)); -    /* red-black adjustments */ +  /* red-black adjustments */ -    if (delete->color == dnode_black) { -	dnode_t *parent, *sister; +  if (delete->color == dnode_black) +    { +      dnode_t *parent, *sister; -	dict_root(dict)->color = dnode_red; +      dict_root (dict)->color = dnode_red; -	while (child->color == dnode_black) { -	    parent = child->parent; -	    if (child == parent->left) { -		sister = parent->right; -		assert (sister != nil); -		if (sister->color == dnode_red) { -		    sister->color = dnode_black; -		    parent->color = dnode_red; -		    rotate_left(parent); -		    sister = parent->right; -		    assert (sister != nil); +      while (child->color == dnode_black) +	{ +	  parent = child->parent; +	  if (child == parent->left) +	    { +	      sister = parent->right; +	      assert (sister != nil); +	      if (sister->color == dnode_red) +		{ +		  sister->color = dnode_black; +		  parent->color = dnode_red; +		  rotate_left (parent); +		  sister = parent->right; +		  assert (sister != nil); +		} +	      if (sister->left->color == dnode_black +		  && sister->right->color == dnode_black) +		{ +		  sister->color = dnode_red; +		  child = parent;  		} -		if (sister->left->color == dnode_black -			&& sister->right->color == dnode_black) { -		    sister->color = dnode_red; -		    child = parent; -		} else { -		    if (sister->right->color == dnode_black) { -			assert (sister->left->color == dnode_red); -			sister->left->color = dnode_black; -			sister->color = dnode_red; -			rotate_right(sister); -			sister = parent->right; -			assert (sister != nil); +	      else +		{ +		  if (sister->right->color == dnode_black) +		    { +		      assert (sister->left->color == dnode_red); +		      sister->left->color = dnode_black; +		      sister->color = dnode_red; +		      rotate_right (sister); +		      sister = parent->right; +		      assert (sister != nil);  		    } -		    sister->color = parent->color; -		    sister->right->color = dnode_black; -		    parent->color = dnode_black; -		    rotate_left(parent); -		    break; +		  sister->color = parent->color; +		  sister->right->color = dnode_black; +		  parent->color = dnode_black; +		  rotate_left (parent); +		  break;  		} -	    } else {	/* symmetric case: child == child->parent->right */ -		assert (child == parent->right); -		sister = parent->left; -		assert (sister != nil); -		if (sister->color == dnode_red) { -		    sister->color = dnode_black; -		    parent->color = dnode_red; -		    rotate_right(parent); -		    sister = parent->left; -		    assert (sister != nil); +	    } +	  else +	    {			/* symmetric case: child == child->parent->right */ +	      assert (child == parent->right); +	      sister = parent->left; +	      assert (sister != nil); +	      if (sister->color == dnode_red) +		{ +		  sister->color = dnode_black; +		  parent->color = dnode_red; +		  rotate_right (parent); +		  sister = parent->left; +		  assert (sister != nil); +		} +	      if (sister->right->color == dnode_black +		  && sister->left->color == dnode_black) +		{ +		  sister->color = dnode_red; +		  child = parent;  		} -		if (sister->right->color == dnode_black -			&& sister->left->color == dnode_black) { -		    sister->color = dnode_red; -		    child = parent; -		} else { -		    if (sister->left->color == dnode_black) { -			assert (sister->right->color == dnode_red); -			sister->right->color = dnode_black; -			sister->color = dnode_red; -			rotate_left(sister); -			sister = parent->left; -			assert (sister != nil); +	      else +		{ +		  if (sister->left->color == dnode_black) +		    { +		      assert (sister->right->color == dnode_red); +		      sister->right->color = dnode_black; +		      sister->color = dnode_red; +		      rotate_left (sister); +		      sister = parent->left; +		      assert (sister != nil);  		    } -		    sister->color = parent->color; -		    sister->left->color = dnode_black; -		    parent->color = dnode_black; -		    rotate_right(parent); -		    break; +		  sister->color = parent->color; +		  sister->left->color = dnode_black; +		  parent->color = dnode_black; +		  rotate_right (parent); +		  break;  		}  	    }  	} -	child->color = dnode_black; -	dict_root(dict)->color = dnode_black; +      child->color = dnode_black; +      dict_root (dict)->color = dnode_black;      } -    assert (dict_verify(dict)); +  assert (dict_verify (dict)); -    return delete; +  return delete;  }  /* @@ -810,22 +911,25 @@ dnode_t *dict_delete(dict_t *dict, dnode_t *delete)   * the data item.   */ -int dict_alloc_insert(dict_t *dict, const void *key, void *data) +int +dict_alloc_insert (dict_t * dict, const void *key, void *data)  { -    dnode_t *node = dict->allocnode(dict->context); +  dnode_t *node = dict->allocnode (dict->context); -    if (node) { -	dnode_init(node, data); -	dict_insert(dict, node, key); -	return 1; +  if (node) +    { +      dnode_init (node, data); +      dict_insert (dict, node, key); +      return 1;      } -    return 0; +  return 0;  } -void dict_delete_free(dict_t *dict, dnode_t *node) +void +dict_delete_free (dict_t * dict, dnode_t * node)  { -    dict_delete(dict, node); -    dict->freenode(node, dict->context); +  dict_delete (dict, node); +  dict->freenode (node, dict->context);  }  /* @@ -833,15 +937,16 @@ void dict_delete_free(dict_t *dict, dnode_t *node)   * (that is, dict_isempty(dict) returns 1) a null pointer is returned.   */ -dnode_t *dict_first(dict_t *dict) +dnode_t * +dict_first (dict_t * dict)  { -    dnode_t *nil = dict_nil(dict), *root = dict_root(dict), *left; +  dnode_t *nil = dict_nil (dict), *root = dict_root (dict), *left; -    if (root != nil) -	while ((left = root->left) != nil) -	    root = left; +  if (root != nil) +    while ((left = root->left) != nil) +      root = left; -    return (root == nil) ? NULL : root; +  return (root == nil) ? NULL : root;  }  /* @@ -849,15 +954,16 @@ dnode_t *dict_first(dict_t *dict)   * (that is, dict_isempty(dict) returns 1) a null pointer is returned.   */ -dnode_t *dict_last(dict_t *dict) +dnode_t * +dict_last (dict_t * dict)  { -    dnode_t *nil = dict_nil(dict), *root = dict_root(dict), *right; +  dnode_t *nil = dict_nil (dict), *root = dict_root (dict), *right; -    if (root != nil) -	while ((right = root->right) != nil) -	    root = right; +  if (root != nil) +    while ((right = root->right) != nil) +      root = right; -    return (root == nil) ? NULL : root; +  return (root == nil) ? NULL : root;  }  /* @@ -867,25 +973,28 @@ dnode_t *dict_last(dict_t *dict)   * the nil node.   */ -dnode_t *dict_next(dict_t *dict, dnode_t *curr) +dnode_t * +dict_next (dict_t * dict, dnode_t * curr)  { -    dnode_t *nil = dict_nil(dict), *parent, *left; - -    if (curr->right != nil) { -	curr = curr->right; -	while ((left = curr->left) != nil) -	    curr = left; -	return curr; +  dnode_t *nil = dict_nil (dict), *parent, *left; + +  if (curr->right != nil) +    { +      curr = curr->right; +      while ((left = curr->left) != nil) +	curr = left; +      return curr;      } -    parent = curr->parent; +  parent = curr->parent; -    while (parent != nil && curr == parent->right) { -	curr = parent; -	parent = curr->parent; +  while (parent != nil && curr == parent->right) +    { +      curr = parent; +      parent = curr->parent;      } -    return (parent == nil) ? NULL : parent; +  return (parent == nil) ? NULL : parent;  }  /* @@ -893,30 +1002,34 @@ dnode_t *dict_next(dict_t *dict, dnode_t *curr)   * The nil sentinel node is returned if there is no predecessor.   */ -dnode_t *dict_prev(dict_t *dict, dnode_t *curr) +dnode_t * +dict_prev (dict_t * dict, dnode_t * curr)  { -    dnode_t *nil = dict_nil(dict), *parent, *right; - -    if (curr->left != nil) { -	curr = curr->left; -	while ((right = curr->right) != nil) -	    curr = right; -	return curr; +  dnode_t *nil = dict_nil (dict), *parent, *right; + +  if (curr->left != nil) +    { +      curr = curr->left; +      while ((right = curr->right) != nil) +	curr = right; +      return curr;      } -    parent = curr->parent; +  parent = curr->parent; -    while (parent != nil && curr == parent->left) { -	curr = parent; -	parent = curr->parent; +  while (parent != nil && curr == parent->left) +    { +      curr = parent; +      parent = curr->parent;      } -    return (parent == nil) ? NULL : parent; +  return (parent == nil) ? NULL : parent;  } -void dict_allow_dupes(dict_t *dict) +void +dict_allow_dupes (dict_t * dict)  { -    dict->dupes = 1; +  dict->dupes = 1;  }  #undef dict_count @@ -926,268 +1039,308 @@ void dict_allow_dupes(dict_t *dict)  #undef dnode_put  #undef dnode_getkey -dictcount_t dict_count(dict_t *dict) +dictcount_t +dict_count (dict_t * dict)  { -    return dict->nodecount; +  return dict->nodecount;  } -int dict_isempty(dict_t *dict) +int +dict_isempty (dict_t * dict)  { -    return dict->nodecount == 0; +  return dict->nodecount == 0;  } -int dict_isfull(dict_t *dict) +int +dict_isfull (dict_t * dict)  { -    return dict->nodecount == dict->maxcount; +  return dict->nodecount == dict->maxcount;  } -int dict_contains(dict_t *dict, dnode_t *node) +int +dict_contains (dict_t * dict, dnode_t * node)  { -    return verify_dict_has_node(dict_nil(dict), dict_root(dict), node); +  return verify_dict_has_node (dict_nil (dict), dict_root (dict), node);  } -static dnode_t *dnode_alloc(void *context) +static dnode_t * +dnode_alloc (void *context)  { -    return malloc(sizeof *dnode_alloc(NULL)); +  return malloc (sizeof *dnode_alloc (NULL));  } -static void dnode_free(dnode_t *node, void *context) +static void +dnode_free (dnode_t * node, void *context)  { -    free(node); +  free (node);  } -dnode_t *dnode_create(void *data) +dnode_t * +dnode_create (void *data)  { -    dnode_t *new = malloc(sizeof *new); -    if (new) { -	new->data = data; -	new->parent = NULL; -	new->left = NULL; -	new->right = NULL; +  dnode_t *new = malloc (sizeof *new); +  if (new) +    { +      new->data = data; +      new->parent = NULL; +      new->left = NULL; +      new->right = NULL;      } -    return new; +  return new;  } -dnode_t *dnode_init(dnode_t *dnode, void *data) +dnode_t * +dnode_init (dnode_t * dnode, void *data)  { -    dnode->data = data; -    dnode->parent = NULL; -    dnode->left = NULL; -    dnode->right = NULL; -    return dnode; +  dnode->data = data; +  dnode->parent = NULL; +  dnode->left = NULL; +  dnode->right = NULL; +  return dnode;  } -void dnode_destroy(dnode_t *dnode) +void +dnode_destroy (dnode_t * dnode)  { -    assert (!dnode_is_in_a_dict(dnode)); -    free(dnode); +  assert (!dnode_is_in_a_dict (dnode)); +  free (dnode);  } -void *dnode_get(dnode_t *dnode) +void * +dnode_get (dnode_t * dnode)  { -    return dnode->data; +  return dnode->data;  } -const void *dnode_getkey(dnode_t *dnode) +const void * +dnode_getkey (dnode_t * dnode)  { -    return dnode->key; +  return dnode->key;  } -void dnode_put(dnode_t *dnode, void *data) +void +dnode_put (dnode_t * dnode, void *data)  { -    dnode->data = data; +  dnode->data = data;  } -int dnode_is_in_a_dict(dnode_t *dnode) +int +dnode_is_in_a_dict (dnode_t * dnode)  { -    return (dnode->parent && dnode->left && dnode->right); +  return (dnode->parent && dnode->left && dnode->right);  } -void dict_process(dict_t *dict, void *context, dnode_process_t function) +void +dict_process (dict_t * dict, void *context, dnode_process_t function)  { -    dnode_t *node = dict_first(dict), *next; - -    while (node != NULL) { -	/* check for callback function deleting	*/ -	/* the next node from under us		*/ -	assert (dict_contains(dict, node)); -	next = dict_next(dict, node); -	function(dict, node, context); -	node = next; +  dnode_t *node = dict_first (dict), *next; + +  while (node != NULL) +    { +      /* check for callback function deleting */ +      /* the next node from under us          */ +      assert (dict_contains (dict, node)); +      next = dict_next (dict, node); +      function (dict, node, context); +      node = next;      }  } -static void load_begin_internal(dict_load_t *load, dict_t *dict) +static void +load_begin_internal (dict_load_t * load, dict_t * dict)  { -    load->dictptr = dict; -    load->nilnode.left = &load->nilnode; -    load->nilnode.right = &load->nilnode; +  load->dictptr = dict; +  load->nilnode.left = &load->nilnode; +  load->nilnode.right = &load->nilnode;  } -void dict_load_begin(dict_load_t *load, dict_t *dict) +void +dict_load_begin (dict_load_t * load, dict_t * dict)  { -    assert (dict_isempty(dict)); -    load_begin_internal(load, dict); +  assert (dict_isempty (dict)); +  load_begin_internal (load, dict);  } -void dict_load_next(dict_load_t *load, dnode_t *newnode, const void *key) +void +dict_load_next (dict_load_t * load, dnode_t * newnode, const void *key)  { -    dict_t *dict = load->dictptr; -    dnode_t *nil = &load->nilnode; -    -    assert (!dnode_is_in_a_dict(newnode)); -    assert (dict->nodecount < dict->maxcount); - -    #ifndef NDEBUG -    if (dict->nodecount > 0) { -	if (dict->dupes) -	    assert (dict->compare(nil->left->key, key) <= 0); -	else -	    assert (dict->compare(nil->left->key, key) < 0); +  dict_t *dict = load->dictptr; +  dnode_t *nil = &load->nilnode; + +  assert (!dnode_is_in_a_dict (newnode)); +  assert (dict->nodecount < dict->maxcount); + +#ifndef NDEBUG +  if (dict->nodecount > 0) +    { +      if (dict->dupes) +	assert (dict->compare (nil->left->key, key) <= 0); +      else +	assert (dict->compare (nil->left->key, key) < 0);      } -    #endif +#endif -    newnode->key = key; -    nil->right->left = newnode; -    nil->right = newnode; -    newnode->left = nil; -    dict->nodecount++; +  newnode->key = key; +  nil->right->left = newnode; +  nil->right = newnode; +  newnode->left = nil; +  dict->nodecount++;  } -void dict_load_end(dict_load_t *load) +void +dict_load_end (dict_load_t * load)  { -    dict_t *dict = load->dictptr; -    dnode_t *tree[DICT_DEPTH_MAX] = { 0 }; -    dnode_t *curr, *dictnil = dict_nil(dict), *loadnil = &load->nilnode, *next; -    dnode_t *complete = 0; -    dictcount_t fullcount = DICTCOUNT_T_MAX, nodecount = dict->nodecount; -    dictcount_t botrowcount; -    unsigned baselevel = 0, level = 0, i; - -    assert (dnode_red == 0 && dnode_black == 1); - -    while (fullcount >= nodecount && fullcount) -	fullcount >>= 1; - -    botrowcount = nodecount - fullcount; - -    for (curr = loadnil->left; curr != loadnil; curr = next) { -	next = curr->left; - -	if (complete == NULL && botrowcount-- == 0) { -	    assert (baselevel == 0); -	    assert (level == 0); -	    baselevel = level = 1; -	    complete = tree[0]; - -	    if (complete != 0) { -		tree[0] = 0; -		complete->right = dictnil; -		while (tree[level] != 0) { -		    tree[level]->right = complete; -		    complete->parent = tree[level]; -		    complete = tree[level]; -		    tree[level++] = 0; +  dict_t *dict = load->dictptr; +  dnode_t *tree[DICT_DEPTH_MAX] = { 0 }; +  dnode_t *curr, *dictnil = dict_nil (dict), *loadnil = &load->nilnode, *next; +  dnode_t *complete = 0; +  dictcount_t fullcount = DICTCOUNT_T_MAX, nodecount = dict->nodecount; +  dictcount_t botrowcount; +  unsigned baselevel = 0, level = 0, i; + +  assert (dnode_red == 0 && dnode_black == 1); + +  while (fullcount >= nodecount && fullcount) +    fullcount >>= 1; + +  botrowcount = nodecount - fullcount; + +  for (curr = loadnil->left; curr != loadnil; curr = next) +    { +      next = curr->left; + +      if (complete == NULL && botrowcount-- == 0) +	{ +	  assert (baselevel == 0); +	  assert (level == 0); +	  baselevel = level = 1; +	  complete = tree[0]; + +	  if (complete != 0) +	    { +	      tree[0] = 0; +	      complete->right = dictnil; +	      while (tree[level] != 0) +		{ +		  tree[level]->right = complete; +		  complete->parent = tree[level]; +		  complete = tree[level]; +		  tree[level++] = 0;  		}  	    }  	} -	if (complete == NULL) { -	    curr->left = dictnil; -	    curr->right = dictnil; -	    curr->color = level % 2; -	    complete = curr; - -	    assert (level == baselevel); -	    while (tree[level] != 0) { -		tree[level]->right = complete; -		complete->parent = tree[level]; -		complete = tree[level]; -		tree[level++] = 0; +      if (complete == NULL) +	{ +	  curr->left = dictnil; +	  curr->right = dictnil; +	  curr->color = level % 2; +	  complete = curr; + +	  assert (level == baselevel); +	  while (tree[level] != 0) +	    { +	      tree[level]->right = complete; +	      complete->parent = tree[level]; +	      complete = tree[level]; +	      tree[level++] = 0;  	    } -	} else { -	    curr->left = complete; -	    curr->color = (level + 1) % 2; -	    complete->parent = curr; -	    tree[level] = curr; -	    complete = 0; -	    level = baselevel; +	} +      else +	{ +	  curr->left = complete; +	  curr->color = (level + 1) % 2; +	  complete->parent = curr; +	  tree[level] = curr; +	  complete = 0; +	  level = baselevel;  	}      } -    if (complete == NULL) -	complete = dictnil; +  if (complete == NULL) +    complete = dictnil; -    for (i = 0; i < DICT_DEPTH_MAX; i++) { -	if (tree[i] != 0) { -	    tree[i]->right = complete; -	    complete->parent = tree[i]; -	    complete = tree[i]; +  for (i = 0; i < DICT_DEPTH_MAX; i++) +    { +      if (tree[i] != 0) +	{ +	  tree[i]->right = complete; +	  complete->parent = tree[i]; +	  complete = tree[i];  	}      } -    dictnil->color = dnode_black; -    dictnil->right = dictnil; -    complete->parent = dictnil; -    complete->color = dnode_black; -    dict_root(dict) = complete; +  dictnil->color = dnode_black; +  dictnil->right = dictnil; +  complete->parent = dictnil; +  complete->color = dnode_black; +  dict_root (dict) = complete; -    assert (dict_verify(dict)); +  assert (dict_verify (dict));  } -void dict_merge(dict_t *dest, dict_t *source) +void +dict_merge (dict_t * dest, dict_t * source)  { -    dict_load_t load; -    dnode_t *leftnode = dict_first(dest), *rightnode = dict_first(source); +  dict_load_t load; +  dnode_t *leftnode = dict_first (dest), *rightnode = dict_first (source); -    assert (dict_similar(dest, source));	 +  assert (dict_similar (dest, source)); -    if (source == dest) -	return; +  if (source == dest) +    return; -    dest->nodecount = 0; -    load_begin_internal(&load, dest); +  dest->nodecount = 0; +  load_begin_internal (&load, dest); -    for (;;) { -	if (leftnode != NULL && rightnode != NULL) { -	    if (dest->compare(leftnode->key, rightnode->key) < 0) -		goto copyleft; -	    else -		goto copyright; -	} else if (leftnode != NULL) { +  for (;;) +    { +      if (leftnode != NULL && rightnode != NULL) +	{ +	  if (dest->compare (leftnode->key, rightnode->key) < 0)  	    goto copyleft; -	} else if (rightnode != NULL) { +	  else  	    goto copyright; -	} else { -	    assert (leftnode == NULL && rightnode == NULL); -	    break;  	} - -    copyleft: +      else if (leftnode != NULL)  	{ -	    dnode_t *next = dict_next(dest, leftnode); -	    #ifndef NDEBUG -	    leftnode->left = NULL;	/* suppress assertion in dict_load_next */ -	    #endif -	    dict_load_next(&load, leftnode, leftnode->key); -	    leftnode = next; -	    continue; +	  goto copyleft;  	} -	 -    copyright: +      else if (rightnode != NULL) +	{ +	  goto copyright; +	} +      else  	{ -	    dnode_t *next = dict_next(source, rightnode); -	    #ifndef NDEBUG -	    rightnode->left = NULL; -	    #endif -	    dict_load_next(&load, rightnode, rightnode->key); -	    rightnode = next; -	    continue; +	  assert (leftnode == NULL && rightnode == NULL); +	  break;  	} + +    copyleft: +      { +	dnode_t *next = dict_next (dest, leftnode); +#ifndef NDEBUG +	leftnode->left = NULL;	/* suppress assertion in dict_load_next */ +#endif +	dict_load_next (&load, leftnode, leftnode->key); +	leftnode = next; +	continue; +      } + +    copyright: +      { +	dnode_t *next = dict_next (source, rightnode); +#ifndef NDEBUG +	rightnode->left = NULL; +#endif +	dict_load_next (&load, rightnode, rightnode->key); +	rightnode = next; +	continue; +      }      } -    dict_clear(source); -    dict_load_end(&load); +  dict_clear (source); +  dict_load_end (&load);  }  #ifdef KAZLIB_TEST_MAIN @@ -1199,298 +1352,329 @@ void dict_merge(dict_t *dest, dict_t *source)  typedef char input_t[256]; -static int tokenize(char *string, ...) +static int +tokenize (char *string, ...)  { -    char **tokptr;  -    va_list arglist; -    int tokcount = 0; - -    va_start(arglist, string); -    tokptr = va_arg(arglist, char **); -    while (tokptr) { -	while (*string && isspace((unsigned char) *string)) -	    string++; -	if (!*string) -	    break; -	*tokptr = string; -	while (*string && !isspace((unsigned char) *string)) -	    string++; -	tokptr = va_arg(arglist, char **); -	tokcount++; -	if (!*string) -	    break; -	*string++ = 0; +  char **tokptr; +  va_list arglist; +  int tokcount = 0; + +  va_start (arglist, string); +  tokptr = va_arg (arglist, char **); +  while (tokptr) +    { +      while (*string && isspace ((unsigned char) *string)) +	string++; +      if (!*string) +	break; +      *tokptr = string; +      while (*string && !isspace ((unsigned char) *string)) +	string++; +      tokptr = va_arg (arglist, char **); +      tokcount++; +      if (!*string) +	break; +      *string++ = 0;      } -    va_end(arglist); +  va_end (arglist); -    return tokcount; +  return tokcount;  } -static int comparef(const void *key1, const void *key2) +static int +comparef (const void *key1, const void *key2)  { -    return strcmp(key1, key2); +  return strcmp (key1, key2);  } -static char *dupstring(char *str) +static char * +dupstring (char *str)  { -    int sz = strlen(str) + 1; -    char *new = malloc(sz); -    if (new) -	memcpy(new, str, sz); -    return new; +  int sz = strlen (str) + 1; +  char *new = malloc (sz); +  if (new) +    memcpy (new, str, sz); +  return new;  } -static dnode_t *new_node(void *c) +static dnode_t * +new_node (void *c)  { -    static dnode_t few[5]; -    static int count; +  static dnode_t few[5]; +  static int count; -    if (count < 5) -	return few + count++; +  if (count < 5) +    return few + count++; -    return NULL; +  return NULL;  } -static void del_node(dnode_t *n, void *c) +static void +del_node (dnode_t * n, void *c)  {  }  static int prompt = 0; -static void construct(dict_t *d) +static void +construct (dict_t * d)  { -    input_t in; -    int done = 0; -    dict_load_t dl; -    dnode_t *dn; -    char *tok1, *tok2, *val; -    const char *key; -    char *help =  -	"p                      turn prompt on\n" -	"q                      finish construction\n" -	"a <key> <val>          add new entry\n"; - -    if (!dict_isempty(d)) -	puts("warning: dictionary not empty!"); - -    dict_load_begin(&dl, d); - -    while (!done) { -	if (prompt) -	    putchar('>'); -	fflush(stdout); - -	if (!fgets(in, sizeof(input_t), stdin)) -	    break; - -	switch (in[0]) { -	    case '?': -		puts(help); -		break; -	    case 'p': -		prompt = 1; -		break; -	    case 'q': -		done = 1; -		break; -	    case 'a': -		if (tokenize(in+1, &tok1, &tok2, (char **) 0) != 2) { -		    puts("what?"); -		    break; -		} -		key = dupstring(tok1); -		val = dupstring(tok2); -		dn = dnode_create(val); - -		if (!key || !val || !dn) { -		    puts("out of memory"); -		    free((void *) key); -		    free(val); -		    if (dn) -			dnode_destroy(dn); -		} +  input_t in; +  int done = 0; +  dict_load_t dl; +  dnode_t *dn; +  char *tok1, *tok2, *val; +  const char *key; +  char *help = +    "p                      turn prompt on\n" +    "q                      finish construction\n" +    "a <key> <val>          add new entry\n"; + +  if (!dict_isempty (d)) +    puts ("warning: dictionary not empty!"); + +  dict_load_begin (&dl, d); + +  while (!done) +    { +      if (prompt) +	putchar ('>'); +      fflush (stdout); + +      if (!fgets (in, sizeof (input_t), stdin)) +	break; + +      switch (in[0]) +	{ +	case '?': +	  puts (help); +	  break; +	case 'p': +	  prompt = 1; +	  break; +	case 'q': +	  done = 1; +	  break; +	case 'a': +	  if (tokenize (in + 1, &tok1, &tok2, (char **) 0) != 2) +	    { +	      puts ("what?"); +	      break; +	    } +	  key = dupstring (tok1); +	  val = dupstring (tok2); +	  dn = dnode_create (val); + +	  if (!key || !val || !dn) +	    { +	      puts ("out of memory"); +	      free ((void *) key); +	      free (val); +	      if (dn) +		dnode_destroy (dn); +	    } -		dict_load_next(&dl, dn, key); -		break; -	    default: -		putchar('?'); -		putchar('\n'); -		break; +	  dict_load_next (&dl, dn, key); +	  break; +	default: +	  putchar ('?'); +	  putchar ('\n'); +	  break;  	}      } -    dict_load_end(&dl); +  dict_load_end (&dl);  } -int main(void) +int +main (void)  { -    input_t in; -    dict_t darray[10]; -    dict_t *d = &darray[0]; -    dnode_t *dn; -    int i; -    char *tok1, *tok2, *val; -    const char *key; - -    char *help = -	"a <key> <val>          add value to dictionary\n" -	"d <key>                delete value from dictionary\n" -	"l <key>                lookup value in dictionary\n" -	"( <key>                lookup lower bound\n" -	") <key>                lookup upper bound\n" -	"# <num>                switch to alternate dictionary (0-9)\n" -	"j <num> <num>          merge two dictionaries\n" -	"f                      free the whole dictionary\n" -	"k                      allow duplicate keys\n" -	"c                      show number of entries\n" -	"t                      dump whole dictionary in sort order\n" -	"m                      make dictionary out of sorted items\n" -	"p                      turn prompt on\n" -	"s                      switch to non-functioning allocator\n" -	"q                      quit"; - -    for (i = 0; i < sizeof darray / sizeof *darray; i++) -	dict_init(&darray[i], DICTCOUNT_T_MAX, comparef); - -    for (;;) { -	if (prompt) -	    putchar('>'); -	fflush(stdout); - -	if (!fgets(in, sizeof(input_t), stdin)) -	    break; - -	switch(in[0]) { -	    case '?': -		puts(help); -		break; -	    case 'a': -		if (tokenize(in+1, &tok1, &tok2, (char **) 0) != 2) { -		    puts("what?"); -		    break; -		} -		key = dupstring(tok1); -		val = dupstring(tok2); - -		if (!key || !val) { -		    puts("out of memory"); -		    free((void *) key); -		    free(val); -		} +  input_t in; +  dict_t darray[10]; +  dict_t *d = &darray[0]; +  dnode_t *dn; +  int i; +  char *tok1, *tok2, *val; +  const char *key; + +  char *help = +    "a <key> <val>          add value to dictionary\n" +    "d <key>                delete value from dictionary\n" +    "l <key>                lookup value in dictionary\n" +    "( <key>                lookup lower bound\n" +    ") <key>                lookup upper bound\n" +    "# <num>                switch to alternate dictionary (0-9)\n" +    "j <num> <num>          merge two dictionaries\n" +    "f                      free the whole dictionary\n" +    "k                      allow duplicate keys\n" +    "c                      show number of entries\n" +    "t                      dump whole dictionary in sort order\n" +    "m                      make dictionary out of sorted items\n" +    "p                      turn prompt on\n" +    "s                      switch to non-functioning allocator\n" +    "q                      quit"; + +  for (i = 0; i < sizeof darray / sizeof *darray; i++) +    dict_init (&darray[i], DICTCOUNT_T_MAX, comparef); + +  for (;;) +    { +      if (prompt) +	putchar ('>'); +      fflush (stdout); + +      if (!fgets (in, sizeof (input_t), stdin)) +	break; + +      switch (in[0]) +	{ +	case '?': +	  puts (help); +	  break; +	case 'a': +	  if (tokenize (in + 1, &tok1, &tok2, (char **) 0) != 2) +	    { +	      puts ("what?"); +	      break; +	    } +	  key = dupstring (tok1); +	  val = dupstring (tok2); + +	  if (!key || !val) +	    { +	      puts ("out of memory"); +	      free ((void *) key); +	      free (val); +	    } -		if (!dict_alloc_insert(d, key, val)) { -		    puts("dict_alloc_insert failed"); -		    free((void *) key); -		    free(val); -		    break; -		} -		break; -	    case 'd': -		if (tokenize(in+1, &tok1, (char **) 0) != 1) { -		    puts("what?"); -		    break; -		} -		dn = dict_lookup(d, tok1); -		if (!dn) { -		    puts("dict_lookup failed"); -		    break; -		} -		val = dnode_get(dn); -		key = dnode_getkey(dn); -		dict_delete_free(d, dn); - -		free(val); -		free((void *) key); -		break; -	    case 'f': -		dict_free(d); -		break; +	  if (!dict_alloc_insert (d, key, val)) +	    { +	      puts ("dict_alloc_insert failed"); +	      free ((void *) key); +	      free (val); +	      break; +	    } +	  break; +	case 'd': +	  if (tokenize (in + 1, &tok1, (char **) 0) != 1) +	    { +	      puts ("what?"); +	      break; +	    } +	  dn = dict_lookup (d, tok1); +	  if (!dn) +	    { +	      puts ("dict_lookup failed"); +	      break; +	    } +	  val = dnode_get (dn); +	  key = dnode_getkey (dn); +	  dict_delete_free (d, dn); + +	  free (val); +	  free ((void *) key); +	  break; +	case 'f': +	  dict_free (d); +	  break; +	case 'l': +	case '(': +	case ')': +	  if (tokenize (in + 1, &tok1, (char **) 0) != 1) +	    { +	      puts ("what?"); +	      break; +	    } +	  dn = 0; +	  switch (in[0]) +	    {  	    case 'l': +	      dn = dict_lookup (d, tok1); +	      break;  	    case '(': +	      dn = dict_lower_bound (d, tok1); +	      break;  	    case ')': -		if (tokenize(in+1, &tok1, (char **) 0) != 1) { -		    puts("what?"); -		    break; -		} -		dn = 0; -		switch (in[0]) { -		case 'l': -		    dn = dict_lookup(d, tok1); -		    break; -		case '(': -		    dn = dict_lower_bound(d, tok1); -		    break; -		case ')': -		    dn = dict_upper_bound(d, tok1); -		    break; -		} -		if (!dn) { -		    puts("lookup failed"); -		    break; -		} -		val = dnode_get(dn); -		puts(val); -		break; -	    case 'm': -		construct(d); -		break; -	    case 'k': -		dict_allow_dupes(d); -		break; -	    case 'c': -		printf("%lu\n", (unsigned long) dict_count(d)); -		break; -	    case 't': -		for (dn = dict_first(d); dn; dn = dict_next(d, dn)) { -		    printf("%s\t%s\n", (char *) dnode_getkey(dn), -			    (char *) dnode_get(dn)); -		} -		break; -	    case 'q': -		exit(0); -		break; -	    case '\0': -		break; -	    case 'p': -		prompt = 1; -		break; -	    case 's': -		dict_set_allocator(d, new_node, del_node, NULL); -		break; -	    case '#': -		if (tokenize(in+1, &tok1, (char **) 0) != 1) { -		    puts("what?"); -		    break; -		} else { -		    int dictnum = atoi(tok1); -		    if (dictnum < 0 || dictnum > 9) { -			puts("invalid number"); -			break; -		    } -		    d = &darray[dictnum]; +	      dn = dict_upper_bound (d, tok1); +	      break; +	    } +	  if (!dn) +	    { +	      puts ("lookup failed"); +	      break; +	    } +	  val = dnode_get (dn); +	  puts (val); +	  break; +	case 'm': +	  construct (d); +	  break; +	case 'k': +	  dict_allow_dupes (d); +	  break; +	case 'c': +	  printf ("%lu\n", (unsigned long) dict_count (d)); +	  break; +	case 't': +	  for (dn = dict_first (d); dn; dn = dict_next (d, dn)) +	    { +	      printf ("%s\t%s\n", (char *) dnode_getkey (dn), +		      (char *) dnode_get (dn)); +	    } +	  break; +	case 'q': +	  exit (0); +	  break; +	case '\0': +	  break; +	case 'p': +	  prompt = 1; +	  break; +	case 's': +	  dict_set_allocator (d, new_node, del_node, NULL); +	  break; +	case '#': +	  if (tokenize (in + 1, &tok1, (char **) 0) != 1) +	    { +	      puts ("what?"); +	      break; +	    } +	  else +	    { +	      int dictnum = atoi (tok1); +	      if (dictnum < 0 || dictnum > 9) +		{ +		  puts ("invalid number"); +		  break;  		} -		break; -	    case 'j': -		if (tokenize(in+1, &tok1, &tok2, (char **) 0) != 2) { -		    puts("what?"); -		    break; -		} else { -		    int dict1 = atoi(tok1), dict2 = atoi(tok2); -		    if (dict1 < 0 || dict1 > 9 || dict2 < 0 || dict2 > 9) { -			puts("invalid number"); -			break; -		    } -		    dict_merge(&darray[dict1], &darray[dict2]); +	      d = &darray[dictnum]; +	    } +	  break; +	case 'j': +	  if (tokenize (in + 1, &tok1, &tok2, (char **) 0) != 2) +	    { +	      puts ("what?"); +	      break; +	    } +	  else +	    { +	      int dict1 = atoi (tok1), dict2 = atoi (tok2); +	      if (dict1 < 0 || dict1 > 9 || dict2 < 0 || dict2 > 9) +		{ +		  puts ("invalid number"); +		  break;  		} -		break; -	    default: -		putchar('?'); -		putchar('\n'); -		break; +	      dict_merge (&darray[dict1], &darray[dict2]); +	    } +	  break; +	default: +	  putchar ('?'); +	  putchar ('\n'); +	  break;  	}      } -    return 0; +  return 0;  }  #endif | 
