4 #if _SDCC_MALLOC_TYPE_MLH
6 typedef struct _MEMHEADER MEMHEADER;
16 #define HEADER_SIZE (sizeof(MEMHEADER)-sizeof(char))
18 /* These variables are defined through the crt0 functions. */
19 /* Base of this variable is the first byte of the heap. */
20 extern MEMHEADER _sdcc_heap_start;
21 /* Address of this variable is the last byte of the heap. */
22 extern char _sdcc_heap_end;
24 MEMHEADER * _sdcc_prev_memheader;
25 // apart from finding the header
26 // this function also finds it's predecessor
28 _sdcc_find_memheader(void * p)
30 register MEMHEADER * pthis;
33 pthis = (MEMHEADER * )((char *) p - HEADER_SIZE); //to start of header
34 _sdcc_prev_memheader = pthis->prev;
42 MEMHEADER *prev_header, *pthis;
44 if ( p ) //For allocated pointers only!
46 pthis = (MEMHEADER * )((char *) p - HEADER_SIZE); //to start of header
47 if ( pthis->prev ) // For the regular header
49 prev_header = pthis->prev;
50 prev_header->next = pthis->next;
53 pthis->next->prev = prev_header;
58 pthis->len = 0; //For the first header
65 //--------------------------------------------------------------------
66 //Written by Dmitry S. Obukhov, 1997
68 //--------------------------------------------------------------------
69 //Modified for SDCC by Sandeep Dutta, 1999
70 //sandeep.dutta@usa.net
71 //--------------------------------------------------------------------
72 //malloc and free functions implementation for embedded system
73 //Non-ANSI keywords are C51 specific.
74 // xdata - variable in external memory (just RAM)
75 //--------------------------------------------------------------------
77 #define HEADER_SIZE sizeof(MEMHEADER)
79 //Static here means: can be accessed from this module only
80 extern MEMHEADER xdata * _sdcc_first_memheader;
82 MEMHEADER xdata * _sdcc_prev_memheader;
83 // apart from finding the header
84 // this function also finds it's predecessor
85 MEMHEADER xdata * _sdcc_find_memheader(void xdata * p)
87 register MEMHEADER xdata * pthis;
88 register MEMHEADER xdata * cur_header;
92 pthis = (MEMHEADER xdata *) p;
93 pthis -= 1; //to start of header
94 cur_header = _sdcc_first_memheader;
95 _sdcc_prev_memheader = NULL;
96 while (cur_header && pthis != cur_header)
98 _sdcc_prev_memheader = cur_header;
99 cur_header = cur_header->next;
106 register MEMHEADER xdata * pthis;
108 pthis = _sdcc_find_memheader(p);
109 if (pthis) //For allocated pointers only!
111 if (!_sdcc_prev_memheader)
117 _sdcc_prev_memheader->next = pthis->next;