Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
malloc.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef CRAY
00025 #define STACKMIN 512
00026 #define MINBLK (2*sizeof(struct mem) + 16)
00027 #define F _malloc_free_
00028 #define SBGULP 8192
00029 #include "string.h"
00030
00031 #ifdef KR_headers
00032 #define Char char
00033 #define Unsigned unsigned
00034 #define Int
00035 #else
00036 #define Char void
00037 #define Unsigned size_t
00038 #define Int int
00039 #endif
00040
00041 typedef struct mem {
00042 struct mem *next;
00043 Unsigned len;
00044 } mem;
00045
00046 mem *F;
00047
00048 Char *
00049 #ifdef KR_headers
00050 malloc(size)
00051 register Unsigned size;
00052 #else
00053 malloc(register Unsigned size)
00054 #endif
00055 {
00056 register mem *p, *q, *r, *s;
00057 unsigned register k, m;
00058 extern Char *sbrk(Int);
00059 char *top, *top1;
00060
00061 size = (size+7) & ~7;
00062 r = (mem *) &F;
00063 for (p = F, q = 0; p; r = p, p = p->next) {
00064 if ((k = p->len) >= size && (!q || m > k)) {
00065 m = k;
00066 q = p;
00067 s = r;
00068 }
00069 }
00070 if (q) {
00071 if (q->len - size >= MINBLK) {
00072 p = (mem *) (((char *) (q+1)) + size);
00073 p->next = q->next;
00074 p->len = q->len - size - sizeof(mem);
00075 s->next = p;
00076 q->len = size;
00077 }
00078 else
00079 s->next = q->next;
00080 }
00081 else {
00082 top = (Char *)(((long)sbrk(0) + 7) & ~7);
00083 if (F && (char *)(F+1) + F->len == top) {
00084 q = F;
00085 F = F->next;
00086 }
00087 else
00088 q = (mem *) top;
00089 top1 = (char *)(q+1) + size;
00090 if (sbrk((int)(top1-top+SBGULP)) == (Char *) -1)
00091 return 0;
00092 r = (mem *)top1;
00093 r->len = SBGULP - sizeof(mem);
00094 r->next = F;
00095 F = r;
00096 q->len = size;
00097 }
00098 return (Char *) (q+1);
00099 }
00100
00101 void
00102 #ifdef KR_headers
00103 free(f)
00104 Char *f;
00105 #else
00106 free(Char *f)
00107 #endif
00108 {
00109 mem *p, *q, *r;
00110 char *pn, *qn;
00111
00112 if (!f) return;
00113 q = (mem *) ((char *)f - sizeof(mem));
00114 qn = (char *)f + q->len;
00115 for (p = F, r = (mem *) &F; ; r = p, p = p->next) {
00116 if (qn == (Char *) p) {
00117 q->len += p->len + sizeof(mem);
00118 p = p->next;
00119 }
00120 pn = p ? ((char *) (p+1)) + p->len : 0;
00121 if (pn == (Char *) q) {
00122 p->len += sizeof(mem) + q->len;
00123 q->len = 0;
00124 q->next = p;
00125 r->next = p;
00126 break;
00127 }
00128 if (pn < (char *) q) {
00129 r->next = q;
00130 q->next = p;
00131 break;
00132 }
00133 }
00134 }
00135
00136 Char *
00137 #ifdef KR_headers
00138 realloc(f, size)
00139 Char *f;
00140 Unsigned size;
00141 #else
00142 realloc(Char *f, Unsigned size)
00143 #endif
00144 {
00145 mem *p;
00146 Char *q, *f1;
00147 Unsigned s1;
00148
00149 if (!f) return malloc(size);
00150 p = (mem *) ((char *)f - sizeof(mem));
00151 s1 = p->len;
00152 free(f);
00153 if (s1 > size)
00154 s1 = size + 7 & ~7;
00155 if (!p->len) {
00156 f1 = (Char *)(p->next + 1);
00157 memcpy(f1, f, s1);
00158 f = f1;
00159 }
00160 q = malloc(size);
00161 if (q && q != f)
00162 memcpy(q, f, s1);
00163 return q;
00164 }
00165 #endif