/* * dynamic-arr.c * * Created on: Sep 3, 2011 * Author: Tiberiu */ #include #include #include void DynamicArrayCreate (uint32 ElemSize, DynamicArray* arr) { // Create a simple array. Allocate 16 elems for start arr->ElemSize = ElemSize; arr->Size = 0; arr->Allocated = 0x10; arr->Data = kmalloc(0x10 * ElemSize); } void DynamicArrayPush (void* item, DynamicArray* arr) { // Make sure we have enough space if (arr->Allocated <= arr->Size) { arr->Allocated += 0x10; arr->Data = kmrealloc(arr->Data, arr->Allocated * arr->ElemSize); } // Calculate the address of next item uint32 addr = (uint32)arr->Data + arr->Size * arr->ElemSize; // Copy data memcpy((void*)addr, item, arr->ElemSize); ++arr->Size; } void DynamicArrayPop (DynamicArray* arr) { // Decrease size --arr->Size; } void DynamicArrayInsert (void* item, uint32 index, DynamicArray* arr) { // Make sure we have enough space if (arr->Allocated <= arr->Size) { arr->Allocated += 0x10; arr->Data = kmrealloc(arr->Data, arr->Allocated * arr->ElemSize); } // Move the data out of the way uint8* buffer = (uint8*) arr->Data; uint32 start = index * arr->ElemSize; uint32 end = arr->Size * arr->ElemSize; for (--end; end >= start; end--) buffer[end + arr->ElemSize] = buffer[end]; // Insert item memcpy((void*)((uint32)arr->Data + start), item, arr->ElemSize); ++ arr->Size; } void DynamicArrayRemove (uint32 index, DynamicArray* arr) { uint8* buffer = (uint8*) arr->Data; uint32 start = index * arr->ElemSize; uint32 end = (arr->Size-1) * arr->ElemSize; for (; start < end; start++) buffer[start] = buffer[start + arr->ElemSize]; -- arr->Size; } void DynamicArraySwap (uint32 a, uint32 b, DynamicArray* arr) { uint8 temp, *buffer = (uint8*) arr->Data; uint32 addra = a * arr->ElemSize; uint32 addrb = b * arr->ElemSize; uint32 i; for (i = 0; i < arr->ElemSize; i++) { // Swap byte i from elem A with byte i from elem B temp = buffer[addra + i]; buffer[addra + i] = buffer[addrb + i]; buffer[addrb + i] = temp; } } void DynamicArrayDispose (DynamicArray* arr) { // Free used data kfree(arr->Data); // Set everything to 0 so we don't attempt to add more items and stuff arr->Allocated = 0; arr->Size = 0; arr->ElemSize = 0; }