home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <time.h>
- #include <libp.h>
-
- extern void *_allocbloc;
- extern int _allocflag;
-
- static void memlink(char *buf)
- {
- BLKHEAD *blist = _allocbloc;
- FREELIST *lpa = (size_t *)buf - 1;
- while (blist) {
- if (buf > blist && buf < blist->list + blist->list->size)
- break;
- blist=blist->next;
- }
- if (blist) {
- FREELIST *lp2 = 0,*lp = blist->list;
- while (lp) {
- if (lp == buf)
- break;
- if (lp > buf) {
- if (lp2 && ((char *)lp2+lp2->size == lpa)) {
- lp2->size += lpa->size + sizeof(size_t);
- if (lp2->size + (char *)lp2 == lp) {
- lp2->size += lp->size;
- lp2->next = lp->next;
- }
- }
- else {
- lpa->size = lpa->size + sizeof(size_t);
- if (lp2) {
- lpa->next = lp2->next;
- lp2->next = lpa;
- }
- else {
- lpa->next = blist->list;
- blist->list = lpa;
- }
- if (lpa->size + (char *)lpa == lp) {
- lpa->size += lp->size;
- lpa->next = lp->next;
- }
- }
- return;
- }
- lp2 = lp;
- lp = lp->next;
- }
- }
- }
-
- void free(void *buf)
- {
- while (_allocflag)
- _ll_transfer();
- _allocflag = 1;
- memlink((char *)buf);
- _allocflag = 0;
- }