* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
*
* This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
+ * Lesser General Public License for more details.
*
- * You should have received a copy of the GNU Library General Public
+ * You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/*
- * Modified by the GLib Team and others 1997-1999. See the AUTHORS
+ * Modified by the GLib Team and others 1997-2000. See the AUTHORS
* file for a list of people on the GLib Team. See the ChangeLog
* files for a list of changes. These files are distributed with
* GLib at ftp://ftp.gtk.org/pub/gtk/.
#define g_array_elt_len(array,i) ((array)->elt_size * (i))
#define g_array_elt_pos(array,i) ((array)->data + g_array_elt_len((array),(i)))
-#define g_array_elt_zero(array, pos, len) \
+#define g_array_elt_zero(array, pos, len) \
(memset (g_array_elt_pos ((array), pos), 0, g_array_elt_len ((array), len)))
-#define g_array_zero_terminate(array) G_STMT_START{ \
- if ((array)->zero_terminated) \
- g_array_elt_zero ((array), (array)->len, 1); \
+#define g_array_zero_terminate(array) G_STMT_START{ \
+ if ((array)->zero_terminated) \
+ g_array_elt_zero ((array), (array)->len, 1); \
}G_STMT_END
static gint g_nearest_pow (gint num);
guint length)
{
GRealArray *array = (GRealArray*) farray;
-
- if (array->len < length)
+ if (length > array->len)
{
g_array_maybe_expand (array, length - array->len);
if (array->clear)
g_array_elt_zero (array, array->len, length - array->len);
}
+#ifdef ENABLE_GC_FRIENDLY
+ else if (length < array->len)
+ g_array_elt_zero (array, length, array->len - length);
+#endif /* ENABLE_GC_FRIENDLY */
array->len = length;
g_return_val_if_fail (array, NULL);
- g_return_val_if_fail (index >= 0 && index < array->len, NULL);
+ g_return_val_if_fail (index < array->len, NULL);
if (index != array->len - 1)
g_memmove (g_array_elt_pos (array, index),
array->len -= 1;
+#ifdef ENABLE_GC_FRIENDLY
+ g_array_elt_zero (array, array->len, 1);
+#else /* !ENABLE_GC_FRIENDLY */
g_array_zero_terminate (array);
+#endif /* ENABLE_GC_FRIENDLY */
return farray;
}
GArray*
g_array_remove_index_fast (GArray* farray,
- guint index)
+ guint index)
{
GRealArray* array = (GRealArray*) farray;
g_return_val_if_fail (array, NULL);
- g_return_val_if_fail (index >= 0 && index < array->len, NULL);
+ g_return_val_if_fail (index < array->len, NULL);
if (index != array->len - 1)
g_memmove (g_array_elt_pos (array, index),
array->len -= 1;
+#ifdef ENABLE_GC_FRIENDLY
+ g_array_elt_zero (array, array->len, 1);
+#else /* !ENABLE_GC_FRIENDLY */
g_array_zero_terminate (array);
+#endif /* ENABLE_GC_FRIENDLY */
return farray;
}
if (want_alloc > array->alloc)
{
- array->alloc = g_nearest_pow (want_alloc);
- array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
+ want_alloc = g_nearest_pow (want_alloc);
+ want_alloc = MAX (want_alloc, MIN_ARRAY_SIZE);
- array->data = g_realloc (array->data, array->alloc);
+ array->data = g_realloc (array->data, want_alloc);
+
+#ifdef ENABLE_GC_FRIENDLY
+ memset (array->data + array->alloc, 0, want_alloc - array->alloc);
+#endif /* ENABLE_GC_FRIENDLY */
+
+ array->alloc = want_alloc;
}
}
{
if ((array->len + len) > array->alloc)
{
+#ifdef ENABLE_GC_FRIENDLY
+ guint old_alloc = array->alloc;
+#endif /* ENABLE_GC_FRIENDLY */
array->alloc = g_nearest_pow (array->len + len);
array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
array->pdata = g_realloc (array->pdata, sizeof(gpointer) * array->alloc);
+#ifdef ENABLE_GC_FRIENDLY
+ for ( ; old_alloc < array->alloc; old_alloc++)
+ array->pdata [old_alloc] = NULL;
+#endif /* ENABLE_GC_FRIENDLY */
}
}
for (i = array->len; i < length; i++)
array->pdata[i] = NULL;
}
+#ifdef ENABLE_GC_FRIENDLY
+ else if (length < array->len)
+ {
+ int i;
+ for (i = length; i < array->len; i++)
+ array->pdata[i] = NULL;
+ }
+#endif /* ENABLE_GC_FRIENDLY */
array->len = length;
}
gpointer
g_ptr_array_remove_index (GPtrArray* farray,
- guint index)
+ guint index)
{
GRealPtrArray* array = (GRealPtrArray*) farray;
gpointer result;
g_return_val_if_fail (array, NULL);
- g_return_val_if_fail (index >= 0 && index < array->len, NULL);
+ g_return_val_if_fail (index < array->len, NULL);
result = array->pdata[index];
array->len -= 1;
+#ifdef ENABLE_GC_FRIENDLY
+ array->pdata[array->len] = NULL;
+#endif /* ENABLE_GC_FRIENDLY */
+
return result;
}
gpointer
g_ptr_array_remove_index_fast (GPtrArray* farray,
- guint index)
+ guint index)
{
GRealPtrArray* array = (GRealPtrArray*) farray;
gpointer result;
g_return_val_if_fail (array, NULL);
- g_return_val_if_fail (index >= 0 && index < array->len, NULL);
+ g_return_val_if_fail (index < array->len, NULL);
result = array->pdata[index];
array->len -= 1;
+#ifdef ENABLE_GC_FRIENDLY
+ array->pdata[array->len] = NULL;
+#endif /* ENABLE_GC_FRIENDLY */
+
return result;
}