source: tags/arb_5.3/ISLAND_HOPPING/memory.c

Last change on this file was 5160, checked in by westram, 16 years ago
  • removed obscure defines
  • made globals static
  • removed unused functions
  • made local function static
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 1.9 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3
4#define MINSIZE 72 /* >= sizeof(Node) */
5
6static void *M=NULL,*D=NULL;
7static size_t A=0;
8
9/* ========================================================================== */
10
11void clearUp(void) { void *v;
12    while(D) {v=D; D=((void **)v)[0]; free(v);}
13    while(M) {v=M; M=((void **)v)[0]; free(v);}
14}
15
16/* ========================================================================== */
17
18static void outOfMemory(void) {
19    fprintf(stdout,"\n!!! Out of Memory\n");
20    clearUp();
21    exit(EXIT_FAILURE);
22}
23
24/* ========================================================================== */
25
26
27void *newBlock(size_t s) {
28    void *v; size_t S;
29
30    if(D&&s<=MINSIZE) {
31        v=D; D=((void **)v)[0];
32    } else {
33        S=((s<=MINSIZE)?MINSIZE:s)+3*sizeof(void *);
34        v=malloc(S);
35        if(v==NULL) outOfMemory();
36        A+=S;
37    }
38
39    if(M) ((void **)M)[1]=v;
40    ((void **)v)[0]=M; M=v;
41    ((void **)v)[1]=NULL;
42    ((void **)v)[2]=(void *)s;
43
44
45    return(((void **)v)+3);
46}
47
48/*........*/
49
50void freeBlock(void **vv) {
51    void *v; size_t s;
52
53    v=(void *)(((void **)(*vv))-3);
54
55    if(((void **)v)[0]) ((void ***)v)[0][1]=((void **)v)[1];
56    if(((void **)v)[1]) ((void ***)v)[1][0]=((void **)v)[0];
57    else                M=((void **)v)[0];
58
59    s=(size_t)(((void **)v)[2]);
60
61    if(s<=MINSIZE) {
62        ((void **)v)[0]=D; D=v;
63    } else {
64        A-=s+3*sizeof(void *);
65        free(v);
66    }
67
68    *vv=NULL;
69}
70
71/* ========================================================================== */
72
73void **newMatrix(size_t nrow,size_t ncol,size_t s) {
74    size_t i,p;
75    void **m;
76
77    m=(void **)newBlock(nrow*sizeof(void *));
78
79    p=ncol*s; for(i=0;i<nrow;i++) m[i]=newBlock(p);
80
81    return(m);
82}
83
84/*........*/
85
86void freeMatrix(void ***mm) {
87    void **m; size_t i,rows;
88
89    m=*mm;
90    rows=((size_t)m[-1])/sizeof(void *);
91    for(i=0;i<rows;i++) freeBlock(m+i);
92    freeBlock((void **)mm);
93
94}
Note: See TracBrowser for help on using the repository browser.