From a328cefbf067785a867f53df042ca02ec3e6f39d Mon Sep 17 00:00:00 2001
From: Robert James Kaes <rjkaes@users.sourceforge.net>
Date: Thu, 30 Aug 2001 16:52:09 +0000
Subject: Renamed ternary_insert() to ternary_insert_replace() and added the
 ability to replace existing data (without a memory leak.) Added two DEFINES
 ternary_insert() and ternary_replace() to aid in coding.

---
 src/ternary.c | 13 ++++++++++---
 src/ternary.h |  8 ++++++--
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/src/ternary.c b/src/ternary.c
index df93ead..0a4ee09 100644
--- a/src/ternary.c
+++ b/src/ternary.c
@@ -1,4 +1,4 @@
-/* $Id: ternary.c,v 1.5 2001-05-23 17:59:53 rjkaes Exp $
+/* $Id: ternary.c,v 1.6 2001-08-30 16:52:09 rjkaes Exp $
  *
  * This module creates a Ternary Search Tree which can store both string
  * keys, and arbitrary data for each key. It works similar to a hash, and
@@ -294,7 +294,8 @@ int ternary_destroy(TERNARY tno, void (*freeptr)(void *))
  *		TE_TOOFULL	tree is full, so no new elements can be added.
  * Exceptions:	none
  */
-int ternary_insert(TERNARY tno, const char *s, void *data)
+int ternary_insert_replace(TERNARY tno, const char *s, void *data,
+			   short int replace)
 {
 	int cur;		/* index of current tree */
 	Ttree *tree;		/* pointer to tree structure */
@@ -314,7 +315,13 @@ int ternary_insert(TERNARY tno, const char *s, void *data)
 	while ((pp = *p)) {
 		if ((d = *s - pp->splitchar) == 0) {
 			if (*s++ == 0) {
-				return TE_EXISTS;
+				if (!replace)
+					return TE_EXISTS;
+				else {
+					free(pp->eqkid);
+					pp->eqkid = (Tnode *)data;
+					return TE_NONE;
+				}
 			}
 			p = &(pp->eqkid);
 		} else if (d < 0)
diff --git a/src/ternary.h b/src/ternary.h
index fcb6c17..5fb6d51 100644
--- a/src/ternary.h
+++ b/src/ternary.h
@@ -1,4 +1,4 @@
-/* $Id: ternary.h,v 1.2 2000-09-26 04:59:20 rjkaes Exp $
+/* $Id: ternary.h,v 1.3 2001-08-30 16:52:09 rjkaes Exp $
  *
  * See 'ternary.c' for a detailed description.
  *
@@ -58,7 +58,11 @@ extern char te_errbuf[256];
 extern TERNARY ternary_new(void);
 extern int ternary_destroy(TERNARY tno, void (*freeptr)(void *));
 
-extern int ternary_insert(TERNARY tno, const char *s, void *data);
+#define ternary_insert(x, y, z)  ternary_insert_replace(x, y, z, 0)
+#define ternary_replace(x, y, z) ternary_insert_replace(x, y, z, 1)
+
+extern int ternary_insert_replace(TERNARY tno, const char *s, void *data,
+				  short int replace);
 extern int ternary_search(TERNARY tno, const char *s, void **data);
 
 #endif
-- 
cgit v1.2.3