diff options
Diffstat (limited to 'src/SDK/OS/OSAlloc.c')
-rw-r--r-- | src/SDK/OS/OSAlloc.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/SDK/OS/OSAlloc.c b/src/SDK/OS/OSAlloc.c new file mode 100644 index 0000000..090233e --- /dev/null +++ b/src/SDK/OS/OSAlloc.c @@ -0,0 +1,49 @@ +#include "types.h" +#include "OS/OSAlloc.h" + +Cell *DLInsert(Cell *original, Cell *inserted) +{ + Cell *prevCell = NULL; + Cell *nextCell = original; + + for (nextCell = original, prevCell = NULL; nextCell; prevCell = nextCell, nextCell = nextCell->next) + { + if (inserted <= nextCell) + break; + } + + inserted->next = nextCell; + inserted->prev = prevCell; + + if (nextCell != NULL) + { + nextCell->prev = inserted; + Cell * temp = (Cell *)((char *)inserted + inserted->size); + if (temp == nextCell) + { + inserted->size += nextCell->size; + nextCell = nextCell->next; + inserted->next = nextCell; + if (nextCell != NULL) + nextCell->prev = inserted; + } + } + + if (prevCell != NULL) + { + prevCell->next = inserted; + Cell * temp = (Cell *)((char *)prevCell + prevCell->size); + + if (temp != inserted) + return original; + + prevCell->size += inserted->size; + prevCell->next = nextCell; + if (nextCell != NULL) + nextCell->prev = prevCell; + + return original; + } + + return inserted; +} |