mirror of https://github.com/tailix/libclayer.git
136 lines
2.8 KiB
C
136 lines
2.8 KiB
C
|
#ifdef HAVE_CONFIG_H
|
||
|
#include "config.h"
|
||
|
#endif
|
||
|
|
||
|
#include <stddef.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
int memcmp(const void *s1, const void *s2, size_t n)
|
||
|
{
|
||
|
for (const unsigned char *p1 = s1, *p2 = s2; n--; ++p1, ++p2) {
|
||
|
if (*p1 != *p2) return *p1 - *p2;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void *memcpy(void *dest, const void *src, size_t n)
|
||
|
{
|
||
|
char *dest_cell = dest;
|
||
|
char *src_cell = (char*)src;
|
||
|
while (n--) *dest_cell++ = *src_cell++;
|
||
|
return dest;
|
||
|
}
|
||
|
|
||
|
void *memmove(void *dest, const void *src, size_t n)
|
||
|
{
|
||
|
char *dest_cell = dest;
|
||
|
char *src_cell = (char*)src;
|
||
|
if (dest_cell <= src_cell) {
|
||
|
while (n--) *dest_cell++ = *src_cell++;
|
||
|
} else {
|
||
|
dest_cell += n;
|
||
|
src_cell += n;
|
||
|
while (n--) *--dest_cell = *--src_cell;
|
||
|
}
|
||
|
return dest;
|
||
|
}
|
||
|
|
||
|
void *memchr(const void *s, int c, size_t n)
|
||
|
{
|
||
|
for (const unsigned char *p = s; n--; ++p) {
|
||
|
if ((unsigned char)c == *p) return (void*)p;
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
void *memset(void *s, int c, size_t n)
|
||
|
{
|
||
|
char *ss = s;
|
||
|
while (n--) *ss++ = c;
|
||
|
return s;
|
||
|
}
|
||
|
|
||
|
char *strcat(char *dest, const char *src)
|
||
|
{
|
||
|
char *const dest_start = dest;
|
||
|
while (*dest) ++dest;
|
||
|
while ((*dest++ = *src++));
|
||
|
return dest_start;
|
||
|
}
|
||
|
|
||
|
char *strchr(const char *s, int c)
|
||
|
{
|
||
|
for (; *s != (char)c; ++s) if (*s == '\0') return NULL;
|
||
|
return (char*)s;
|
||
|
}
|
||
|
|
||
|
int strcmp(const char *s1, const char *s2)
|
||
|
{
|
||
|
for (; *s1; ++s1, ++s2) if (*s1 != *s2) return *s1 < *s2 ? -1 : 1;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
char *strcpy(char *dest, const char *src)
|
||
|
{
|
||
|
char *tmp = dest;
|
||
|
while ((*dest++ = *src++) != '\0');
|
||
|
return tmp;
|
||
|
}
|
||
|
|
||
|
size_t strlen(const char *s)
|
||
|
{
|
||
|
const char *ss = s;
|
||
|
while (*ss != '\0') ++ss;
|
||
|
return ss - s;
|
||
|
}
|
||
|
|
||
|
char *strncat(char *dest, const char *src, size_t n)
|
||
|
{
|
||
|
char *const dest_start = dest;
|
||
|
if (n) {
|
||
|
while (*dest) ++dest;
|
||
|
while ((*dest++ = *src++)) {
|
||
|
if (--n == 0) {
|
||
|
*dest = '\0';
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return dest_start;
|
||
|
}
|
||
|
|
||
|
int strncmp(const char *s1, const char *s2, size_t n)
|
||
|
{
|
||
|
for (; *s1 && n; ++s1, ++s2, --n) if (*s1 != *s2) return *s1 < *s2 ? -1 : 1;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
char *strncpy(char *dest, const char *src, size_t n)
|
||
|
{
|
||
|
char *tmp = dest;
|
||
|
while (n-- && (*dest++ = *src++) != '\0');
|
||
|
return tmp;
|
||
|
}
|
||
|
|
||
|
size_t strnlen(const char *s, size_t maxlen)
|
||
|
{
|
||
|
const char *ss = s;
|
||
|
while (*ss != '\0' && maxlen--) ++ss;
|
||
|
return ss - s;
|
||
|
}
|
||
|
|
||
|
char *strstr(const char *haystack, const char *needle)
|
||
|
{
|
||
|
const size_t needle_slen = strlen(needle);
|
||
|
if (!needle_slen) return (char*)haystack;
|
||
|
|
||
|
size_t haystack_slen = strlen(haystack);
|
||
|
while (haystack_slen >= needle_slen) {
|
||
|
--haystack_slen;
|
||
|
if (!memcmp(haystack, needle, needle_slen)) return (char*)haystack;
|
||
|
++haystack;
|
||
|
}
|
||
|
|
||
|
return NULL;
|
||
|
}
|