From d46cba8a0b4f48aadeb44fd6fd035b03c94e7416 Mon Sep 17 00:00:00 2001
From: Robert James Kaes <rjkaes@users.sourceforge.net>
Date: Mon, 13 May 2002 23:32:16 +0000
Subject: Added a "tail" pointer to the vector to make insertions more
 efficient.

---
 ChangeLog    |  3 +++
 src/vector.c | 27 ++++++++++++++++-----------
 2 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 837f3c9..68a0888 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2002-05-13  Robert James Kaes  <rjkaes@flarenet.com>
 
+	* src/vector.c: Added the "tail" pointer to make insertions more
+	efficient.
+
 	* src/hashmap.c (hashmap_insert): Fixed a potential SEGFAULT if
 	the memory for the new hashmap entry could not be allocated.
 	(hashmap_remove): Fixed a problem where an entry could have it's
diff --git a/src/vector.c b/src/vector.c
index 09844bd..f448eb1 100644
--- a/src/vector.c
+++ b/src/vector.c
@@ -1,4 +1,4 @@
-/* $Id: vector.c,v 1.3 2002-04-18 17:57:19 rjkaes Exp $
+/* $Id: vector.c,v 1.4 2002-05-13 23:32:16 rjkaes Exp $
  *
  * A vector implementation.  The vector can be of an arbritrary length, and
  * the data for each entry is an lump of data (the size is stored in the
@@ -42,7 +42,8 @@ struct vectorentry_s {
 
 struct vector_s {
 	size_t num_entries;
-	struct vectorentry_s *vector;
+	struct vectorentry_s *head;
+	struct vectorentry_s *tail;
 };
 
 /*
@@ -62,7 +63,7 @@ vector_create(void)
 		return NULL;
 
 	vector->num_entries = 0;
-	vector->vector = NULL;
+	vector->head = vector->tail = NULL;
 	
 	return vector;
 }
@@ -81,13 +82,13 @@ vector_delete(vector_t vector)
 	if (!vector)
 		return -EINVAL;
        
-	ptr = vector->vector;
+	ptr = vector->head;
 	while (ptr) {
 		next = ptr->next;
 		safefree(ptr->data);
 		safefree(ptr);
 
-		ptr = next;	
+		ptr = next;
 	}
 
 	safefree(vector);
@@ -107,7 +108,7 @@ vector_delete(vector_t vector)
 int
 vector_insert(vector_t vector, void *data, ssize_t len)
 {
-	struct vectorentry_s *entry, **ptr;
+	struct vectorentry_s *entry;
 
 	if (!vector || !data || len <= 0)
 		return -EINVAL;
@@ -126,11 +127,15 @@ vector_insert(vector_t vector, void *data, ssize_t len)
 	entry->len = len;
 	entry->next = NULL;
 
-	ptr = &vector->vector;
-	while (*ptr)
-		ptr = &((*ptr)->next);
+	if (vector->tail) {
+		/* If "tail" is not NULL, it points to the last entry */
+		vector->tail->next = entry;
+		vector->tail = entry;
+	} else {
+		/* No "tail", meaning no entries.  Create both. */
+		vector->head = vector->tail = entry;
+	}
 
-	*ptr = entry;
 	vector->num_entries++;
 
 	return 0;
@@ -156,7 +161,7 @@ vector_getentry(vector_t vector, size_t pos, void **data)
 		return -ERANGE;
 
 	loc = 0;
-	ptr = vector->vector;
+	ptr = vector->head;
 
 	while (loc != pos) {
 		ptr = ptr->next;
-- 
cgit v1.2.3