summaryrefslogtreecommitdiff
path: root/src/kernel/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/util.c')
-rw-r--r--src/kernel/util.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/kernel/util.c b/src/kernel/util.c
new file mode 100644
index 0000000..df6e7d8
--- /dev/null
+++ b/src/kernel/util.c
@@ -0,0 +1,100 @@
+#include <stdint.h>
+#include "panic.h"
+#include <stdbool.h>
+
+void memcpy(void *from, void *to, uint32_t n) {
+ panic("Not implemented (memcpy).");
+}
+
+void u32_dec(uint32_t n, uint8_t *b) {
+ if (!n) {
+ *(uint16_t *)b = '0';
+ return;
+ }
+ bool zero = false;
+ for (uint32_t m = 1000000000; m; m /= 10) {
+ uint8_t d = (n / m) % 10;
+ if (zero)
+ *(b++) = d + '0';
+ else if (d) {
+ zero = true;
+ *(b++) = d + '0';
+ }
+ }
+ *b = 0;
+}
+
+void u16_dec(uint16_t n, uint8_t *b) {
+ if (!n) {
+ *(uint16_t *)b = '0';
+ return;
+ }
+ bool zero = false;
+ for (uint32_t m = 10000; m; m /= 10) {
+ uint8_t d = (n / m) % 10;
+ if (zero)
+ *(b++) = d + '0';
+ else if (d) {
+ zero = true;
+ *(b++) = d + '0';
+ }
+ }
+ *b = 0;
+}
+
+void u8_dec(uint8_t n, uint8_t *b) {
+ if (!n) {
+ *(uint16_t *)b = '0';
+ return;
+ }
+ bool zero = false;
+ for (uint32_t m = 100; m; m /= 10) {
+ uint8_t d = (n / m) % 10;
+ if (zero)
+ *(b++) = d + '0';
+ else if (d) {
+ zero = true;
+ *(b++) = d + '0';
+ }
+ }
+ *b = 0;
+}
+
+void u32_hex(uint32_t n, uint8_t *b) {
+ uint8_t m = 28;
+ while (1) {
+ uint8_t d = (n >> m) & 0xf;
+ *(b++) = d >= 10 ? 'a' + d - 10 : '0' + d;
+ if (!m) {
+ *b = 0;
+ return;
+ }
+ m -= 4;
+ }
+}
+
+void u16_hex(uint16_t n, uint8_t *b) {
+ uint8_t m = 12;
+ while (1) {
+ uint8_t d = (n >> m) & 0xf;
+ *(b++) = d >= 10 ? 'a' + d - 10 : '0' + d;
+ if (!m) {
+ *b = 0;
+ return;
+ }
+ m -= 4;
+ }
+}
+
+void u8_hex(uint8_t n, uint8_t *b) {
+ uint8_t m = 4;
+ while (1) {
+ uint8_t d = (n >> m) & 0xf;
+ *(b++) = d >= 10 ? 'a' + d - 10 : '0' + d;
+ if (!m) {
+ *b = 0;
+ return;
+ }
+ m -= 4;
+ }
+} \ No newline at end of file