From 37ac03337070e1436b9a1a670717063b789e4cef Mon Sep 17 00:00:00 2001 From: uz Date: Sun, 21 Aug 2011 17:30:25 +0000 Subject: [PATCH] Added CollReplaceExpand. git-svn-id: svn://svn.cc65.org/cc65/trunk@5249 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/common/coll.c | 41 +++++++++++++++++++++++++++++++++++++---- src/common/coll.h | 9 ++++++++- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/common/coll.c b/src/common/coll.c index a75dc7bed..0fa0d152e 100644 --- a/src/common/coll.c +++ b/src/common/coll.c @@ -161,7 +161,7 @@ void CollAppend (Collection* C, void* Item) { /* Insert the item at the end of the current list */ CollInsert (C, Item, C->Count); -} +} #endif @@ -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 @@ -442,14 +475,14 @@ 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, + memcpy (Dest->Items + Dest->Count, + Source->Items, Source->Count * sizeof (Source->Items[0])); /* Bump the counter */ diff --git a/src/common/coll.h b/src/common/coll.h index f53ab6893..db2b5e8f0 100644 --- a/src/common/coll.h +++ b/src/common/coll.h @@ -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 */ @@ -259,6 +259,13 @@ void CollReplace (Collection* C, void* Item, unsigned Index); */ #endif +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. + */ + 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 -- 2.39.5