blob: c852f55304ce9925a65b475638a9aa5aed3e80a3 [file] [log] [blame]
Dmitry V. Levin3e9d71f2015-05-25 20:41:02 +00001#include "defs.h"
2
3void die_out_of_memory(void)
4{
5 static bool recursed = false;
6
7 if (recursed)
8 exit(1);
9 recursed = 1;
10
11 error_msg_and_die("Out of memory");
12}
13
14void *xmalloc(size_t size)
15{
16 void *p = malloc(size);
17
18 if (!p)
19 die_out_of_memory();
20
21 return p;
22}
23
24void *xcalloc(size_t nmemb, size_t size)
25{
26 void *p = calloc(nmemb, size);
27
28 if (!p)
29 die_out_of_memory();
30
31 return p;
32}
33
34#define HALF_SIZE_T (((size_t) 1) << (sizeof(size_t) * 4))
35
36void *xreallocarray(void *ptr, size_t nmemb, size_t size)
37{
38 size_t bytes = nmemb * size;
39
40 if ((nmemb | size) >= HALF_SIZE_T &&
41 size && bytes / size != nmemb)
42 die_out_of_memory();
43
44 void *p = realloc(ptr, bytes);
45
46 if (!p)
47 die_out_of_memory();
48
49 return p;
50}
51
52char *xstrdup(const char *str)
53{
54 char *p = strdup(str);
55
56 if (!p)
57 die_out_of_memory();
58
59 return p;
60}