e86fb0707c687a64c4781f9f665bbee7e97a4eac
[oweals/tinc.git] / lib / xmalloc.c
1 /* xmalloc.c -- malloc with out of memory checking
2    Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2, or (at your option)
7    any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, write to the Free Software Foundation,
16    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
17
18 #if HAVE_CONFIG_H
19 # include <config.h>
20 #endif
21
22 #include <sys/types.h>
23 #include <stdio.h>
24 #include <string.h>
25
26 #if STDC_HEADERS
27 # include <stdlib.h>
28 #else
29 void *calloc ();
30 void *malloc ();
31 void *realloc ();
32 void free ();
33 #endif
34
35 #if ENABLE_NLS
36 # include <libintl.h>
37 # define _(Text) gettext (Text)
38 #else
39 # define textdomain(Domain)
40 # define _(Text) Text
41 #endif
42 #define N_(Text) Text
43
44 #include "xalloc.h"
45
46 #ifndef EXIT_FAILURE
47 # define EXIT_FAILURE 1
48 #endif
49
50 /* Prototypes for functions defined here.  */
51 #if defined (__STDC__) && __STDC__
52 void *xmalloc (size_t n);
53 void *xcalloc (size_t n, size_t s);
54 void *xrealloc (void *p, size_t n);
55 #endif
56
57 #ifndef HAVE_DONE_WORKING_MALLOC_CHECK
58 #error you must run the autoconf test for a properly working malloc -- see malloc.m4
59 #endif
60
61 #ifndef HAVE_DONE_WORKING_REALLOC_CHECK
62 #error you must run the autoconf test for a properly working realloc -- see realloc.m4
63 #endif
64
65 /* Exit value when the requested amount of memory is not available.
66    The caller may set it to some other value.  */
67 int xalloc_exit_failure = EXIT_FAILURE;
68
69 /* FIXME: describe */
70 char *const xalloc_msg_memory_exhausted = N_("Memory exhausted");
71
72 /* FIXME: describe */
73 void (*xalloc_fail_func) (int) = 0;
74
75 static void
76 xalloc_fail (int size)
77 {
78   if (xalloc_fail_func)
79     (*xalloc_fail_func) (size);
80   fprintf(stderr, "%s\n", xalloc_msg_memory_exhausted);
81   exit(xalloc_exit_failure);
82 }
83
84 /* Allocate N bytes of memory dynamically, with error checking.  */
85
86 void *
87 xmalloc (n)
88      size_t n;
89 {
90   void *p;
91
92   p = malloc (n);
93   if (p == 0)
94     xalloc_fail ((int)n);
95   return p;
96 }
97
98 /* Allocate N bytes of memory dynamically, and set it all to zero. */
99
100 void *
101 xmalloc_and_zero (n)
102      size_t n;
103 {
104   void *p;
105
106   p = malloc (n);
107   if (p == 0)
108     xalloc_fail ((int)n);
109   memset (p, '\0', n);
110   return p;
111 }
112
113 /* Change the size of an allocated block of memory P to N bytes,
114    with error checking.
115    If P is NULL, run xmalloc.  */
116
117 void *
118 xrealloc (p, n)
119      void *p;
120      size_t n;
121 {
122   p = realloc (p, n);
123   if (p == 0)
124     xalloc_fail (n);
125   return p;
126 }
127
128 /* Duplicate a string */
129
130 char *xstrdup(char *s)
131 {
132   char *p;
133   
134   p = strdup(s);
135   if(!p)
136     xalloc_fail ((int)strlen(s));
137   return p;
138 }
139
140 #ifdef NOT_USED
141
142 /* Allocate memory for N elements of S bytes, with error checking.  */
143
144 void *
145 xcalloc (n, s)
146      size_t n, s;
147 {
148   void *p;
149
150   p = calloc (n, s);
151   if (p == 0)
152     xalloc_fail ();
153   return p;
154 }
155
156 #endif /* NOT_USED */