diff options
Diffstat (limited to 'kern/string.c')
-rw-r--r-- | kern/string.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/kern/string.c b/kern/string.c new file mode 100644 index 00000000..82bcd2f1 --- /dev/null +++ b/kern/string.c @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2012 Richard Braun. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * + * Trivial, portable implementations. + */ + +#include <kern/stddef.h> +#include <kern/string.h> + +void * +memcpy(void *dest, const void *src, size_t n) +{ + const char *src_ptr; + char *dest_ptr; + size_t i; + + dest_ptr = dest; + src_ptr = src; + + for (i = 0; i < n; i++) + *dest_ptr++ = *src_ptr++; + + return dest; +} + +void * +memmove(void *dest, const void *src, size_t n) +{ + const char *src_ptr; + char *dest_ptr; + size_t i; + + if (src == dest) + return dest; + else if (src < dest) { + dest_ptr = (char *)dest + n - 1; + src_ptr = (const char *)src + n - 1; + + for (i = 0; i < n; i++) + *dest_ptr-- = *src_ptr--; + } else if (src > dest) { + dest_ptr = dest; + src_ptr = src; + + for (i = 0; i < n; i++) + *dest_ptr++ = *src_ptr++; + } + + return dest; +} + +void * +memset(void *s, int c, size_t n) +{ + char *buffer; + size_t i; + + buffer = s; + + for (i = 0; i < n; i++) + buffer[i] = c; + + return s; +} + +int +memcmp(const void *s1, const void *s2, size_t n) +{ + const char *a1, *a2; + size_t i; + + a1 = s1; + a2 = s2; + + for (i = 0; i < n; i++) + if (a1[i] != a2[i]) + return a2[i] - a1[i]; + + return 0; +} + +size_t +strlen(const char *s) +{ + size_t i; + + i = 0; + + while (*s++ != '\0') + i++; + + return i; +} + +char * +strcpy(char *dest, const char *src) +{ + char *tmp; + + tmp = dest; + + while ((*dest = *src) != '\0') { + dest++; + src++; + } + + return tmp; +} + +int +strcmp(const char *s1, const char *s2) +{ + char c1, c2; + + while ((c1 = *s1) == (c2 = *s2)) { + if (c1 == '\0') + return 0; + + s1++; + s2++; + } + + return (c1 < c2) ? -1 : 1; +} |