aos/kernel/string.c
Daniel Schwyn 6d444bf552 Main handout
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>
2022-03-03 14:57:51 +01:00

243 lines
3.9 KiB
C

/**
* \file
* \brief Implementations of standard libc string functions.
*/
/*
* Copyright (c) 2007, 2008, 2014, ETH Zurich.
* All rights reserved.
*
* This file is distributed under the terms in the attached LICENSE file.
* If you do not find this file, copies can be found by writing to:
* ETH Zurich D-INFK, CAB F.78, Universitaetstrasse 6, CH-8092 Zurich,
* Attn: Systems Group.
*/
#include <stdint.h>
#include <assert.h>
#include <stddef.h>
#include <string.h>
#if 0
void *
memset (void *s, int c, size_t n)
{
uint8_t *p = (uint8_t *)s;
for (size_t m = 0; m < n; m++) {
*p++ = c;
}
return s;
}
#endif
char *
strstr(const char *a, const char *b)
{
const char *res = a;
for (; *res != '\0'; res++) {
if (strcmp(res, b) == 0) {
return (char *)res;
}
}
return NULL;
}
void *
memchr(const void *s, int c, size_t n)
{
size_t i;
const uint8_t *p;
for (i = 0, p = s; i < n; i++, p++)
if (*p == c)
return (void *)p;
return NULL;
}
size_t
strlen(const char *s)
{
size_t i = 0;
while (*s != '\0') {
i++;
s++;
}
return i;
}
char *
strncpy(char *dest, const char *src, size_t count)
{
char *tmp = dest;
int c = count;
while (c >= 0) {
if ((*tmp = *src) != 0) src++;
tmp++;
c--;
}
return dest;
}
char *
strcpy(char *dest, const char *src)
{
char *pos = dest;
while ((*pos++ = *src++) != 0);
return dest;
}
#if 0
void *
memmove(void *dst, const void *src, size_t sz)
{
size_t i;
const char *source = src;
char *dest = dst;
if(sz == 0) {
return dst;
}
/* XXX: This is slooooooooooowwwwwwwwwww ...... */
if(src >= dst) { // copy front to back
for(i = 0; i < sz; i++)
dest[i] = source[i];
} else { // copy back to front
for(i = sz - 1; i > 0; i--)
dest[i] = source[i];
dest[0] = source[0];
}
return dst;
}
#endif
void *
memcpy(void *dst, const void *src, size_t len)
{
char *d = dst;
const char *s = src;
/* check that we don't overlap (should use memmove()) */
assert((src < dst && (char *)src + len <= (char *)dst)
|| (dst < src && (char *)dst + len <= (char *)src));
while (len--)
*d++ = *s++;
return dst;
}
char *
strchr(const char *s, int c)
{
unsigned int i;
unsigned int n = strlen(s);
for(i = 0; i < n ; i++) {
if(s[i] == c)
return (char *)&s[i];
}
return NULL;
}
char *
strrchr(const char *s, int c)
{
unsigned int i;
unsigned int n = strlen(s);
if(n == 0)
return NULL;
for(i = n - 1; ; i--) {
if (s[i] == c) {
return (char *)&s[i];
} else if (i == 0) {
return NULL;
}
}
}
int
strncmp(const char *s1, const char *s2, size_t n)
{
int result;
for(unsigned int i = 0; i < n; i++) {
if((result = s2[i] - s1[i]) != 0) {
return result;
}
if(s1[i] == '\0' || s2[i] == '\0') {
break;
}
}
return 0;
}
int
strcmp(const char *s1, const char *s2)
{
size_t len1 = strlen(s1), len2 = strlen(s2),
maxlen = len1 > len2 ? len1 : len2;
return strncmp(s1, s2, maxlen);
}
size_t
strspn(const char* s, const char* set)
{
const char* l = s;
while (('\0' != *l) && (NULL != strchr(set, *l)))
{
l++;
}
return (l - s);
}
size_t
strcspn(const char* s, const char* set)
{
const char* l = s;
while (('\0' != *l) && (NULL == strchr(set, *l)))
{
l++;
}
return (l - s);
}
char *
strtok(char *s, const char *delim)
{
static char *save;
if (s == NULL)
{
s = save;
}
s = s + strspn(s, delim);
if ('\0' == *s)
{
return NULL;
}
save = s + strcspn(s, delim);
if ('\0' != *save)
{
*save++ = '\0';
}
return s;
}