1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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
|