g10: Fix card-edit/fetch to use keyserver_fetch.
[gnupg.git] / jnlib / xmalloc.c
1 /* xmalloc.c -  standard malloc wrappers
2  *      Copyright (C) 1999, 2000, 2001, 2006 Free Software Foundation, Inc.
3  *
4  * This file is part of JNLIB.
5  *
6  * JNLIB is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 3 of
9  * the License, or (at your option) any later version.
10  *
11  * JNLIB is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <stdio.h>
24
25 #include "libjnlib-config.h"
26 #include "xmalloc.h"
27
28 static void
29 out_of_core(void)
30 {
31     fputs("\nfatal: out of memory\n", stderr );
32     exit(2);
33 }
34
35
36 void *
37 xmalloc( size_t n )
38 {
39     void *p;
40
41     /* Make sure that xmalloc (0) works.  This is the same behaviour
42        has in gpg 2.x.  Note that in contrast to this code, Libgcrypt
43        (and thus most xmallocs in gpg 2.x) detect the !n and bail out.  */
44     if (!n)
45       n = 1;
46
47     p = malloc( n );
48     if( !p )
49         out_of_core();
50     return p;
51 }
52
53 void *
54 xrealloc( void *a, size_t n )
55 {
56     void *p = realloc( a, n );
57     if( !p )
58         out_of_core();
59     return p;
60 }
61
62 void *
63 xcalloc( size_t n, size_t m )
64 {
65     void *p;
66
67     if (!n)
68       n = 1;
69     if (!m)
70       m = 1;
71
72     p = calloc( n, m );
73     if( !p )
74         out_of_core();
75     return p;
76 }
77
78 char *
79 xstrdup( const char *string )
80 {
81     void *p = xmalloc( strlen(string)+1 );
82     strcpy( p, string );
83     return p;
84 }
85
86
87 char *
88 xstrcat2( const char *a, const char *b )
89 {
90     size_t n1;
91     char *p;
92
93     if( !b )
94         return xstrdup( a );
95
96     n1 = strlen(a);
97     p = xmalloc( n1 + strlen(b) + 1 );
98     memcpy(p, a, n1 );
99     strcpy(p+n1, b );
100     return p;
101 }
102