summaryrefslogtreecommitdiffstatshomepage
path: root/stm/string0.c
diff options
context:
space:
mode:
authorDamien <damien.p.george@gmail.com>2013-10-13 00:42:20 +0100
committerDamien <damien.p.george@gmail.com>2013-10-13 00:42:20 +0100
commited65605edc5c1376947a34723b9c750400b5a028 (patch)
treed0317e867c4286ec7c889fc9ed18591a1d9990dd /stm/string0.c
parent3ef4abb446dfcbdbc426a0921a33e0883607e677 (diff)
downloadmicropython-ed65605edc5c1376947a34723b9c750400b5a028.tar.gz
micropython-ed65605edc5c1376947a34723b9c750400b5a028.zip
Inital commit of stm32f4xx framework.
Diffstat (limited to 'stm/string0.c')
-rw-r--r--stm/string0.c95
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;
+}