debian/rules: Use `git' potty wrapper.
[qmail] / alloc.c
1 #include "alloc.h"
2 #include "error.h"
3 extern char *malloc();
4 extern void free();
5
6 #define ALIGNMENT 16 /* XXX: assuming that this alignment is enough */
7 #define SPACE 4096 /* must be multiple of ALIGNMENT */
8
9 typedef union { char irrelevant[ALIGNMENT]; double d; } aligned;
10 static aligned realspace[SPACE / ALIGNMENT];
11 #define space ((char *) realspace)
12 static unsigned int avail = SPACE; /* multiple of ALIGNMENT; 0<=avail<=SPACE */
13
14 /*@null@*//*@out@*/char *alloc(n)
15 unsigned int n;
16 {
17 char *x;
18 n = ALIGNMENT + n - (n & (ALIGNMENT - 1)); /* XXX: could overflow */
19 if (n <= avail) { avail -= n; return space + avail; }
20 x = malloc(n);
21 if (!x) errno = error_nomem;
22 return x;
23 }
24
25 void alloc_free(x)
26 char *x;
27 {
28 if (x >= space)
29 if (x < space + SPACE)
30 return; /* XXX: assuming that pointers are flat */
31 free(x);
32 }