Release 0.0.3
[wine/multimedia.git] / heap.c
blobb6e7f9c373903cd12462d41c9f819af7a4f3264d
1 static char RCSId[] = "$Id: heap.c,v 1.1 1993/06/29 15:55:18 root Exp $";
2 static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include "prototypes.h"
8 typedef struct heap_mem_desc_s
10 struct heap_mem_desc_s *prev, *next;
11 int length;
12 } MDESC;
14 MDESC *FreeList;
16 /**********************************************************************
17 * HEAP_LocalInit
19 void
20 HEAP_LocalInit(void *start, int length)
22 FreeList = (MDESC *) start;
23 FreeList->prev = NULL;
24 FreeList->next = NULL;
25 FreeList->length = length - sizeof(MDESC);
28 /**********************************************************************
29 * HEAP_LocalAlloc
31 void *
32 HEAP_LocalAlloc(int flags, int bytes)
34 MDESC *m, *m_new;
36 #ifdef HEAP_DEBUG
37 printf("LocalAlloc: flags %x, bytes %d, ", flags, bytes);
38 #endif
41 * Find free block big enough.
43 for (m = FreeList; m != NULL; m = m->next)
45 if (m->length == bytes && m->length < bytes + 4 * sizeof(MDESC))
47 break;
49 else if (m->length > bytes)
51 m_new = m + (bytes / sizeof(MDESC)) + 2;
52 if (m->prev == NULL)
53 FreeList = m_new;
54 else
55 m->prev->next = m_new;
57 if (m->next != NULL)
58 m->next->prev = m_new;
60 m_new->next = m->next;
61 m_new->prev = m->prev;
62 m_new->length = m->length - ((int) m_new - (int) m);
63 m->length -= (m_new->length + sizeof(MDESC));
65 #ifdef HEAP_DEBUG
66 printf("Returning %x\n", (int) (m + 1));
67 #endif
68 return (void *) (m + 1);
72 if (m != NULL)
74 if (m->prev == NULL)
75 FreeList = m->next;
76 else
77 m->prev->next = m->next;
79 if (m->next != NULL)
80 m->next->prev = m->prev;
82 #ifdef HEAP_DEBUG
83 printf("Returning %x\n", (int) (m + 1));
84 #endif
85 return (void *) (m + 1);
88 #ifdef HEAP_DEBUG
89 printf("Returning 0\n");
90 #endif
91 return 0;