From 5f7d4d6e9f47d328e7c4ef71030bdc9e34892798 Mon Sep 17 00:00:00 2001 From: Oxore Date: Tue, 7 Mar 2023 16:05:46 +0300 Subject: Get rid of libc, take just parts of it --- app/main.c | 2 +- app/platform/retarget.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 81 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/main.c b/app/main.c index e857a38..352d766 100644 --- a/app/main.c +++ b/app/main.c @@ -59,7 +59,7 @@ #include "indicate/indicate_modes_task.h" #include "tsl_user.h" -#include "time.h" +#include "time/time.h" #include "stm32f0xx_usart.h" diff --git a/app/platform/retarget.cpp b/app/platform/retarget.cpp index 52be99f..524840e 100644 --- a/app/platform/retarget.cpp +++ b/app/platform/retarget.cpp @@ -1,9 +1,22 @@ -extern "C" void vApplicationMallocFailedHook(void) +#include "unistd.h" +#include +#include +#include +#include +#include "third_party/printf/printf.h" + +#ifdef errno +#undef errno +#endif + +int errno{}; + +extern "C" [[noreturn]] void vApplicationMallocFailedHook(void) { for (;;); } -extern "C" void vApplicationStackOverflowHook(void *task_handle, char *task_name) +extern "C" [[noreturn]] void vApplicationStackOverflowHook(void *task_handle, char *task_name) { (void) task_handle; (void) task_name; @@ -13,3 +26,68 @@ extern "C" void vApplicationStackOverflowHook(void *task_handle, char *task_name extern "C" void vApplicationIdleHook(void) { } + +extern "C" [[noreturn]] void _exit(int __status) +{ + (void) __status; + for (;;); +} + +/* func can be NULL, in which case no function information is given. */ +extern "C" [[noreturn]] void __assert_func ( + const char *file, int line, const char *func, const char *failedexpr) +{ + dprintf(STDERR_FILENO, + "assertion \"%s\" failed: file \"%s\", line %d%s%s\n", + failedexpr, file, line, + func ? ", function: " : "", func ? func : ""); + abort(); + /* NOTREACHED */ +} + +extern "C" ssize_t read(int fd, void *buf, size_t nbytes) +{ + (void) fd; + (void) buf; + (void) nbytes; + errno = ENOSYS; + return -1; +} + +extern "C" ssize_t write(int fd, const void *buf, size_t nbytes) +{ + (void) fd; + (void) buf; + (void) nbytes; + errno = ENOSYS; + return -1; +} + +static void dputchar2(char c, void* fd) +{ + write(reinterpret_cast(fd), &c, 1); +} + +static void dputchar(char c, int fd) +{ + write(fd, &c, 1); +} + +extern "C" int dprintf(int fd, const char * format, ...) +{ + va_list args; + va_start(args, format); + const int ret = vfctprintf(dputchar2, reinterpret_cast(fd), format, args); + va_end(args); + return ret; +} + +extern "C" int vdprintf(int fd, const char * format, va_list args) +{ + return vfctprintf(dputchar2, reinterpret_cast(fd), format, args); +} + +extern "C" void putchar_(char c) +{ + dputchar(c, STDIN_FILENO); +} -- cgit v1.2.3