summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManish Singh <yosh@src.gnome.org>1998-03-19 07:17:10 +0000
committerManish Singh <yosh@src.gnome.org>1998-03-19 07:17:10 +0000
commit38614a78b651bf101989e0ce533ea199a0d777b0 (patch)
treea9fe394850a94bf5bf050982f1ad6daab188f780
parentb44ec526b6cf1fd456a4538c9361db6687cc5441 (diff)
downloadgdk-pixbuf-38614a78b651bf101989e0ce533ea199a0d777b0.tar.gz
Reverted garray change, and fixed the g_rarray_truncate bug with length.
Can we be one big happy g* family now? :) -Yosh
-rw-r--r--glib/ChangeLog5
-rw-r--r--glib/garray.c125
-rw-r--r--glib/glib.h52
-rw-r--r--glib/testglib.c18
4 files changed, 95 insertions, 105 deletions
diff --git a/glib/ChangeLog b/glib/ChangeLog
index 2673bcdde..71f57cfe9 100644
--- a/glib/ChangeLog
+++ b/glib/ChangeLog
@@ -1,7 +1,6 @@
-Tue Mar 17 15:51:30 PST 1998 Manish Singh <yosh@gimp.org>
+Wed Mar 18 22:27:08 PST 1998
- * glib.h: gboolean type changed to int
- * garray.c: complete redo by Josh MacDonald
+ * garray.c: g_rarray_truncate length done correctly
Sun Mar 15 07:13:34 1998 Tim Janik <timj@gimp.org>
diff --git a/glib/garray.c b/glib/garray.c
index c48c60c2d..e27d37d98 100644
--- a/glib/garray.c
+++ b/glib/garray.c
@@ -26,11 +26,13 @@ typedef struct _GRealArray GRealArray;
struct _GRealArray
{
- gpointer *data;
+ guint8 *data;
guint len;
guint alloc;
+ guint zero_terminated;
};
+
static gint g_nearest_pow (gint num);
static void g_array_maybe_expand (GRealArray *array,
gint len);
@@ -39,9 +41,8 @@ static void g_array_maybe_expand (GRealArray *array,
static GMemChunk *array_mem_chunk = NULL;
-
GArray*
-g_array_new ()
+g_array_new (gint zero_terminated)
{
GRealArray *array;
@@ -55,22 +56,62 @@ g_array_new ()
array->data = NULL;
array->len = 0;
array->alloc = 0;
+ array->zero_terminated = (zero_terminated ? 1 : 0);
return (GArray*) array;
}
void
g_array_free (GArray *array,
- gboolean free_segment)
+ gint free_segment)
{
- g_return_if_fail (array);
-
if (free_segment)
g_free (array->data);
g_mem_chunk_free (array_mem_chunk, array);
}
+GArray*
+g_rarray_append (GArray *array,
+ gpointer data,
+ gint size)
+{
+ g_array_maybe_expand ((GRealArray*) array, size);
+
+ memcpy (array->data + array->len, data, size);
+
+ array->len += size;
+
+ return array;
+}
+
+GArray*
+g_rarray_prepend (GArray *array,
+ gpointer data,
+ gint size)
+{
+ g_array_maybe_expand ((GRealArray*) array, size);
+
+ g_memmove (array->data + size, array->data, array->len);
+ memcpy (array->data, data, size);
+
+ array->len += size;
+
+ return array;
+}
+
+GArray*
+g_rarray_truncate (GArray *array,
+ gint length,
+ gint size)
+{
+ if (array->data)
+ memset (array->data + length * size, 0, size);
+ array->len = length * size;
+ return array;
+}
+
+
static gint
g_nearest_pow (gint num)
{
@@ -92,78 +133,10 @@ g_array_maybe_expand (GRealArray *array,
{
old_alloc = array->alloc;
- array->alloc = g_nearest_pow (array->len + len);
+ array->alloc = g_nearest_pow (array->len + array->zero_terminated + len);
array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
- if (array->data)
- array->data = g_realloc (array->data, sizeof(gpointer) * array->alloc);
- else
- array->data = g_new0 (gpointer, array->alloc);
+ array->data = g_realloc (array->data, array->alloc);
memset (array->data + old_alloc, 0, array->alloc - old_alloc);
}
}
-
-void
-g_array_set_size (GArray *farray,
- gint length)
-{
- GRealArray* array = (GRealArray*) farray;
-
- g_return_if_fail (array);
-
- if (length > array->len)
- g_array_maybe_expand (array, (length - array->len));
-
- array->len = length;
-}
-
-void
-g_array_remove_index (GArray* farray,
- gint index)
-{
- GRealArray* array = (GRealArray*) farray;
-
- g_return_if_fail (array);
-
- g_return_if_fail (index >= array->len);
-
- array->data[index] = array->data[array->len - 1];
-
- array->data[array->len - 1] = NULL;
-
- array->len -= 1;
-}
-
-gboolean
-g_array_remove (GArray* farray,
- gpointer data)
-{
- GRealArray* array = (GRealArray*) farray;
- int i;
-
- g_return_val_if_fail (array, FALSE);
-
- for (i = 0; i < array->len; i += 1)
- {
- if (array->data[i] == data)
- {
- g_array_remove_index (farray, i);
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-void
-g_array_add (GArray* farray,
- gpointer data)
-{
- GRealArray* array = (GRealArray*) farray;
-
- g_return_if_fail (array);
-
- g_array_maybe_expand (array, 1);
-
- array->data[array->len++] = data;
-}
diff --git a/glib/glib.h b/glib/glib.h
index 034f28bc9..5100c8f06 100644
--- a/glib/glib.h
+++ b/glib/glib.h
@@ -295,8 +295,7 @@ typedef char gchar;
typedef short gshort;
typedef long glong;
typedef int gint;
-typedef unsigned char gboolean; /* Josh says. */
- /* #gimp says, and common sense says. Where's Josh? */
+typedef char gboolean;
typedef unsigned char guchar;
typedef unsigned short gushort;
@@ -391,7 +390,7 @@ struct _GString
struct _GArray
{
- gpointer *data;
+ gchar *data;
guint len;
};
@@ -514,6 +513,7 @@ void g_hash_table_foreach (GHashTable *hash_table,
GHFunc func,
gpointer user_data);
+
/* Caches
*/
GCache* g_cache_new (GCacheNewFunc value_new_func,
@@ -745,25 +745,33 @@ void g_string_sprintfa (GString *string,
...);
#endif
-/* Resizable pointer array. There used to be a more complicated
- * interface that dealt with arbitrary sizes. It was found to be
- * too ugly to use. Add appends appends a pointer. Remove fills
- * any cleared spot and shortens the array.
- */
-#define g_array_index(array,index) (array->data)[index]
-
-GArray* g_array_new (void);
-void g_array_free (GArray *array,
- gboolean free_seg);
-void g_array_set_size (GArray *array,
- gint length);
-void g_array_remove_index (GArray *array,
- gint index);
-gboolean g_array_remove (GArray *array,
- gpointer data);
-void g_array_add (GArray *array,
- gpointer data);
-
+/* Resizable arrays
+ */
+#define g_array_append_val(array,type,val) \
+ g_rarray_append (array, (gpointer) &val, sizeof (type))
+#define g_array_append_vals(array,type,vals,nvals) \
+ g_rarray_append (array, (gpointer) vals, sizeof (type) * nvals)
+#define g_array_prepend_val(array,type,val) \
+ g_rarray_prepend (array, (gpointer) &val, sizeof (type))
+#define g_array_prepend_vals(array,type,vals,nvals) \
+ g_rarray_prepend (array, (gpointer) vals, sizeof (type) * nvals)
+#define g_array_truncate(array,type,length) \
+ g_rarray_truncate (array, length, sizeof (type))
+#define g_array_index(array,type,index) \
+ ((type*) array->data)[index]
+
+GArray* g_array_new (gint zero_terminated);
+void g_array_free (GArray *array,
+ gint free_segment);
+GArray* g_rarray_append (GArray *array,
+ gpointer data,
+ gint size);
+GArray* g_rarray_prepend (GArray *array,
+ gpointer data,
+ gint size);
+GArray* g_rarray_truncate (GArray *array,
+ gint length,
+ gint size);
/* Hash Functions
*/
diff --git a/glib/testglib.c b/glib/testglib.c
index 98f5dda56..2763e85ce 100644
--- a/glib/testglib.c
+++ b/glib/testglib.c
@@ -339,13 +339,23 @@ main (int argc,
g_print ("checking arrays...");
- garray = g_array_new ();
+ garray = g_array_new (FALSE);
for (i = 0; i < 10000; i++)
- g_array_add (garray, (void*)i);
+ g_array_append_val (garray, gint, i);
for (i = 0; i < 10000; i++)
- if (g_array_index (garray, i) != (void*)i)
- g_print ("array fails: %p ( %p )\n", g_array_index (garray, i), (void*)i);
+ if (g_array_index (garray, gint, i) != i)
+ g_print ("uh oh: %d ( %d )\n", g_array_index (garray, gint, i), i);
+
+ g_array_free (garray, TRUE);
+
+ garray = g_array_new (FALSE);
+ for (i = 0; i < 10000; i++)
+ g_array_prepend_val (garray, gint, i);
+
+ for (i = 0; i < 10000; i++)
+ if (g_array_index (garray, gint, i) != (10000 - i - 1))
+ g_print ("uh oh: %d ( %d )\n", g_array_index (garray, gint, i), 10000 - i - 1);
g_array_free (garray, TRUE);