1
// =============================================================
6
// Institute of Microbiology (Technical University Munich)
7
// http://www.arb-home.de/
9
// =============================================================
13
#include <attributes.h>
15
#define MINSIZE 72 // >= sizeof(Node)
17
static void *M=NULL,*D=NULL;
20
// ==========================================================================
22
static void clearUp(void) { void *v;
23
while(D) {v=D; D=((void **)v)[0]; free(v);}
24
while(M) {v=M; M=((void **)v)[0]; free(v);}
27
// ==========================================================================
29
__ATTR__NORETURN static void outOfMemory(void) {
30
fprintf(stdout,"\n!!! Out of Memory\n");
35
// ==========================================================================
38
void *newBlock(size_t s) {
42
v=D; D=((void **)v)[0];
45
S=((s<=MINSIZE)?MINSIZE:s)+3*sizeof(void *);
47
if(v==NULL) outOfMemory();
51
if(M) ((void **)M)[1]=v;
52
((void **)v)[0]=M; M=v;
54
((void **)v)[2]=(void *)s;
57
return(((void **)v)+3);
62
void freeBlock_(void **vv) {
65
v=(void *)(((void **)(*vv))-3);
67
if(((void **)v)[0]) ((void ***)v)[0][1]=((void **)v)[1];
68
if(((void **)v)[1]) ((void ***)v)[1][0]=((void **)v)[0];
69
else M=((void **)v)[0];
71
s=(size_t)(((void **)v)[2]);
74
((void **)v)[0]=D; D=v;
77
A-=s+3*sizeof(void *);
84
// ==========================================================================
86
void **newMatrix(size_t nrow,size_t ncol,size_t s) {
90
m=(void **)newBlock(nrow*sizeof(void *));
92
p=ncol*s; for(i=0;i<nrow;i++) m[i]=newBlock(p);
99
void freeMatrix_(void ***mm) {
100
void **m; size_t i,rows;
103
rows=((size_t)m[-1])/sizeof(void *);
104
for(i=0;i<rows;i++) freeBlock(m+i);
105
freeBlock((void **)mm);