2007-10-19 Marek Habersack <mhabersack@novell.com>
[mono.git] / eglib / src / garray.c
index 2fc6cbba7c7ff5eecabba821ae45b6c392d456d9..e9605d0f7862dba4bde3aa0a3e7d56dc7d2a7ef1 100644 (file)
@@ -25,8 +25,7 @@
  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
-#define _GNU_SOURCE
+
 #include <stdlib.h>
 #include <glib.h>
 
 #define element_length(p,i) ((i) * (p)->element_size)
 
 typedef struct {
-  GArray array;
-  gboolean clear_;
-  gboolean element_size;
-  gboolean zero_terminated;
-  gint capacity;
+       GArray array;
+       gboolean clear_;
+       gboolean element_size;
+       gboolean zero_terminated;
+       gint capacity;
 } GArrayPriv;
 
 static void
 ensure_capacity (GArrayPriv *priv,
                 int capacity)
 {
+       int new_capacity = MAX (priv->capacity, INITIAL_CAPACITY);
+
        if (capacity < priv->capacity)
                return;
 
-       if (priv->array.data == NULL)
-               priv->array.data = (gchar*)g_malloc (element_length (priv, capacity));
-       else
-               priv->array.data = (gchar*)g_realloc (priv->array.data,
-                                                     element_length (priv, capacity));
+       while (new_capacity < capacity) {
+               new_capacity <<= 1;
+       }
+       capacity = new_capacity;
+       priv->array.data = (gchar*)g_realloc (priv->array.data, element_length (priv, capacity));
 
        if (priv->clear_) {
                memset (element_offset (priv, priv->capacity),
@@ -84,6 +85,9 @@ g_array_free (GArray *array,
              gboolean free_segment)
 {
        gchar* rv = NULL;
+
+       g_return_val_if_fail (array != NULL, NULL);
+
        if (free_segment)
                g_free (array->data);
        else
@@ -101,6 +105,8 @@ g_array_append_vals (GArray *array,
 {
        GArrayPriv *priv = (GArrayPriv*)array;
 
+       g_return_val_if_fail (array != NULL, NULL);
+
        ensure_capacity (priv, priv->array.len + len + (priv->zero_terminated ? 1 : 0));
   
        memmove (element_offset (priv, priv->array.len),
@@ -125,18 +131,21 @@ g_array_insert_vals (GArray *array,
                     guint len)
 {
        GArrayPriv *priv = (GArrayPriv*)array;
+       guint extra = (priv->zero_terminated ? 1 : 0);
 
-       ensure_capacity (priv, array->len + len + (priv->zero_terminated ? 1 : 0));
+       g_return_val_if_fail (array != NULL, NULL);
+
+       ensure_capacity (priv, array->len + len + extra);
   
        /* first move the existing elements out of the way */
        memmove (element_offset (priv, index_ + len),
                 element_offset (priv, index_),
-                element_length (priv, len - index_));
+                element_length (priv, array->len - index_));
 
        /* then copy the new elements into the array */
-       memmove (element_offset (priv, array->len),
+       memmove (element_offset (priv, index_),
                 data,
-                element_length (priv, index_));
+                element_length (priv, len));
 
        array->len += len;
 
@@ -155,6 +164,8 @@ g_array_remove_index (GArray *array,
 {
        GArrayPriv *priv = (GArrayPriv*)array;
 
+       g_return_val_if_fail (array != NULL, NULL);
+
        memmove (element_offset (priv, index_),
                 element_offset (priv, index_ + 1),
                 element_length (priv, array->len - index_));
@@ -169,3 +180,4 @@ g_array_remove_index (GArray *array,
 
        return array;
 }
+