summaryrefslogtreecommitdiff
path: root/apps/plugins/puzzles/malloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/puzzles/malloc.c')
-rw-r--r--apps/plugins/puzzles/malloc.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/apps/plugins/puzzles/malloc.c b/apps/plugins/puzzles/malloc.c
new file mode 100644
index 0000000000..d9943c6b40
--- /dev/null
+++ b/apps/plugins/puzzles/malloc.c
@@ -0,0 +1,61 @@
1/*
2 * malloc.c: safe wrappers around malloc, realloc, free, strdup
3 */
4
5#include <stdlib.h>
6#include <string.h>
7#include "puzzles.h"
8
9/*
10 * smalloc should guarantee to return a useful pointer - Halibut
11 * can do nothing except die when it's out of memory anyway.
12 */
13
14int allocs = 0;
15int frees = 0;
16
17void *smalloc(size_t size) {
18 void *p;
19 p = malloc(size);
20 LOGF("allocs: %d", ++allocs);
21 if (!p)
22 fatal("out of memory");
23 return p;
24}
25
26/*
27 * sfree should guaranteeably deal gracefully with freeing NULL
28 */
29void sfree(void *p) {
30 if (p) {
31 ++frees;
32 LOGF("frees: %d, total outstanding: %d", frees, allocs - frees);
33 free(p);
34 }
35}
36
37/*
38 * srealloc should guaranteeably be able to realloc NULL
39 */
40void *srealloc(void *p, size_t size) {
41 void *q;
42 if (p) {
43 q = realloc(p, size);
44 } else {
45 LOGF("allocs: %d", ++allocs);
46 q = malloc(size);
47 }
48 if (!q)
49 fatal("out of memory");
50 return q;
51}
52
53/*
54 * dupstr is like strdup, but with the never-return-NULL property
55 * of smalloc (and also reliably defined in all environments :-)
56 */
57char *dupstr(const char *s) {
58 char *r = smalloc(1+strlen(s));
59 strcpy(r,s);
60 return r;
61}