Move the malloc checking from module 'oset' to new module 'xoset'.
[gnulib.git] / lib / gl_array_oset.c
index 959de3f..1246f3a 100644 (file)
@@ -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 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2006.
 
    This program is free software: you can redistribute it and/or modify
@@ -22,8 +22,6 @@
 
 #include <stdlib.h>
 
-#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,