aboutsummaryrefslogtreecommitdiff
path: root/src/utils/strings.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/strings.c')
-rw-r--r--src/utils/strings.c119
1 files changed, 119 insertions, 0 deletions
diff --git a/src/utils/strings.c b/src/utils/strings.c
new file mode 100644
index 0000000..368d7dc
--- /dev/null
+++ b/src/utils/strings.c
@@ -0,0 +1,119 @@
+#include "strings.h"
+
+void uint32_to_dec(uint32_t number, char buf[10])
+{
+ for (int i = 0; i < 10; i++)
+ {
+ buf[10 - 1 - i] = '0' + (number % 10);
+ number /= 10;
+ }
+}
+
+void uint32_to_hex(uint32_t number, char buf[8])
+{
+ for (int i = 0; i < 8; i++)
+ {
+ unsigned char quadbit = (number >> ((8 - i - 1) * 4)) & 0xf;
+ buf[i] = quadbit > 9 ? quadbit - 10 + 'a' : quadbit + '0';
+ }
+}
+
+void uint32_to_bin(uint32_t number, char buf[32])
+{
+ for (int i = 0; i < 32; i++)
+ buf[i] = ((number >> (32 - i - 1)) & 1) ? '1' : '0';
+}
+
+void uint32_to_decstring(uint32_t number, char buf[11])
+{
+ uint32_to_dec(number, buf);
+ buf[10] = '\0';
+}
+
+void uint32_to_hexstring(uint32_t number, char buf[9])
+{
+ uint32_to_hex(number, buf);
+ buf[8] = '\0';
+}
+
+void uint32_to_binstring(uint32_t number, char buf[33])
+{
+ uint32_to_bin(number, buf);
+ buf[32] = '\0';
+}
+
+void trim_0s(char string[])
+{
+ size_t i;
+ for (i = 0; string[i] == '0'; i++);
+
+ size_t j = 0;
+
+ if (!string[i])
+ string[j++] = string[--i];
+
+ do
+ string[j] = string[i + j];
+ while (string[j++]);
+}
+
+void uint32_to_decstringt(uint32_t number, char buf[11])
+{
+ uint32_to_decstring(number, buf);
+ trim_0s(buf);
+}
+
+void uint32_to_hexstringt(uint32_t number, char buf[9])
+{
+ uint32_to_hexstring(number, buf);
+ trim_0s(buf);
+}
+
+size_t strlen(char string[])
+{
+ size_t len;
+
+ for (len = 0; string[len]; len++);
+
+ return len;
+}
+
+void memcpy(void *dst, void *src, size_t nbytes)
+{
+ size_t iter;
+
+ // copying by word is faster than by byte,
+ // but can easily cause alignment faults, so we resign from it...
+ for (iter = 0; iter < nbytes ; iter++)
+ ((volatile uint8_t*) dst)[iter] = ((uint8_t*) src)[iter];
+}
+
+// keep in mind memset is also needed for array initialization, like
+// uint32_t buf[16] = {0};
+// gcc compiles this to memset call
+
+void *memset(void *s, int c, size_t n)
+{
+ volatile char *mem = s;
+
+ for (size_t i = 0; i < n; i++)
+ mem[i] = c;
+
+ return s;
+}
+
+char *strcat(char *dst, const char *src)
+{
+ char *where_to_append;
+
+ for (where_to_append = dst; *where_to_append; where_to_append++);
+
+ size_t i;
+
+ for (i = 0; src[i]; i++)
+ ((char volatile*) where_to_append)[i] = src[i];
+
+ ((char volatile*) where_to_append)[i] = '\0';
+
+ return dst;
+}