]> git.sur5r.net Git - cc65/blobdiff - src/common/coll.c
Fixed two compiler warnings.
[cc65] / src / common / coll.c
index 877c4a67708182e6ff207c645db48a89b799e733..0fa0d152e717683134d015f89c9c41097b5dcdcf 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2000-2010, Ullrich von Bassewitz                                      */
+/* (C) 2000-2011, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
@@ -140,7 +140,7 @@ void CollInsert (Collection* C, void* Item, unsigned Index)
     /* Grow the array if necessary */
     if (C->Count >= C->Size) {
        /* Must grow */
-        CollGrow (C, (C->Size == 0)? 8 : C->Size * 2);
+        CollGrow (C, (C->Size == 0)? 4 : C->Size * 2);
     }
 
     /* Move the existing elements if needed */
@@ -161,13 +161,13 @@ void CollAppend (Collection* C, void* Item)
 {
     /* Insert the item at the end of the current list */
     CollInsert (C, Item, C->Count);
-}
+}                      
 #endif
 
 
 
 #if !defined(HAVE_INLINE)
-void* CollAt (Collection* C, unsigned Index)
+void* CollAt (const Collection* C, unsigned Index)
 /* Return the item at the given index */
 {
     /* Check the index */
@@ -306,6 +306,39 @@ void CollReplace (Collection* C, void* Item, unsigned Index)
 
 
 
+void CollReplaceExpand (Collection* C, void* Item, unsigned Index)
+/* If Index is a valid index for the collection, replace the item at this
+ * position by the one passed. If the collection is too small, expand it,
+ * filling unused pointers with NULL, then add the new item at the given
+ * position.
+ */
+{
+    if (Index < C->Count) {
+        /* Collection is already large enough */
+        C->Items[Index] = Item;
+    } else {
+        /* Must expand the collection */
+        unsigned Size = C->Size;
+        if (Size == 0) {
+            Size = 4;
+        }
+        while (Index >= Size) {
+            Size *= 2;
+        }
+        CollGrow (C, Size);
+
+        /* Fill up unused slots with NULL */
+        while (C->Count < Index) {
+            C->Items[C->Count++] = 0;
+        }
+
+        /* Fill in the item */
+        C->Items[C->Count++] = Item;
+    }
+}
+
+
+
 void CollMove (Collection* C, unsigned OldIndex, unsigned NewIndex)
 /* Move an item from one position in the collection to another. OldIndex
  * is the current position of the item, NewIndex is the new index after
@@ -438,6 +471,26 @@ static void QuickSort (Collection* C, int Lo, int Hi,
 
 
 
+void CollTransfer (Collection* Dest, const Collection* Source)
+/* Transfer all items from Source to Dest. Anything already in Dest is left
+ * untouched. The items in Source are not changed and are therefore in both
+ * Collections on return.
+ */
+{
+    /* Be sure there's enough room in Dest */
+    CollGrow (Dest, Dest->Count + Source->Count);
+
+    /* Copy the items */
+    memcpy (Dest->Items + Dest->Count,
+            Source->Items,
+            Source->Count * sizeof (Source->Items[0]));
+
+    /* Bump the counter */
+    Dest->Count += Source->Count;
+}
+
+
+
 void CollSort (Collection* C,
               int (*Compare) (void*, const void*, const void*),
               void* Data)