Revise.
[pspp] / src / alloc.c
index 1aaba30579d4bae63477671a2943c9ed923a9366..8d1e39a633e78a967a1315b6c799e72afd33bd22 100644 (file)
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA. */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA. */
 
 #include <config.h>
 #include "alloc.h"
-#include "error.h"
 #include <stdio.h>
 #include <stdlib.h>
+#include "error.h"
 #include "str.h"
 \f
 /* Public functions. */
@@ -43,18 +43,31 @@ xmalloc (size_t size)
   return vp;
 }
 
-/* Allocates a block of SIZE bytes, fill it with all-bits-0, and
-   returns it.
-   If SIZE is 0, returns a null pointer.
-   Aborts if unsuccessful. */
+
+/* Allocates a continous block of N_MEMB by SIZE elements, with all
+   bits set to 0.
+   Aborts if unsuccessful.
+*/
 void *
-xcalloc (size_t size)
+xcalloc (size_t n_memb, size_t size)
 {
-  void *vp = xmalloc (size);
-  memset (vp, 0, size);
+  const size_t prod = size * n_memb; 
+  void *vp = 0;
+
+  if (prod == 0)
+    return NULL;
+
+  /* Trap overflow errors */
+  assert ( prod >= size );
+  assert ( prod >= n_memb ) ;
+
+  vp = xmalloc ( prod );
+  memset (vp, 0, prod);
   return vp;
 }
 
+
+
 /* If SIZE is 0, then block PTR is freed and a null pointer is
    returned.
    Otherwise, if PTR is a null pointer, then a new block is allocated