blob: 165d9144421eee0a4edd752cdaeea2e120adffaa [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#include "sw/device/lib/base/memory.h"
extern uint32_t read_32(const void *);
extern void write_32(uint32_t, void *);
void *memcpy(void *restrict dest, const void *restrict src, size_t len) {
uint8_t *dest8 = (uint8_t *)dest;
uint8_t *src8 = (uint8_t *)src;
for (size_t i = 0; i < len; ++i) {
dest8[i] = src8[i];
}
return dest;
}
void *memset(void *dest, int value, size_t len) {
uint8_t *dest8 = (uint8_t *)dest;
uint8_t value8 = (uint8_t)value;
for (size_t i = 0; i < len; ++i) {
dest8[i] = value8;
}
return dest;
}
enum {
kMemCmpEq = 0,
kMemCmpLt = -42,
kMemCmpGt = 42,
};
int memcmp(const void *lhs, const void *rhs, size_t len) {
const uint8_t *lhs8 = (uint8_t *)lhs;
const uint8_t *rhs8 = (uint8_t *)rhs;
for (size_t i = 0; i < len; ++i) {
if (lhs8[i] < rhs8[i]) {
return kMemCmpLt;
} else if (lhs8[i] > rhs8[i]) {
return kMemCmpGt;
}
}
return kMemCmpEq;
}
void *memchr(const void *ptr, int value, size_t len) {
uint8_t *ptr8 = (uint8_t *)ptr;
uint8_t value8 = (uint8_t)value;
for (size_t i = 0; i < len; ++i) {
if (ptr8[i] == value8) {
return ptr8 + i;
}
}
return NULL;
}
void *memrchr(const void *ptr, int value, size_t len) {
uint8_t *ptr8 = (uint8_t *)ptr;
uint8_t value8 = (uint8_t)value;
for (size_t i = 0; i < len; ++i) {
size_t idx = len - i - 1;
if (ptr8[idx] == value8) {
return ptr8 + idx;
}
}
return NULL;
}