6 // Memory allocator by Kernighan and Ritchie,
7 // The C programming Language, 2nd ed. Section 8.7.
19 typedef union header Header
;
30 for(p
= freep
; !(bp
> p
&& bp
< p
->s
.ptr
); p
= p
->s
.ptr
)
31 if(p
>= p
->s
.ptr
&& (bp
> p
|| bp
< p
->s
.ptr
))
33 if(bp
+ bp
->s
.size
== p
->s
.ptr
){
34 bp
->s
.size
+= p
->s
.ptr
->s
.size
;
35 bp
->s
.ptr
= p
->s
.ptr
->s
.ptr
;
38 if(p
+ p
->s
.size
== bp
){
39 p
->s
.size
+= bp
->s
.size
;
54 p
= sbrk(nu
* sizeof(Header
));
59 free((void*)(hp
+ 1));
69 nunits
= (nbytes
+ sizeof(Header
) - 1)/sizeof(Header
) + 1;
70 if((prevp
= freep
) == 0){
71 base
.s
.ptr
= freep
= prevp
= &base
;
74 for(p
= prevp
->s
.ptr
; ; prevp
= p
, p
= p
->s
.ptr
){
75 if(p
->s
.size
>= nunits
){
76 if(p
->s
.size
== nunits
)
77 prevp
->s
.ptr
= p
->s
.ptr
;
84 return (void*)(p
+ 1);
87 if((p
= morecore(nunits
)) == 0)