quinn-os/string.c
2022-07-20 21:00:19 +10:00

155 lines
2.8 KiB
C

#include <stddef.h>
#include "inttypes.h"
#include "memory.h"
void memset(char *ptr, char value, int len) {
int i;
assert(ptr != NULL);
for (i = 0; i < len; i++) {
ptr[i] = value;
}
}
void *memmove(void *dest, const void *src, uint32_t n) {
assert(dest != NULL && src != NULL);
char *pDest = (char *)dest;
const char *pSrc = (const char *)src;
// allocate memory for tmp array
char *tmp = (char *)dbmalloc(sizeof(char) * n, "memmove");
if (NULL == tmp) {
return NULL;
} else {
uint32_t i = 0;
// copy src to tmp array
for (i = 0; i < n; ++i) {
*(tmp + i) = *(pSrc + i);
}
// copy tmp to dest
for (i = 0; i < n; ++i) {
*(pDest + i) = *(tmp + i);
}
free(tmp); // free allocated memory
}
return dest;
}
void memcpy(void *dest, void *src, int size) {
assert(dest != NULL && src != NULL);
uint8_t *pdest = (uint8_t *)dest;
uint8_t *psrc = (uint8_t *)src;
int loops = (size / sizeof(uint32_t));
for (int index = 0; index < loops; ++index) {
*((uint32_t *)pdest) = *((uint32_t *)psrc);
pdest += sizeof(uint32_t);
psrc += sizeof(uint32_t);
}
loops = (size % sizeof(uint32_t));
for (int index = 0; index < loops; ++index) {
*pdest = *psrc;
++pdest;
++psrc;
}
}
char *strncpy(char *dest, const char *src, int len) {
assert(dest != NULL && src != NULL);
const char *ptr = src;
char *ptr2 = dest;
int i = 0;
while (*ptr != '\0' && i != len) {
*ptr2 = *ptr;
if (i < len - 1) {
*(ptr2 + 1) = '\0';
}
ptr2++;
ptr++;
i++;
}
return dest;
}
char *strcpy(char *dest, const char *src) {
assert(dest != NULL && src != NULL);
const char *ptr = src;
char *ptr2 = dest;
while (*ptr != '\0') {
*ptr2 = *ptr;
*(ptr2 + 1) = '\0';
ptr2++;
ptr++;
}
return dest;
}
int memcmp(const uint8_t *m1, const uint8_t *m2, int size) {
assert(m1 != NULL && m2 != NULL);
while ((*m1) && (*m1 == *m2) && size > 0) {
--size;
++m1;
++m2;
}
return (*m1 - *m2);
}
int strncmp(const char *s1, const char *s2, int n) {
assert(s1 != NULL && s2 != NULL);
while ((*s1) && (*s1 == *s2) && n > 0) {
--n;
++s1;
++s2;
}
return (*s1 - *s2);
}
int strcmp(const char *s1, const char *s2) {
assert(s1 != NULL && s2 != NULL);
while ((*s1) && (*s1 == *s2)) {
++s1;
++s2;
}
return (*s1 - *s2);
}
int strlen(const char *str) {
int i = 0;
assert(str != NULL);
while (*str != '\0') {
str++;
i++;
}
return i;
}
char *strcat(char *dest, const char *src) {
assert(dest != NULL && src != NULL);
char *ptr = dest;
while (*dest != '\0') {
dest++;
}
while (*src != '\0') {
*dest = *src;
dest++;
*dest = '\0';
src++;
}
return ptr;
}
char toupper(char c) {
if (c > 64 && c < 91) {
return c;
} else {
return c - 32;
}
}