5 //--------------------------------------------------------------------
6 //Written by Maarten Brock, 2004
7 //--------------------------------------------------------------------
8 //realloc function implementation for embedded system
9 //Non-ANSI keywords are C51 specific.
10 // xdata - variable in external memory (just RAM)
11 //--------------------------------------------------------------------
13 #if _SDCC_MALLOC_TYPE_MLH
17 typedef struct _MEMHEADER MEMHEADER;
27 #define HEADER_SIZE (sizeof(MEMHEADER)-sizeof(char))
31 #define HEADER_SIZE sizeof(MEMHEADER)
35 extern MEMHEADER xdata * _sdcc_prev_memheader;
37 // apart from finding the header
38 // this function also finds it's predecessor
39 extern MEMHEADER xdata * _sdcc_find_memheader(void xdata * p);
41 void xdata * realloc (void * p, size_t size)
43 register MEMHEADER xdata * pthis;
44 register MEMHEADER xdata * pnew;
46 pthis = _sdcc_find_memheader(p);
49 if (size>(0xFFFF-HEADER_SIZE)) return (void xdata *) NULL; //To prevent overflow in next line
50 size += HEADER_SIZE; //We need a memory for header too
52 if ((((unsigned int)pthis->next) - ((unsigned int)pthis)) >= size)
53 {//if spare is more than need
58 if ((_sdcc_prev_memheader) &&
59 ((((unsigned int)pthis->next) -
60 ((unsigned int)_sdcc_prev_memheader) -
61 _sdcc_prev_memheader->len) >= size))
63 pnew = (MEMHEADER xdata * )((char xdata *)_sdcc_prev_memheader + _sdcc_prev_memheader->len);
64 _sdcc_prev_memheader->next = pnew;
65 memmove(pnew, pthis, pthis->len);
70 pnew = malloc(size - HEADER_SIZE);
73 memcpy(pnew, pthis->mem, pthis->len - HEADER_SIZE);