diff options
author | Damien <damien.p.george@gmail.com> | 2013-10-13 00:42:20 +0100 |
---|---|---|
committer | Damien <damien.p.george@gmail.com> | 2013-10-13 00:42:20 +0100 |
commit | ed65605edc5c1376947a34723b9c750400b5a028 (patch) | |
tree | d0317e867c4286ec7c889fc9ed18591a1d9990dd /stm/string0.c | |
parent | 3ef4abb446dfcbdbc426a0921a33e0883607e677 (diff) | |
download | micropython-ed65605edc5c1376947a34723b9c750400b5a028.tar.gz micropython-ed65605edc5c1376947a34723b9c750400b5a028.zip |
Inital commit of stm32f4xx framework.
Diffstat (limited to 'stm/string0.c')
-rw-r--r-- | stm/string0.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/stm/string0.c b/stm/string0.c new file mode 100644 index 0000000000..6e2c252eaa --- /dev/null +++ b/stm/string0.c @@ -0,0 +1,95 @@ +#include <stdint.h> +#include "std.h" + +void *memcpy(void *dest, const void *src, size_t n) { + // TODO align and copy 32 bits at a time + uint8_t *d = dest; + const uint8_t *s = src; + for (; n > 0; n--) { + *d++ = *s++; + } + return dest; +} + +void *memset(void *s, int c, size_t n) { + uint8_t *s2 = s; + for (; n > 0; n--) { + *s2++ = c; + } + return s; +} + +int strlen(const char *str) { + int len = 0; + for (const char *s = str; *s; s++) { + len += 1; + } + return len; +} + +int strcmp(const char *s1, const char *s2) { + while (*s1 && *s2) { + char c1 = *s1++; // XXX UTF8 get char, next char + char c2 = *s2++; // XXX UTF8 get char, next char + if (c1 < c2) return -1; + else if (c1 > c2) return 1; + } + if (*s2) return -1; + else if (*s1) return 1; + else return 0; +} + +int strncmp(const char *s1, const char *s2, size_t n) { + while (*s1 && *s2 && n > 0) { + char c1 = *s1++; // XXX UTF8 get char, next char + char c2 = *s2++; // XXX UTF8 get char, next char + n--; + if (c1 < c2) return -1; + else if (c1 > c2) return 1; + } + if (n == 0) return 0; + else if (*s2) return -1; + else if (*s1) return 1; + else return 0; +} + +char *strndup(const char *s, size_t n) { + size_t len = strlen(s); + if (n > len) { + n = len; + } + char *s2 = malloc(n + 1); + memcpy(s2, s, n); + s2[n] = '\0'; + return s2; +} + +char *strcpy(char *dest, const char *src) { + char *d = dest; + while (*src) { + *d++ = *src++; + } + *d = '\0'; + return dest; +} + +// needed because gcc optimises strcpy + strcat to this +char *stpcpy(char *dest, const char *src) { + while (*src) { + *dest++ = *src++; + } + *dest = '\0'; + return dest; +} + +char *strcat(char *dest, const char *src) { + char *d = dest; + while (*d) { + d++; + } + while (*src) { + *d++ = *src++; + } + *d = '\0'; + return dest; +} |