X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fadt%2Farray.c;h=6f9618482bee0a1960ac0e16b622862570b2e634;hb=2ea59d24639602c1e2f1a1a18dd687b2e5c5c2a8;hp=b73eac2cafab79163354bca7946cf397d2e5fe6e;hpb=fbcb96cc20a7b5d06136e4c70870e86173e658eb;p=libfirm diff --git a/ir/adt/array.c b/ir/adt/array.c index b73eac2ca..6f9618482 100644 --- a/ir/adt/array.c +++ b/ir/adt/array.c @@ -11,10 +11,12 @@ */ #ifdef HAVE_CONFIG_H -# include +# include "config.h" #endif -#include +#ifdef HAVE_STDLIB_H +# include +#endif #include "array.h" #include "xmalloc.h" @@ -32,12 +34,27 @@ # define MIN(a,b) ((a) > (b) ? (b) : (a)) #endif +/** + * An empty dynamic array + */ _arr_descr arr_mt_descr #ifndef NDEBUG = { ARR_D_MAGIC } #endif ; +/** + * Creates a dynamic array on a obstack. + * + * @param obstack An struct obstack * were the data will be allocated + * @param nelts The number of elements + * @param elts_size The size of the array elements. + * + * @return A pointer to the dynamic array (can be used as a pointer to the + * first element of this array). + * + * @remark Helper function, use NEW_ARR_D() instead. + */ void * _new_arr_d (struct obstack *obstack, int nelts, size_t elts_size) { @@ -52,7 +69,17 @@ _new_arr_d (struct obstack *obstack, int nelts, size_t elts_size) return new->v.elts; } - +/** + * Creates a flexible array. + * + * @param nelts The number of elements + * @param elts_size The size of the array elements. + * + * @return A pointer to the flexible array (can be used as a pointer to the + * first element of this array). + * + * @remark Helper function, use NEW_ARR_F() instead. + */ void * _new_arr_f (int nelts, size_t elts_size) { @@ -65,28 +92,45 @@ _new_arr_f (int nelts, size_t elts_size) return new->v.elts; } - +/** + * Delete a flexible array. + * + * @param elts The flexible array (pointer to the first element). + * + * @remark Helper function, use DEL_ARR_F() instead. + */ void _del_arr_f (void *elts) { _arr_descr *dp = _ARR_DESCR (elts); ARR_VRFY (elts); - assert (dp->cookie == ARR_F_MAGIC); + assert (dp->magic == ARR_F_MAGIC); #ifndef NDEBUG - dp->cookie = 0xdeadbeef; + dp->magic = 0xdeadbeef; #endif free (dp); } - +/** + * Resize a flexible array, always reallocate data. + * + * @param elts The flexible array (pointer to the first element). + * @param nelts The new number of elements. + * @param elts_size The size of the array elements. + * + * @return A resized flexible array, possibly other address than + * elts. + * + * @remark Helper function, use ARR_SETLEN() instead. + */ void * _arr_setlen (void *elts, int nelts, size_t elts_size) { _arr_descr *dp = _ARR_DESCR (elts); - assert ((dp->cookie == ARR_F_MAGIC) && (nelts >= 0)); + assert ((dp->magic == ARR_F_MAGIC) && (nelts >= 0)); ARR_VRFY (elts); assert (!dp->eltsize || !nelts || (dp->eltsize == elts_size/nelts)); @@ -96,14 +140,26 @@ _arr_setlen (void *elts, int nelts, size_t elts_size) return dp->v.elts; } -\ +/** + * Resize a flexible array, allocate more data if needed but do NOT + * reduce. + * + * @param elts The flexible array (pointer to the first element). + * @param nelts The new number of elements. + * @param eltsize The size of the array elements. + * + * @return A resized flexible array, possibly other address than + * elts. + * + * @remark Helper function, use ARR_RESIZE() instead. + */ void * _arr_resize (void *elts, int nelts, size_t eltsize) { _arr_descr *dp = _ARR_DESCR (elts); int n; - assert ((dp->cookie == ARR_F_MAGIC) && (nelts >= 0)); + assert ((dp->magic == ARR_F_MAGIC) && (nelts >= 0)); ARR_VRFY (elts); assert (dp->eltsize ? dp->eltsize == eltsize : (dp->eltsize = eltsize, 1)); @@ -125,3 +181,25 @@ _arr_resize (void *elts, int nelts, size_t eltsize) return dp->v.elts; } + +#ifdef DEBUG_libfirm +/** + * This function returns the length of a flexible array. + * Do NOT use is in code, use ARR_LEN() macro! + * This function is intended to be called from a debugger. + */ +int array_len(void *arr) { + return ARR_LEN(arr); +} + +/** + * This function returns the array descriptor of a flexible array. + * Do NOT use is in code!. + * This function is intended to be called from a debugger. + */ +_arr_descr *array_descr(void *arr) { + if (! arr) + return NULL; + return _ARR_DESCR(arr); +} +#endif /* DEBUG_libfirm */