ff1c16c4f4511eea2c2eb8c0cec5cf2aad06551e
[fw/sdcc] / device / lib / free.c
1 #include <sdcc-lib.h>
2 #include <malloc.h>
3
4 #if _SDCC_MALLOC_TYPE_MLH
5
6 typedef struct _MEMHEADER MEMHEADER;
7
8 struct _MEMHEADER
9 {
10   MEMHEADER *    next;
11   MEMHEADER *    prev;
12   unsigned int   len;
13   unsigned char  mem;
14 };
15
16 #define HEADER_SIZE (sizeof(MEMHEADER)-sizeof(char))
17
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;
23
24 MEMHEADER * _sdcc_prev_memheader;
25 // apart from finding the header
26 // this function also finds it's predecessor
27 MEMHEADER *
28 _sdcc_find_memheader(void * p)
29 {
30   register MEMHEADER * pthis;
31   if (!p)
32     return NULL;
33   pthis = (MEMHEADER * )((char *)  p - HEADER_SIZE); //to start of header
34   _sdcc_prev_memheader = pthis->prev;
35
36   return (pthis);
37 }
38
39 void
40 free (void *p)
41 {
42   MEMHEADER *prev_header, *pthis;
43
44   if ( p ) //For allocated pointers only!
45     {
46       pthis = (MEMHEADER * )((char *)  p - HEADER_SIZE); //to start of header
47       if ( pthis->prev ) // For the regular header
48         {
49           prev_header = pthis->prev;
50           prev_header->next = pthis->next;
51           if (pthis->next)
52             {
53               pthis->next->prev = prev_header;
54             }
55         }
56       else
57         {
58           pthis->len = 0; //For the first header
59         }
60     }
61 }
62
63 #else
64
65             //--------------------------------------------------------------------
66             //Written by Dmitry S. Obukhov, 1997
67             //dso@usa.net
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             //--------------------------------------------------------------------
76
77             #define HEADER_SIZE sizeof(MEMHEADER)
78
79             //Static here means: can be accessed from this module only
80             extern MEMHEADER xdata * _sdcc_first_memheader;
81
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)
86             {
87               register MEMHEADER xdata * pthis;
88               register MEMHEADER xdata * cur_header;
89
90               if (!p)
91                   return NULL;
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)
97                 {
98                   _sdcc_prev_memheader = cur_header;
99                   cur_header = cur_header->next;
100                 }
101               return (cur_header);
102             }
103
104             void free (void * p)
105             {
106               register MEMHEADER xdata * pthis;
107
108               pthis = _sdcc_find_memheader(p);
109               if (pthis) //For allocated pointers only!
110               {
111                 if (!_sdcc_prev_memheader)
112                 {
113                   pthis->len = 0;
114                 }
115                 else
116                 {
117                   _sdcc_prev_memheader->next = pthis->next;
118                 }
119               }
120             }
121             //END OF MODULE
122 #endif