Add vasprintf to the Cygwin build
[mono.git] / eglib / src / garray.c
index 8844ee5db86071ccf7854f0d86f3bf141b9d46ea..dadb6caa1834cbb370ee3fb4ae02cc6f6a6a2085 100644 (file)
@@ -26,7 +26,6 @@
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#define _GNU_SOURCE
 #include <stdlib.h>
 #include <glib.h>
 
@@ -86,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
@@ -103,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),
@@ -127,18 +131,21 @@ g_array_insert_vals (GArray *array,
                     guint len)
 {
        GArrayPriv *priv = (GArrayPriv*)array;
+       guint extra = (priv->zero_terminated ? 1 : 0);
+
+       g_return_val_if_fail (array != NULL, NULL);
 
-       ensure_capacity (priv, array->len + len + (priv->zero_terminated ? 1 : 0));
+       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;
 
@@ -157,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_));
@@ -171,3 +180,27 @@ g_array_remove_index (GArray *array,
 
        return array;
 }
+
+GArray*
+g_array_remove_index_fast (GArray *array,
+                     guint index_)
+{
+       GArrayPriv *priv = (GArrayPriv*)array;
+
+       g_return_val_if_fail (array != NULL, NULL);
+
+       memmove (element_offset (priv, index_),
+                element_offset (priv, array->len - 1),
+                element_length (priv, 1));
+
+       array->len --;
+
+       if (priv->zero_terminated) {
+               memset (element_offset (priv, priv->array.len),
+                       0,
+                       priv->element_size);
+       }
+
+       return array;
+}
+