aboutsummaryrefslogtreecommitdiff
path: root/src/base/mem
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/mem')
-rw-r--r--src/base/mem/arena.c9
-rw-r--r--src/base/mem/copy.c14
-rw-r--r--src/base/mem/findc.c14
-rw-r--r--src/base/mem/move.c22
-rw-r--r--src/base/mem/rules.mk3
-rw-r--r--src/base/mem/set.c12
-rw-r--r--src/base/mem/set64.c4
7 files changed, 71 insertions, 7 deletions
diff --git a/src/base/mem/arena.c b/src/base/mem/arena.c
index b2ce044..37e7b56 100644
--- a/src/base/mem/arena.c
+++ b/src/base/mem/arena.c
@@ -25,15 +25,13 @@ struct mem·Arena
struct Block first;
};
-static
-void*
+static void*
·arenaalloc(void *heap, uint n, ulong size)
{
return mem·arenaalloc(heap, n, size);
}
-static
-void
+static void
·arenafree(void *heap, void *ptr)
{
/* no-op */
@@ -45,8 +43,7 @@ mem·Allocator mem·ArenaAllocator = {
};
-static
-void
+static void
grow(mem·Arena *a, vlong min)
{
uintptr size;
diff --git a/src/base/mem/copy.c b/src/base/mem/copy.c
new file mode 100644
index 0000000..5ce4f90
--- /dev/null
+++ b/src/base/mem/copy.c
@@ -0,0 +1,14 @@
+#include "internal.h"
+
+int
+mem·copy(void *dst, void *src, uintptr len)
+{
+ char *d, *s;
+ if((long)len < 0)
+ return 1;
+
+ d=dst, s=src;
+ while(len-- > 0)
+ *d++ = *s++;
+ return 0;
+}
diff --git a/src/base/mem/findc.c b/src/base/mem/findc.c
new file mode 100644
index 0000000..d3215c5
--- /dev/null
+++ b/src/base/mem/findc.c
@@ -0,0 +1,14 @@
+#include "internal.h"
+
+void *
+mem·findc(void *addr, uintptr len, int c)
+{
+ uchar *a = addr;
+
+ c &= 0xFF;
+ while(len-- > 0){
+ if(*a++ == c)
+ return a-1;
+ }
+ return nil;
+}
diff --git a/src/base/mem/move.c b/src/base/mem/move.c
new file mode 100644
index 0000000..5ad4074
--- /dev/null
+++ b/src/base/mem/move.c
@@ -0,0 +1,22 @@
+#include "internal.h"
+
+int
+mem·move(void *dst, void *src, uintptr len)
+{
+ char *d, *s;
+ if((long)len < 0)
+ return 1;
+
+ d=dst, s=src;
+ if((s < d) && (s+len > d))
+ goto aliased;
+ while(len-- > 0)
+ *d++ = *s++;
+ return 0;
+
+aliased:
+ d+=len, s+=len;
+ while(len-- > 0)
+ *--d = *--s;
+ return 0;
+}
diff --git a/src/base/mem/rules.mk b/src/base/mem/rules.mk
index b912d0c..fda54e1 100644
--- a/src/base/mem/rules.mk
+++ b/src/base/mem/rules.mk
@@ -2,4 +2,7 @@ SRCS_$(d)+=\
$(d)/mem/arena.c\
$(d)/mem/buffer.c\
$(d)/mem/interface.c\
+ $(d)/mem/set.c\
$(d)/mem/set64.c\
+ $(d)/mem/copy.c\
+ $(d)/mem/move.c
diff --git a/src/base/mem/set.c b/src/base/mem/set.c
new file mode 100644
index 0000000..2e296be
--- /dev/null
+++ b/src/base/mem/set.c
@@ -0,0 +1,12 @@
+#include "internal.h"
+
+int
+mem·set(void *addr, int c, uintptr len)
+{
+ char *a = addr;
+
+ while(len-- > 0)
+ *a++ = c;
+
+ return 0;
+}
diff --git a/src/base/mem/set64.c b/src/base/mem/set64.c
index 464b3ad..7000866 100644
--- a/src/base/mem/set64.c
+++ b/src/base/mem/set64.c
@@ -1,6 +1,6 @@
#include "internal.h"
-void
+int
mem·set64(void *dst, uint64 val, uintptr size)
{
intptr i;
@@ -10,4 +10,6 @@ mem·set64(void *dst, uint64 val, uintptr size)
for(; i < size; i++)
((byte*)dst)[i] = ((byte*)&val)[i&7];
+
+ return 0;
}