Rocco Rutte:
[apps/madmutt.git] / lib / mem.c
1 /*
2  * This file is part of mutt-ng, see http://www.muttng.org/.
3  * It's licensed under the GNU General Public License,
4  * please see the file GPL in the top level source directory.
5  */
6
7 #include <stdlib.h>
8
9 #include "mem.h"
10 #include "exit.h"
11 #include "intl.h"
12
13 void *_mem_calloc (size_t nmemb, size_t size, int line, const char* fname) {
14   void *p;
15
16   if (!nmemb || !size)
17     return NULL;
18
19   if (((size_t) - 1) / nmemb <= size) {
20     exit_fatal ("mem_calloc", _("Integer overflow -- can't allocate memory!"),
21                 line, fname, 1);
22     return (NULL);
23   }
24
25   if (!(p = calloc (nmemb, size))) {
26     exit_fatal ("mem_calloc", _("Out of memory!"), line, fname, 1);
27     return (NULL);
28   }
29   return p;
30 }
31
32 void *_mem_malloc (size_t siz, int line, const char* fname) {
33   void *p;
34
35   if (siz == 0)
36     return 0;
37   if ((p = (void *) malloc (siz)) == 0) {       /* __MEM_CHECKED__ */
38     exit_fatal ("mem_malloc", _("Out of memory!"), line, fname, 1);
39     return (NULL);
40   }
41   return (p);
42 }
43
44 void _mem_realloc (void *ptr, size_t siz, int line, const char* fname) {
45   void *r;
46   void **p = (void **) ptr;
47
48   if (siz == 0) {
49     if (*p) {
50       free (*p);                /* __MEM_CHECKED__ */
51       *p = NULL;
52     }
53     return;
54   }
55
56   if (*p)
57     r = (void *) realloc (*p, siz);     /* __MEM_CHECKED__ */
58   else {
59     /* realloc(NULL, nbytes) doesn't seem to work under SunOS 4.1.x  --- __MEM_CHECKED__ */
60     r = (void *) malloc (siz);  /* __MEM_CHECKED__ */
61   }
62
63   if (!r)
64     exit_fatal ("mem_realloc", _("Out of memory!"), line, fname, 1);
65
66   *p = r;
67 }
68
69 void _mem_free (void *ptr) {
70   void **p = (void **) ptr;
71
72   if (*p) {
73     free (*p);                  /* __MEM_CHECKED__ */
74     *p = 0;
75   }
76 }