8d1e39a633e78a967a1315b6c799e72afd33bd22
[pspp] / src / alloc.c
1 /* PSPP - computes sample statistics.
2    Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
3    Written by Ben Pfaff <blp@gnu.org>.
4
5    This program is free software; you can redistribute it and/or
6    modify it under the terms of the GNU General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful, but
11    WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    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, write to the Free Software
17    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18    02110-1301, USA. */
19
20 #include <config.h>
21 #include "alloc.h"
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include "error.h"
25 #include "str.h"
26 \f
27 /* Public functions. */
28
29 /* Allocates a block of SIZE bytes and returns it.
30    If SIZE is 0, returns a null pointer.
31    Aborts if unsuccessful. */
32 void *
33 xmalloc (size_t size)
34 {
35   void *vp;
36   if (size == 0)
37     return NULL;
38
39   vp = malloc (size);
40   if (!vp)
41     out_of_memory ();
42
43   return vp;
44 }
45
46
47 /* Allocates a continous block of N_MEMB by SIZE elements, with all
48    bits set to 0.
49    Aborts if unsuccessful.
50 */
51 void *
52 xcalloc (size_t n_memb, size_t size)
53 {
54   const size_t prod = size * n_memb; 
55   void *vp = 0;
56
57   if (prod == 0)
58     return NULL;
59
60   /* Trap overflow errors */
61   assert ( prod >= size );
62   assert ( prod >= n_memb ) ;
63
64   vp = xmalloc ( prod );
65   memset (vp, 0, prod);
66   return vp;
67 }
68
69
70
71 /* If SIZE is 0, then block PTR is freed and a null pointer is
72    returned.
73    Otherwise, if PTR is a null pointer, then a new block is allocated
74    and returned.
75    Otherwise, block PTR is reallocated to be SIZE bytes in size and
76    the new location of the block is returned.
77    Aborts if unsuccessful. */
78 void *
79 xrealloc (void *ptr, size_t size)
80 {
81   void *vp;
82   if (!size)
83     {
84       if (ptr)
85         free (ptr);
86
87       return NULL;
88     }
89
90   if (ptr)
91     vp = realloc (ptr, size);
92   else
93     vp = malloc (size);
94
95   if (!vp)
96     out_of_memory ();
97
98   return vp;
99 }
100
101 /* Makes a copy of string S in malloc()'d memory and returns the copy.
102    S must not be a null pointer. */
103 char *
104 xstrdup (const char *s)
105 {
106   size_t size;
107   char *t;
108
109   assert (s != NULL);
110
111   size = strlen (s) + 1;
112
113   t = malloc (size);
114   if (!t)
115     out_of_memory ();
116
117   memcpy (t, s, size);
118   return t;
119 }
120
121 /* Report an out-of-memory condition and abort execution. */
122 void
123 out_of_memory (void)
124 {
125   fprintf (stderr, "virtual memory exhausted\n");
126   exit (EXIT_FAILURE);
127 }