I have to keep on working on this beast.
[libksba.git] / src / util.c
1 /* util.c
2  *      Copyright (C) 2001 g10 Code GmbH
3  *
4  * This file is part of KSBA.
5  *
6  * KSBA is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * KSBA is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <assert.h>
26
27 #include "util.h"
28
29 static void *(*alloc_func)(size_t n) = malloc;
30 static void *(*realloc_func)(void *p, size_t n) = realloc;
31 static void (*free_func)(void*) = free;
32
33
34 void
35 ksba_set_malloc_hooks ( void *(*new_alloc_func)(size_t n),
36                         void *(*new_realloc_func)(void *p, size_t n),
37                         void (*new_free_func)(void*) )
38 {
39   alloc_func        = new_alloc_func;
40   realloc_func      = new_realloc_func;
41   free_func         = new_free_func;
42 }
43
44
45
46 /* Wrapper for the common memory allocation functions.  These are here
47    so that we can add hooks.  The corresponding macros should be used.
48    These macros are not named xfoo() because this name is commonly
49    used for function which die on errror.  We use macronames like
50    xtryfoo() instead. */
51
52 void *
53 ksba_malloc (size_t n )
54 {
55   return alloc_func (n);
56 }
57
58 void *
59 ksba_calloc (size_t n, size_t m )
60 {
61   void *p = ksba_malloc (n*m);
62   if (p)
63     memset (p, 0, n*m);
64   return p;
65 }
66
67 void *
68 ksba_realloc (void *mem, size_t n)
69 {
70   return realloc_func (mem, n );
71 }
72
73
74 char *
75 ksba_strdup (const char *str)
76 {
77   char *p = ksba_malloc (strlen(str)+1);
78   if (p)
79     strcpy (p, str);
80   return p;
81 }
82
83
84 void 
85 ksba_free ( void *a )
86 {
87   if (a)
88     free_func (a);
89 }
90
91
92 static void
93 out_of_core(void)
94 {
95   fputs ("\nfatal: out of memory\n", stderr );
96   exit (2);
97 }
98
99 \f
100 /* Implementations of the common xfoo() memory allocation functions */
101 void *
102 _ksba_xmalloc (size_t n )
103 {
104   void *p = ksba_malloc (n);
105   if (!p)
106     out_of_core();
107   return p;
108 }
109
110 void *
111 _ksba_xcalloc (size_t n, size_t m )
112 {
113   void *p = ksba_calloc (n,m);
114   if (!p)
115     out_of_core();
116   return p;
117 }
118
119 void *
120 _ksba_xrealloc (void *mem, size_t n)
121 {
122   void *p = ksba_realloc (mem,n);
123   if (!p)
124     out_of_core();
125   return p;
126 }
127
128
129 char *
130 _ksba_xstrdup (const char *str)
131 {
132   char *p = ksba_strdup (str);
133   if (!p)
134     out_of_core();
135   return p;
136 }
137
138 \f
139 #ifndef HAVE_STPCPY
140 char *
141 stpcpy (char *a,const char *b)
142 {
143   while (*b)
144     *a++ = *b++;
145   *a = 0;
146
147   return a;
148 }
149 #endif
150