Home | History | Annotate | Download | only in lib
      1 /* calloc() function that is glibc compatible.
      2    This wrapper function is required at least on Tru64 UNIX 5.1 and mingw.
      3    Copyright (C) 2004-2007, 2009-2012 Free Software Foundation, Inc.
      4 
      5    This program is free software: you can redistribute it and/or modify
      6    it under the terms of the GNU General Public License as published by
      7    the Free Software Foundation; either version 3 of the License, or
      8    (at your option) any later version.
      9 
     10    This program 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
     13    GNU General Public License for more details.
     14 
     15    You should have received a copy of the GNU General Public License
     16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     17 
     18 /* written by Jim Meyering and Bruno Haible */
     19 
     20 #include <config.h>
     21 /* Only the AC_FUNC_CALLOC macro defines 'calloc' already in config.h.  */
     22 #ifdef calloc
     23 # define NEED_CALLOC_GNU 1
     24 # undef calloc
     25 /* Whereas the gnulib module 'calloc-gnu' defines HAVE_CALLOC_GNU.  */
     26 #elif GNULIB_CALLOC_GNU && !HAVE_CALLOC_GNU
     27 # define NEED_CALLOC_GNU 1
     28 #endif
     29 
     30 /* Specification.  */
     31 #include <stdlib.h>
     32 
     33 #include <errno.h>
     34 
     35 /* Call the system's calloc below.  */
     36 #undef calloc
     37 
     38 /* Allocate and zero-fill an NxS-byte block of memory from the heap.
     39    If N or S is zero, allocate and zero-fill a 1-byte block.  */
     40 
     41 void *
     42 rpl_calloc (size_t n, size_t s)
     43 {
     44   void *result;
     45 
     46 #if NEED_CALLOC_GNU
     47   if (n == 0 || s == 0)
     48     {
     49       n = 1;
     50       s = 1;
     51     }
     52   else
     53     {
     54       /* Defend against buggy calloc implementations that mishandle
     55          size_t overflow.  */
     56       size_t bytes = n * s;
     57       if (bytes / s != n)
     58         {
     59           errno = ENOMEM;
     60           return NULL;
     61         }
     62     }
     63 #endif
     64 
     65   result = calloc (n, s);
     66 
     67 #if !HAVE_CALLOC_POSIX
     68   if (result == NULL)
     69     errno = ENOMEM;
     70 #endif
     71 
     72   return result;
     73 }
     74