More libc functions, and build-as-c fixes.
authorScott Wood <scott@thor.buserror.net>
Sun, 5 Aug 2007 17:05:08 +0000 (12:05 -0500)
committerScott Wood <scott@thor.buserror.net>
Sun, 5 Aug 2007 17:05:08 +0000 (12:05 -0500)
include/c/std/string.h
lib/c/freestanding/string.c
utils/buildendian.c

index e457ed59081462f325115a095cc452e778549eee..55261598682edaab7723d28170600185347d8657 100644 (file)
@@ -7,13 +7,29 @@
 extern "C" {
 #endif
 
-void *memcpy(void *dest, const void *src, size_t len);
-void *memset(void *block, int count, size_t len);
-int memcmp(const void *b1, const void *b2, size_t len);
-size_t strlen(const char *s);
+       void *memcpy(void *dest, const void *src, size_t len);
+       void *memmove(void *dest, const void *src, size_t len);
+       int memcmp(const void *b1, const void *b2, size_t len);
+       void *memset(void *block, int count, size_t len);
+       size_t strnlen(const char *s, size_t n);
+       size_t strlen(const char *s);
+       char *strcpy(char *dest, const char *src);
+       char *strncpy(char *dest, const char *src, size_t len);
+       char *strcat(char *dest, const char *src);
+       char *strncat(char *dest, const char *src, size_t len);
+       int strcmp(const char *s1, const char *s2);
+       int strncmp(const char *s1, const char *s2, int n);
 
 #ifdef __cplusplus
+       char *strchr(char *s, int c);
 }
+
+static inline const char *strchr(const char *s, int c)
+{
+       return const_cast<const char *>(strchr(const_cast<char *>(s), c));
+}
+#else
+char *strchr(const char *s, int c);
 #endif
 
 #endif
index a3bb62e63384a328bf5453fc41a5f1bb87c6275c..0241f91b5c10176ef2fb8f54fc3b179e16717699 100644 (file)
 
 void *memcpy(void *dest, const void *src, size_t len)
 {
-       const char *cs = static_cast<const char *>(src);
-       char *cd = static_cast<char *>(dest);
+       const char *cs = src;
+       char *cd = dest;
+       size_t i;
 
-       for (size_t i = 0; i < len; i++)
+       for (i = 0; i < len; i++)
                cd[i] = cs[i];
 
        return dest;
@@ -28,13 +29,14 @@ void *memcpy(void *dest, const void *src, size_t len)
 
 void *memmove(void *dest, const void *src, size_t len)
 {
+       const char *cs = src;
+       char *cd = dest;
+       size_t i;
+
        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--)
+       for (i = len - 1; i >= 0; i--)
                cd[i] = cs[i];
 
        return dest;
@@ -43,8 +45,8 @@ void *memmove(void *dest, const void *src, size_t len)
 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);
+       const char *c1 = b1;
+       const char *c2 = b2;
        
        for (pos = 0; pos < len; pos++) {
                if (c1[pos] != c2[pos])
@@ -56,19 +58,33 @@ int memcmp(const void *b1, const void *b2, size_t len)
        return 0;
 }
 
+void *memset(void *b, int ch, size_t len)
+{
+       char *c = b;
+       
+       while (len--)
+               *c++ = ch;
+
+       return b;
+}
+
 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;
 }
 
@@ -129,12 +145,36 @@ char *strncat(char *dest, const char *src, size_t len)
        return orig;
 }
 
-void *memset(void *b, int ch, size_t len)
+int strcmp(const char *s1, const char *s2)
 {
-       char *c = static_cast<char *>(b);
-       
-       while (len--)
-               *c++ = ch;
+       while (*s1 && *s2 && *s1 == *s2) {
+               s1++;
+               s2++;
+       }
 
-       return b;
+       return *s2 - *s1;
+}
+
+int strncmp(const char *s1, const char *s2, int n)
+{
+       int i = 0;
+
+       while (i < n && s1[i] && s2[i] && s1[i] == s2[i])
+               i++;
+
+       if (i == n)
+               return 0;
+
+       return *s2 - *s1;
+}
+
+char *strchr(const char *s, int c)
+{
+       while (*s && *s != c)
+               s++;
+
+       if (*s == c) 
+               return (char *)s;
+
+       return NULL;
 }
index d9b4e6ed86e4089271cfe1b0c60674eb8847ba51..f4026ae90ee68a17bd36c1b60badec2b38fecbba 100644 (file)
@@ -6,13 +6,14 @@ int main(void)
        union {
                uint32_t a;
                uint8_t b[4];
-       };
+       } u;
        
-       a = 0x12345678;
+       u.a = 0x12345678;
        
-       if (b[0] == 0x12 && b[1] == 0x34 && b[2] == 0x56 && b[3] == 0x78)
+       if (u.b[0] == 0x12 && u.b[1] == 0x34 && u.b[2] == 0x56 && u.b[3] == 0x78)
                printf("BE");
-       else if (b[3] == 0x12 && b[2] == 0x34 && b[1] == 0x56 && b[0] == 0x78)
+       else if (u.b[3] == 0x12 && u.b[2] == 0x34 &&
+                u.b[1] == 0x56 && u.b[0] == 0x78)
                printf("LE");
        else
                printf("UNKNOWN");