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 *
rpl_calloc(size_t n,size_t s)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