diff options
Diffstat (limited to 'src/base/mem')
-rw-r--r-- | src/base/mem/arena.c | 9 | ||||
-rw-r--r-- | src/base/mem/copy.c | 14 | ||||
-rw-r--r-- | src/base/mem/findc.c | 14 | ||||
-rw-r--r-- | src/base/mem/move.c | 22 | ||||
-rw-r--r-- | src/base/mem/rules.mk | 3 | ||||
-rw-r--r-- | src/base/mem/set.c | 12 | ||||
-rw-r--r-- | src/base/mem/set64.c | 4 |
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; } |