|
|
1.1 root 1: #
2: /*
3: * C library -- alloc/free
4: */
5:
6: #define logical int
7:
8: struct fb {
9: logical size;
10: char *next;
11: };
12:
13: int freelist[] = {
14: 0,
15: -1,
16: };
17: logical slop = 2;
18:
19: alloc(asize)
20: logical asize;
21: { return ( calloc ( 1 , asize ) ); }
22: /*{
23: register logical size;
24: register logical np;
25: register logical cp;
26:
27: if ((size = asize) == 0)
28: return(0);
29: size += 3;
30: size &= ~01;
31: for (;;) {
32: cp = freelist;
33: while ((np = cp->next) != -1) {
34: if (np->size>=size) {
35: if (size+slop >= np->size) {
36: cp->next = np->next;
37: return(&np->next);
38: }
39: cp = cp->next = np+size;
40: cp->size = np->size - size;
41: cp->next = np->next;
42: np->size = size;
43: return(&np->next);
44: }
45: cp = np;
46: }
47: return ( calloc ( 1 , asize ) );
48:
49: /* asize = size<1024? 1024: size;
50: if ((cp = sbrk(asize)) == -1) {
51: error("workspace exceeded");
52:
53: }
54: cp->size = asize;
55: free(&cp->next);
56: }
57: } */
58:
59:
60: afree(aptr)
61: char *aptr;
62: {if ( aptr == 0 ) return;
63: cfree ( aptr ); }
64: /* {
65: register logical ptr;
66: register logical cp;
67: register logical np;
68:
69: if (aptr == 0) return;
70: ptr = aptr-4;
71: cp = freelist;
72: while ((np = cp->next) < ptr)
73: cp = np;
74: if (ptr+ptr->size == np) {
75: ptr->size += np->size;
76: ptr->next = np->next;
77: np = ptr;
78: } else
79: ptr->next = np;
80: if (cp+cp->size == ptr) {
81: cp->size += ptr->size;
82: cp->next = ptr->next;
83: } else
84: cp->next = ptr;
85: } */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.