Add macro %isu_package to generate ISU Package
[platform/upstream/rpm.git] / rpmio / rpmmalloc.c
1 /** \ingroup rpmio
2  * \file rpmio/rpmmalloc.c
3  */
4
5 #include "system.h"
6
7 #include <stdlib.h>
8 #include <string.h>
9 #include <stdio.h>
10
11 #include "debug.h"
12
13 static rpmMemFailFunc failfunc = NULL;
14 static void *failfunc_data = NULL;
15
16 /*
17  * Give memfail callback a chance to try to give us memory or perform
18  * it's own cleanup. If we dont get memory we die anyway as rpm doesn't 
19  * check for NULL returns from allocations.
20  */
21 static void *vmefail(size_t size)
22 {
23     void *val = failfunc ? (*failfunc)(size, failfunc_data) : NULL;
24     if (val == NULL) {
25         fprintf(stderr, _("memory alloc (%u bytes) returned NULL.\n"),
26                 (unsigned)size);
27         exit(EXIT_FAILURE);
28     }
29     return val; 
30 }
31
32 rpmMemFailFunc rpmSetMemFail(rpmMemFailFunc func, void *data)
33 {
34     rpmMemFailFunc ofunc = failfunc;
35     failfunc = func;
36     failfunc_data = data;
37     return ofunc;
38 }
39
40 void * rmalloc (size_t size)
41 {
42     register void *value;
43     if (size == 0) size++;
44     value = malloc (size);
45     if (value == NULL)
46         value = vmefail(size);
47     return value;
48 }
49
50 void * rcalloc (size_t nmemb, size_t size)
51 {
52     register void *value;
53     if (size == 0) size++;
54     if (nmemb == 0) nmemb++;
55     value = calloc (nmemb, size);
56     if (value == NULL)
57         value = vmefail(size);
58     return value;
59 }
60
61 void * rrealloc (void *ptr, size_t size)
62 {
63     register void *value;
64     if (size == 0) size++;
65     value = realloc (ptr, size);
66     if (value == NULL)
67         value = vmefail(size);
68     return value;
69 }
70
71 char * rstrdup (const char *str)
72 {
73     size_t size = strlen(str) + 1;
74     char *newstr = (char *) malloc (size);
75     if (newstr == NULL)
76         newstr = (char *) vmefail(size);
77     strcpy (newstr, str);
78     return newstr;
79 }
80
81 void * rfree (void *ptr)
82 {
83     free(ptr);
84     return NULL;
85 }