]> git.buserror.net Git - polintos/scott/priv.git/blobdiff - lib/c/freestanding/string.c
Move some freestanding libc functions from the kernel into
[polintos/scott/priv.git] / lib / c / freestanding / string.c
diff --git a/lib/c/freestanding/string.c b/lib/c/freestanding/string.c
new file mode 100644 (file)
index 0000000..a3bb62e
--- /dev/null
@@ -0,0 +1,140 @@
+// string and memory functions.
+//
+// This software is copyright (c) 2007 Scott Wood <scott@buserror.net>.
+// 
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors or contributors be held liable for any damages
+// arising from the use of this software.
+// 
+// Permission is hereby granted to everyone, free of charge, to use, copy,
+// modify, prepare derivative works of, publish, distribute, perform,
+// sublicense, and/or sell copies of the Software, provided that the above
+// copyright notice and disclaimer of warranty be included in all copies or
+// substantial portions of this software.
+
+#include <stdint.h>
+#include <string.h>
+
+void *memcpy(void *dest, const void *src, size_t len)
+{
+       const char *cs = static_cast<const char *>(src);
+       char *cd = static_cast<char *>(dest);
+
+       for (size_t i = 0; i < len; i++)
+               cd[i] = cs[i];
+
+       return dest;
+}
+
+void *memmove(void *dest, const void *src, size_t len)
+{
+       if (dest < src)
+               return memcpy(dest, src, len);
+
+       const char *cs = static_cast<const char *>(src);
+       char *cd = static_cast<char *>(dest);
+
+       for (size_t i = len - 1; i >= 0; i--)
+               cd[i] = cs[i];
+
+       return dest;
+}
+
+int memcmp(const void *b1, const void *b2, size_t len)
+{
+       size_t pos;
+       const char *c1 = static_cast<const char *>(b1);
+       const char *c2 = static_cast<const char *>(b2);
+       
+       for (pos = 0; pos < len; pos++) {
+               if (c1[pos] != c2[pos])
+                       return c1[pos] - c2[pos];
+                       
+               pos++;
+       }
+       
+       return 0;
+}
+
+size_t strnlen(const char *s, size_t n)
+{
+       size_t pos = 0;
+       while (pos < n && *s++)
+               pos++;
+       return pos;
+}
+
+size_t strlen(const char *s)
+{
+       size_t pos = 0;
+       while (*s++)
+               pos++;
+       return pos;
+}
+
+char *strcpy(char *dest, const char *src)
+{
+       char *orig = dest;
+
+       do {
+               *dest = *src++;
+       } while (*dest++);
+
+       return orig;
+}
+
+char *strncpy(char *dest, const char *src, size_t len)
+{
+       char *orig = dest;
+
+       while (len--) {
+               *dest = *src++;
+               
+               if (!*dest++)
+                       break;
+       }
+       
+       memset(dest, 0, len);
+       return orig;
+}
+
+char *strcat(char *dest, const char *src)
+{
+       char *orig = dest;
+       dest += strlen(dest);
+
+       do {
+               *dest = *src++;
+       } while (*dest++);
+
+       return orig;
+}
+
+char *strncat(char *dest, const char *src, size_t len)
+{
+       char *orig = dest;
+       int orig_len = strlen(dest);
+       
+       len -= orig_len;
+       dest += orig_len;
+
+       while (len--) {
+               *dest = *src++;
+               
+               if (!*dest++)
+                       break;
+       }
+       
+       memset(dest, 0, len);
+       return orig;
+}
+
+void *memset(void *b, int ch, size_t len)
+{
+       char *c = static_cast<char *>(b);
+       
+       while (len--)
+               *c++ = ch;
+
+       return b;
+}