aboutsummaryrefslogtreecommitdiff
path: root/archived/array.h
diff options
context:
space:
mode:
Diffstat (limited to 'archived/array.h')
-rw-r--r--archived/array.h70
1 files changed, 70 insertions, 0 deletions
diff --git a/archived/array.h b/archived/array.h
new file mode 100644
index 0000000..04d2f38
--- /dev/null
+++ b/archived/array.h
@@ -0,0 +1,70 @@
+#include "chatty.h"
+
+u64 ArrayLength(u8 *Array);
+void ArrayInsert(u8 *Array, u64 Position, u8 Element);
+void ArrayCopy(u8 *To, u8 *From);
+void ArrayDelete(u8* Array, u64 Position);
+u8* ArrayCreate(u8* Container, u64 Capacity);
+
+// EXAMPLE: CREATE
+//
+// u64 Capacity = 15;
+// u8 ArrayContainer[Capacity + sizeof(Capacity)];
+// u8* Array = ArrayCreate(ArrayContainer, Capacity);
+//
+// EXAMPLE: API
+//
+// ArrayCopy(Array, (u8*)"Hello, world!");
+//
+// ArrayInsert(Array, 3, 'f');
+// ArrayInsert(Array, 3, 'e');
+// Array[14] = 'd';
+// ArrayDelete(Array, 3);
+
+#ifdef ARRAY_IMPL
+
+#include <strings.h>
+#include <string.h>
+
+u64
+ArrayLength(u8 *Array)
+{
+ return *((u64*)(Array - sizeof(u64)));
+}
+
+void
+ArrayInsert(u8 *Array, u64 Position, u8 Element)
+{
+ memmove(Array + Position + 1, Array + Position, ArrayLength(Array) - Position - 1);
+ Array[Position] = Element;
+}
+
+// Copy null terminated string without copying over the null terminator
+void
+ArrayCopy(u8 *To, u8 *From)
+{
+ u32 i = 0;
+ while (From[i])
+ {
+ To[i] = From[i];
+ i++;
+ }
+}
+
+void
+ArrayDelete(u8* Array, u64 Position)
+{
+ memmove(Array + Position, Array + Position + 1, ArrayLength(Array) - Position - 1);
+ Array[ArrayLength(Array) - 1] = 0;
+}
+
+u8*
+ArrayCreate(u8* Container, u64 Capacity)
+{
+ *(u64*)Container = Capacity;
+ u8 *Array = Container + sizeof(Capacity);
+ bzero(Array, Capacity);
+ return Array;
+}
+
+#endif