(move_range): New function.
authorBen Pfaff <blp@gnu.org>
Mon, 4 Jun 2007 01:19:03 +0000 (01:19 +0000)
committerBen Pfaff <blp@gnu.org>
Mon, 4 Jun 2007 01:19:03 +0000 (01:19 +0000)
src/libpspp/ChangeLog
src/libpspp/array.c
src/libpspp/array.h

index fa02a8b9406e8cf15741f23f618176770bdbbe3f..acdad2318dfdf039f12228ca52782f4f0530293e 100644 (file)
@@ -2,6 +2,7 @@
 
        * array.c (insert_range): New function.
        (insert_element): New function.
+       (move_range): New function.
 
 2007-04-25  Ben Pfaff  <blp@gnu.org>
 
index 8af5d8fecec7ce1ccd5891cae5de6364ea3f8c89..f375f83dfa9851bdb6208d0875d2356031c7501f 100644 (file)
@@ -415,6 +415,36 @@ move_element (void *array_, size_t count, size_t size,
     }
 }
 
+/* Moves N elements in ARRAY starting at OLD_IDX, which consists
+   of COUNT elements of SIZE bytes each, so that they now start
+   at NEW_IDX, shifting around other elements as needed. */
+void
+move_range (void *array_, size_t count, size_t size,
+            size_t old_idx, size_t new_idx, size_t n)
+{
+  assert (array_ != NULL || count == 0);
+  assert (n <= count);
+  assert (old_idx + n <= count);
+  assert (new_idx + n <= count);
+  
+  if (old_idx != new_idx && n > 0) 
+    {
+      char *array = array_;
+      char *range = xmalloc (size * n);
+      char *new = array + new_idx * size;
+      char *old = array + old_idx * size;
+
+      memcpy (range, old, size * n);
+      if (new < old)
+        memmove (new + size * n, new, (old_idx - new_idx) * size);
+      else
+        memmove (old, old + size * n, (new_idx - old_idx) * size);
+      memcpy (new, range, size * n);
+
+      free (range);
+    }
+}
+
 /* A predicate and its auxiliary data. */
 struct pred_aux 
   {
index 3cfb245a26f7fe84d800329243d5349593503109..a867adea5a91301dd8185dfc394d717a654863bc 100644 (file)
@@ -129,6 +129,12 @@ void insert_element (void *array, size_t count, size_t size,
 void move_element (void *array, size_t count, size_t size,
                    size_t old_idx, size_t new_idx);
 
+/* Moves N elements in ARRAY starting at OLD_IDX, which consists
+   of COUNT elements of SIZE bytes each, so that they now start
+   at NEW_IDX, shifting around other elements as needed. */
+void move_range (void *array, size_t count, size_t size,
+                 size_t old_idx, size_t new_idx, size_t n);
+
 /* Removes elements equal to ELEMENT from ARRAY, which consists
    of COUNT elements of SIZE bytes each.  Returns the number of
    remaining elements.  AUX is passed to COMPARE as auxiliary