0da8f74490fc6082b6e38755e97c30f4bd4bb128
[pspp-builds.git] / 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., 59 Temple Place - Suite 330, Boston, MA
18    02111-1307, USA. */
19
20 #include <config.h>
21 #include "alloc.h"
22 #include "error.h"
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include "str.h"
26
27 static void out_of_memory (void);
28 \f
29 /* Public functions. */
30
31 /* Allocates a block of SIZE bytes and returns it.
32    If SIZE is 0, returns a null pointer.
33    Aborts if unsuccessful. */
34 void *
35 xmalloc (size_t size)
36 {
37   void *vp;
38   if (size == 0)
39     return NULL;
40
41   vp = malloc (size);
42   if (!vp)
43     out_of_memory ();
44
45   return vp;
46 }
47
48 /* Allocates a block of SIZE bytes, fill it with all-bits-0, and
49    returns it.
50    If SIZE is 0, returns a null pointer.
51    Aborts if unsuccessful. */
52 void *
53 xcalloc (size_t size)
54 {
55   void *vp = xmalloc (size);
56   memset (vp, 0, size);
57   return vp;
58 }
59
60 /* If SIZE is 0, then block PTR is freed and a null pointer is
61    returned.
62    Otherwise, if PTR is a null pointer, then a new block is allocated
63    and returned.
64    Otherwise, block PTR is reallocated to be SIZE bytes in size and
65    the new location of the block is returned.
66    Aborts if unsuccessful. */
67 void *
68 xrealloc (void *ptr, size_t size)
69 {
70   void *vp;
71   if (!size)
72     {
73       if (ptr)
74         free (ptr);
75
76       return NULL;
77     }
78
79   if (ptr)
80     vp = realloc (ptr, size);
81   else
82     vp = malloc (size);
83
84   if (!vp)
85     out_of_memory ();
86
87   return vp;
88 }
89
90 /* Makes a copy of string S in malloc()'d memory and returns the copy.
91    S must not be a null pointer. */
92 char *
93 xstrdup (const char *s)
94 {
95   size_t size;
96   char *t;
97
98   assert (s != NULL);
99
100   size = strlen (s) + 1;
101
102   t = malloc (size);
103   if (!t)
104     out_of_memory ();
105
106   memcpy (t, s, size);
107   return t;
108 }
109 \f
110 /* Private functions. */
111
112 /* Report an out-of-memory condition and abort execution. */
113 static void
114 out_of_memory (void)
115 {
116   fprintf (stderr, "virtual memory exhausted\n");
117   exit (EXIT_FAILURE);
118 }