X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fgl_array_oset.c;h=a6d4584cca790eff69b2eaed0032a96986412035;hb=de6abddc83cd9af7a0cc73d93acbc015432612f2;hp=959de3f22615ee7027aad6bacacc9434e1553091;hpb=441aa3044f43e5572f58c354f01e6bc070acd5c7;p=gnulib.git diff --git a/lib/gl_array_oset.c b/lib/gl_array_oset.c index 959de3f22..a6d4584cc 100644 --- a/lib/gl_array_oset.c +++ b/lib/gl_array_oset.c @@ -1,5 +1,5 @@ /* Ordered set data type implemented by an array. - Copyright (C) 2006-2007 Free Software Foundation, Inc. + Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc. Written by Bruno Haible , 2006. This program is free software: you can redistribute it and/or modify @@ -22,8 +22,6 @@ #include -#include "xalloc.h" - /* Checked size_t computations. */ #include "xsize.h" @@ -41,11 +39,15 @@ struct gl_oset_impl }; static gl_oset_t -gl_array_create_empty (gl_oset_implementation_t implementation, - gl_setelement_compar_fn compar_fn, - gl_setelement_dispose_fn dispose_fn) +gl_array_nx_create_empty (gl_oset_implementation_t implementation, + gl_setelement_compar_fn compar_fn, + gl_setelement_dispose_fn dispose_fn) { - struct gl_oset_impl *set = XMALLOC (struct gl_oset_impl); + struct gl_oset_impl *set = + (struct gl_oset_impl *) malloc (sizeof (struct gl_oset_impl)); + + if (set == NULL) + return NULL; set->base.vtable = implementation; set->base.compar_fn = compar_fn; @@ -155,8 +157,9 @@ gl_array_search_atleast (gl_oset_t set, return false; } -/* Ensure that set->allocated > set->count. */ -static void +/* Ensure that set->allocated > set->count. + Return 0 upon success, -1 upon out-of-memory. */ +static int grow (gl_oset_t set) { size_t new_allocated; @@ -168,31 +171,35 @@ grow (gl_oset_t set) memory_size = xtimes (new_allocated, sizeof (const void *)); if (size_overflow_p (memory_size)) /* Overflow, would lead to out of memory. */ - xalloc_die (); - memory = (const void **) xrealloc (set->elements, memory_size); + return -1; + memory = (const void **) realloc (set->elements, memory_size); if (memory == NULL) /* Out of memory. */ - xalloc_die (); + return -1; set->elements = memory; set->allocated = new_allocated; + return 0; } /* Add the given element ELT at the given position, - 0 <= position <= gl_oset_size (set). */ -static inline void -gl_array_add_at (gl_oset_t set, size_t position, const void *elt) + 0 <= position <= gl_oset_size (set). + Return 1 upon success, -1 upon out-of-memory. */ +static inline int +gl_array_nx_add_at (gl_oset_t set, size_t position, const void *elt) { size_t count = set->count; const void **elements; size_t i; if (count == set->allocated) - grow (set); + if (grow (set) < 0) + return -1; elements = set->elements; for (i = count; i > position; i--) elements[i] = elements[i - 1]; elements[position] = elt; set->count = count + 1; + return 1; } /* Remove the element at the given position, @@ -212,8 +219,8 @@ gl_array_remove_at (gl_oset_t set, size_t position) set->count = count - 1; } -static bool -gl_array_add (gl_oset_t set, const void *elt) +static int +gl_array_nx_add (gl_oset_t set, const void *elt) { size_t count = set->count; size_t low = 0; @@ -244,8 +251,7 @@ gl_array_add (gl_oset_t set, const void *elt) } while (low < high); } - gl_array_add_at (set, low, elt); - return true; + return gl_array_nx_add_at (set, low, elt); } static bool @@ -338,11 +344,11 @@ gl_array_iterator_free (gl_oset_iterator_t *iterator) const struct gl_oset_implementation gl_array_oset_implementation = { - gl_array_create_empty, + gl_array_nx_create_empty, gl_array_size, gl_array_search, gl_array_search_atleast, - gl_array_add, + gl_array_nx_add, gl_array_remove, gl_array_free, gl_array_iterator,