Update contrib.
     1 /* GLIB - Library of useful routines for C programming
 
     2  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
 
     3  * Portions copyright (c) 2006-2009 Nokia Corporation.  All rights reserved.
 
     5  * This library is free software; you can redistribute it and/or
 
     6  * modify it under the terms of the GNU Lesser General Public
 
     7  * License as published by the Free Software Foundation; either
 
     8  * version 2 of the License, or (at your option) any later version.
 
    10  * This library is distributed in the hope that it will be useful,
 
    11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
    12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
    13  * Lesser General Public License for more details.
 
    15  * You should have received a copy of the GNU Lesser General Public
 
    16  * License along with this library; if not, write to the
 
    17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 
    18  * Boston, MA 02111-1307, USA.
 
    22  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
 
    23  * file for a list of people on the GLib Team.  See the ChangeLog
 
    24  * files for a list of changes.  These files are distributed with
 
    25  * GLib at ftp://ftp.gtk.org/pub/gtk/. 
 
    41 #include "gmessages.h"
 
    47 #define g_mem_gc_friendly (*_g_mem_gc_friendly())
 
    48 #endif /* __SYMBIAN32__ */
 
    50 #define MIN_ARRAY_SIZE  16
 
    52 typedef struct _GRealArray  GRealArray;
 
    60   guint   zero_terminated : 1;
 
    64 #define g_array_elt_len(array,i) ((array)->elt_size * (i))
 
    65 #define g_array_elt_pos(array,i) ((array)->data + g_array_elt_len((array),(i)))
 
    66 #define g_array_elt_zero(array, pos, len) 				\
 
    67   (memset (g_array_elt_pos ((array), pos), 0,  g_array_elt_len ((array), len)))
 
    68 #define g_array_zero_terminate(array) G_STMT_START{			\
 
    69   if ((array)->zero_terminated)						\
 
    70     g_array_elt_zero ((array), (array)->len, 1);			\
 
    73 static gint g_nearest_pow        (gint        num) G_GNUC_CONST;
 
    74 static void g_array_maybe_expand (GRealArray *array,
 
    78 g_array_new (gboolean zero_terminated,
 
    82   return (GArray*) g_array_sized_new (zero_terminated, clear, elt_size, 0);
 
    85 EXPORT_C GArray* g_array_sized_new (gboolean zero_terminated,
 
    90   GRealArray *array = g_slice_new (GRealArray);
 
    95   array->zero_terminated = (zero_terminated ? 1 : 0);
 
    96   array->clear           = (clear ? 1 : 0);
 
    97   array->elt_size        = elt_size;
 
    99   if (array->zero_terminated || reserved_size != 0)
 
   101       g_array_maybe_expand (array, reserved_size);
 
   102       g_array_zero_terminate(array);
 
   105   return (GArray*) array;
 
   109 g_array_free (GArray   *array,
 
   110 	      gboolean  free_segment)
 
   114   g_return_val_if_fail (array, NULL);
 
   118       g_free (array->data);
 
   122     segment = array->data;
 
   124   g_slice_free1 (sizeof (GRealArray), array);
 
   130 g_array_append_vals (GArray       *farray,
 
   134   GRealArray *array = (GRealArray*) farray;
 
   136   g_array_maybe_expand (array, len);
 
   138   memcpy (g_array_elt_pos (array, array->len), data, 
 
   139 	  g_array_elt_len (array, len));
 
   143   g_array_zero_terminate (array);
 
   149 g_array_prepend_vals (GArray        *farray,
 
   153   GRealArray *array = (GRealArray*) farray;
 
   155   g_array_maybe_expand (array, len);
 
   157   g_memmove (g_array_elt_pos (array, len), g_array_elt_pos (array, 0), 
 
   158 	     g_array_elt_len (array, array->len));
 
   160   memcpy (g_array_elt_pos (array, 0), data, g_array_elt_len (array, len));
 
   164   g_array_zero_terminate (array);
 
   170 g_array_insert_vals (GArray        *farray,
 
   175   GRealArray *array = (GRealArray*) farray;
 
   177   g_array_maybe_expand (array, len);
 
   179   g_memmove (g_array_elt_pos (array, len + index_), 
 
   180 	     g_array_elt_pos (array, index_), 
 
   181 	     g_array_elt_len (array, array->len - index_));
 
   183   memcpy (g_array_elt_pos (array, index_), data, g_array_elt_len (array, len));
 
   187   g_array_zero_terminate (array);
 
   193 g_array_set_size (GArray *farray,
 
   196   GRealArray *array = (GRealArray*) farray;
 
   197   if (length > array->len)
 
   199       g_array_maybe_expand (array, length - array->len);
 
   202 	g_array_elt_zero (array, array->len, length - array->len);
 
   204   else if (G_UNLIKELY (g_mem_gc_friendly) && length < array->len)
 
   205     g_array_elt_zero (array, length, array->len - length);
 
   209   g_array_zero_terminate (array);
 
   215 g_array_remove_index (GArray *farray,
 
   218   GRealArray* array = (GRealArray*) farray;
 
   220   g_return_val_if_fail (array, NULL);
 
   222   g_return_val_if_fail (index_ < array->len, NULL);
 
   224   if (index_ != array->len - 1)
 
   225     g_memmove (g_array_elt_pos (array, index_),
 
   226 	       g_array_elt_pos (array, index_ + 1),
 
   227 	       g_array_elt_len (array, array->len - index_ - 1));
 
   231   if (G_UNLIKELY (g_mem_gc_friendly))
 
   232     g_array_elt_zero (array, array->len, 1);
 
   234     g_array_zero_terminate (array);
 
   240 g_array_remove_index_fast (GArray *farray,
 
   243   GRealArray* array = (GRealArray*) farray;
 
   245   g_return_val_if_fail (array, NULL);
 
   247   g_return_val_if_fail (index_ < array->len, NULL);
 
   249   if (index_ != array->len - 1)
 
   250     memcpy (g_array_elt_pos (array, index_), 
 
   251 	    g_array_elt_pos (array, array->len - 1),
 
   252 	    g_array_elt_len (array, 1));
 
   256   if (G_UNLIKELY (g_mem_gc_friendly))
 
   257     g_array_elt_zero (array, array->len, 1);
 
   259     g_array_zero_terminate (array);
 
   265 g_array_remove_range (GArray *farray,
 
   269   GRealArray *array = (GRealArray*) farray;
 
   271   g_return_val_if_fail (array, NULL);
 
   272   g_return_val_if_fail (index_ < array->len, NULL);
 
   273   g_return_val_if_fail (index_ + length <= array->len, NULL);
 
   275   if (index_ + length != array->len)
 
   276     g_memmove (g_array_elt_pos (array, index_), 
 
   277                g_array_elt_pos (array, index_ + length), 
 
   278                (array->len - (index_ + length)) * array->elt_size);
 
   280   array->len -= length;
 
   281   if (G_UNLIKELY (g_mem_gc_friendly))
 
   282     g_array_elt_zero (array, array->len, length);
 
   284     g_array_zero_terminate (array);
 
   290 g_array_sort (GArray       *farray,
 
   291 	      GCompareFunc  compare_func)
 
   293   GRealArray *array = (GRealArray*) farray;
 
   295   g_return_if_fail (array != NULL);
 
   304 g_array_sort_with_data (GArray           *farray,
 
   305 			GCompareDataFunc  compare_func,
 
   308   GRealArray *array = (GRealArray*) farray;
 
   310   g_return_if_fail (array != NULL);
 
   312   g_qsort_with_data (array->data,
 
   321 g_nearest_pow (gint num)
 
   332 g_array_maybe_expand (GRealArray *array,
 
   335   guint want_alloc = g_array_elt_len (array, array->len + len + 
 
   336 				      array->zero_terminated);
 
   338   if (want_alloc > array->alloc)
 
   340       want_alloc = g_nearest_pow (want_alloc);
 
   341       want_alloc = MAX (want_alloc, MIN_ARRAY_SIZE);
 
   343       array->data = g_realloc (array->data, want_alloc);
 
   345       if (G_UNLIKELY (g_mem_gc_friendly))
 
   346         memset (array->data + array->alloc, 0, want_alloc - array->alloc);
 
   348       array->alloc = want_alloc;
 
   355 typedef struct _GRealPtrArray  GRealPtrArray;
 
   357 struct _GRealPtrArray
 
   364 static void g_ptr_array_maybe_expand (GRealPtrArray *array,
 
   368 g_ptr_array_new (void)
 
   370   return g_ptr_array_sized_new (0);
 
   374 g_ptr_array_sized_new (guint reserved_size)
 
   376   GRealPtrArray *array = g_slice_new (GRealPtrArray);
 
   382   if (reserved_size != 0)
 
   383     g_ptr_array_maybe_expand (array, reserved_size);
 
   385   return (GPtrArray*) array;  
 
   389 g_ptr_array_free (GPtrArray *array,
 
   390 		  gboolean   free_segment)
 
   394   g_return_val_if_fail (array, NULL);
 
   398       g_free (array->pdata);
 
   402     segment = array->pdata;
 
   404   g_slice_free1 (sizeof (GRealPtrArray), array);
 
   410 g_ptr_array_maybe_expand (GRealPtrArray *array,
 
   413   if ((array->len + len) > array->alloc)
 
   415       guint old_alloc = array->alloc;
 
   416       array->alloc = g_nearest_pow (array->len + len);
 
   417       array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
 
   418       array->pdata = g_realloc (array->pdata, sizeof (gpointer) * array->alloc);
 
   419       if (G_UNLIKELY (g_mem_gc_friendly))
 
   420         for ( ; old_alloc < array->alloc; old_alloc++)
 
   421           array->pdata [old_alloc] = NULL;
 
   426 g_ptr_array_set_size  (GPtrArray *farray,
 
   429   GRealPtrArray* array = (GRealPtrArray*) farray;
 
   431   g_return_if_fail (array);
 
   433   if (length > array->len)
 
   436       g_ptr_array_maybe_expand (array, (length - array->len));
 
   438        *     memset (array->pdata + array->len, 0,
 
   439        *            sizeof (gpointer) * (length - array->len));
 
   440        * to make it really portable. Remember (void*)NULL needn't be
 
   441        * bitwise zero. It of course is silly not to use memset (..,0,..).
 
   443       for (i = array->len; i < length; i++)
 
   444 	array->pdata[i] = NULL;
 
   446   if (G_UNLIKELY (g_mem_gc_friendly) && length < array->len)
 
   449       for (i = length; i < array->len; i++)
 
   450 	array->pdata[i] = NULL;
 
   457 g_ptr_array_remove_index (GPtrArray *farray,
 
   460   GRealPtrArray* array = (GRealPtrArray*) farray;
 
   463   g_return_val_if_fail (array, NULL);
 
   465   g_return_val_if_fail (index_ < array->len, NULL);
 
   467   result = array->pdata[index_];
 
   469   if (index_ != array->len - 1)
 
   470     g_memmove (array->pdata + index_, array->pdata + index_ + 1, 
 
   471 	       sizeof (gpointer) * (array->len - index_ - 1));
 
   475   if (G_UNLIKELY (g_mem_gc_friendly))
 
   476     array->pdata[array->len] = NULL;
 
   482 g_ptr_array_remove_index_fast (GPtrArray *farray,
 
   485   GRealPtrArray* array = (GRealPtrArray*) farray;
 
   488   g_return_val_if_fail (array, NULL);
 
   490   g_return_val_if_fail (index_ < array->len, NULL);
 
   492   result = array->pdata[index_];
 
   494   if (index_ != array->len - 1)
 
   495     array->pdata[index_] = array->pdata[array->len - 1];
 
   499   if (G_UNLIKELY (g_mem_gc_friendly))
 
   500     array->pdata[array->len] = NULL;
 
   506 g_ptr_array_remove_range (GPtrArray *farray,
 
   510   GRealPtrArray* array = (GRealPtrArray*) farray;
 
   512   g_return_if_fail (array);
 
   513   g_return_if_fail (index_ < array->len);
 
   514   g_return_if_fail (index_ + length <= array->len);
 
   516   if (index_ + length != array->len)
 
   517     g_memmove (&array->pdata[index_],
 
   518                &array->pdata[index_ + length], 
 
   519                (array->len - (index_ + length)) * sizeof (gpointer));
 
   521   array->len -= length;
 
   522   if (G_UNLIKELY (g_mem_gc_friendly))
 
   525       for (i = 0; i < length; i++)
 
   526         array->pdata[array->len + i] = NULL;
 
   531 g_ptr_array_remove (GPtrArray *farray,
 
   534   GRealPtrArray* array = (GRealPtrArray*) farray;
 
   537   g_return_val_if_fail (array, FALSE);
 
   539   for (i = 0; i < array->len; i += 1)
 
   541       if (array->pdata[i] == data)
 
   543 	  g_ptr_array_remove_index (farray, i);
 
   552 g_ptr_array_remove_fast (GPtrArray *farray,
 
   555   GRealPtrArray* array = (GRealPtrArray*) farray;
 
   558   g_return_val_if_fail (array, FALSE);
 
   560   for (i = 0; i < array->len; i += 1)
 
   562       if (array->pdata[i] == data)
 
   564 	  g_ptr_array_remove_index_fast (farray, i);
 
   573 g_ptr_array_add (GPtrArray *farray,
 
   576   GRealPtrArray* array = (GRealPtrArray*) farray;
 
   578   g_return_if_fail (array);
 
   580   g_ptr_array_maybe_expand (array, 1);
 
   582   array->pdata[array->len++] = data;
 
   586 g_ptr_array_sort (GPtrArray    *array,
 
   587 		  GCompareFunc  compare_func)
 
   589   g_return_if_fail (array != NULL);
 
   598 g_ptr_array_sort_with_data (GPtrArray        *array,
 
   599 			    GCompareDataFunc  compare_func,
 
   602   g_return_if_fail (array != NULL);
 
   604   g_qsort_with_data (array->pdata,
 
   612  * g_ptr_array_foreach:
 
   613  * @array: a #GPtrArray
 
   614  * @func: the function to call for each array element
 
   615  * @user_data: user data to pass to the function
 
   617  * Calls a function for each element of a #GPtrArray.
 
   622 g_ptr_array_foreach (GPtrArray *array,
 
   628   g_return_if_fail (array);
 
   630   for (i = 0; i < array->len; i++)
 
   631     (*func) (array->pdata[i], user_data);
 
   637 EXPORT_C GByteArray* g_byte_array_new (void)
 
   639   return (GByteArray*) g_array_sized_new (FALSE, FALSE, 1, 0);
 
   642 EXPORT_C GByteArray* g_byte_array_sized_new (guint reserved_size)
 
   644   return (GByteArray*) g_array_sized_new (FALSE, FALSE, 1, reserved_size);
 
   647 EXPORT_C guint8*	    g_byte_array_free     (GByteArray *array,
 
   648 			           gboolean    free_segment)
 
   650   return (guint8*) g_array_free ((GArray*) array, free_segment);
 
   653 EXPORT_C GByteArray* g_byte_array_append   (GByteArray   *array,
 
   657   g_array_append_vals ((GArray*) array, (guint8*)data, len);
 
   662 EXPORT_C GByteArray* g_byte_array_prepend  (GByteArray   *array,
 
   666   g_array_prepend_vals ((GArray*) array, (guint8*)data, len);
 
   671 EXPORT_C GByteArray* g_byte_array_set_size (GByteArray *array,
 
   674   g_array_set_size ((GArray*) array, length);
 
   679 EXPORT_C GByteArray* g_byte_array_remove_index (GByteArray *array,
 
   682   g_array_remove_index ((GArray*) array, index_);
 
   687 EXPORT_C GByteArray* g_byte_array_remove_index_fast (GByteArray *array,
 
   690   g_array_remove_index_fast ((GArray*) array, index_);
 
   696 g_byte_array_remove_range (GByteArray *array,
 
   700   g_return_val_if_fail (array, NULL);
 
   701   g_return_val_if_fail (index_ < array->len, NULL);
 
   702   g_return_val_if_fail (index_ + length <= array->len, NULL);
 
   704   return (GByteArray *)g_array_remove_range ((GArray*) array, index_, length);
 
   708 g_byte_array_sort (GByteArray   *array,
 
   709 		   GCompareFunc  compare_func)
 
   711   g_array_sort ((GArray *) array, compare_func);
 
   715 g_byte_array_sort_with_data (GByteArray       *array,
 
   716 			     GCompareDataFunc  compare_func,
 
   719   g_array_sort_with_data ((GArray *) array, compare_func, user_data);
 
   722 #define __G_ARRAY_C__
 
   723 #include "galiasdef.c"