/* Copyright (c) Kuba SzczodrzyƄski 2022-06-19. */ #pragma once #include #ifdef __cplusplus extern "C" { #endif // __cplusplus #define PRINTF_HAS_DISABLE 1 // make printf.c define wrapper functions #define printf_ __wrap_printf #define sprintf_ __wrap_sprintf #define vsprintf_ __wrap_vsprintf #define snprintf_ __wrap_snprintf #define vsnprintf_ __wrap_vsnprintf #define vprintf_ __wrap_vprintf // declare putchar() method with custom output port void putchar_p(char c, unsigned long port); #define WRAP_DISABLE_DEF(name) \ extern void __wrap_##name##_disable(); \ extern void __wrap_##name##_enable(); \ extern void __wrap_##name##_set(unsigned char disabled); \ extern unsigned char __wrap_##name##_get(); #if !LT_UART_SILENT_ENABLED || LT_UART_SILENT_ALL #define WRAP_DISABLE_DECL(name) \ void __wrap_##name##_disable() {} \ void __wrap_##name##_enable() {} \ void __wrap_##name##_set(unsigned char disabled) {} \ unsigned char __wrap_##name##_get() { \ return LT_UART_SILENT_ALL; \ } #define WRAP_DISABLE_CHECK(name) \ { \ if (LT_UART_SILENT_ALL) \ return 0; \ } #else // LT_UART_SILENT_ENABLED && !LT_UART_SILENT_ALL #define WRAP_DISABLE_DECL(name) \ static unsigned char __wrap_##name##_disabled = 0; \ void __wrap_##name##_disable() { \ __wrap_##name##_disabled = 1; \ } \ void __wrap_##name##_enable() { \ __wrap_##name##_disabled = 0; \ } \ void __wrap_##name##_set(unsigned char disabled) { \ __wrap_##name##_disabled = disabled; \ } \ unsigned char __wrap_##name##_get() { \ return __wrap_##name##_disabled; \ } #define WRAP_DISABLE_CHECK(name) \ { \ if (__wrap_##name##_disabled) \ return 0; \ } #endif // LT_UART_SILENT_ENABLED && !LT_UART_SILENT_ALL #if !LT_UART_SILENT_ENABLED #define WRAP_PRINTF(name) \ WRAP_DISABLE_DECL(name) \ int __wrap_##name(const char *format, ...) { \ va_list va; \ va_start(va, format); \ const int ret = vprintf(format, va); \ va_end(va); \ return ret; \ } #define WRAP_VPRINTF(name) \ WRAP_DISABLE_DECL(name) \ int __wrap_##name(const char *format, va_list arg) { \ return vprintf(format, arg); \ } #elif LT_UART_SILENT_ALL #define WRAP_PRINTF(name) \ WRAP_DISABLE_DECL(name) \ int __wrap_##name(const char *format, ...) { \ return 0; \ } #define WRAP_VPRINTF(name) \ WRAP_DISABLE_DECL(name) \ int __wrap_##name(const char *format, va_list arg) { \ return 0; \ } #else // !LT_UART_SILENT_ENABLED || !LT_UART_SILENT_ALL #define WRAP_PRINTF(name) \ WRAP_DISABLE_DECL(name) \ int __wrap_##name(const char *format, ...) { \ WRAP_DISABLE_CHECK(name); \ va_list va; \ va_start(va, format); \ const int ret = vprintf(format, va); \ va_end(va); \ return ret; \ } #define WRAP_VPRINTF(name) \ WRAP_DISABLE_DECL(name) \ int __wrap_##name(const char *format, va_list arg) { \ WRAP_DISABLE_CHECK(name); \ return vprintf(format, arg); \ } #endif // !LT_UART_SILENT_ENABLED || !LT_UART_SILENT_ALL #define WRAP_SPRINTF(name) \ int __wrap_##name(char *s, const char *format, ...) { \ va_list va; \ va_start(va, format); \ const int ret = vsprintf(s, format, va); \ va_end(va); \ return ret; \ } #define WRAP_SNPRINTF(name) \ int __wrap_##name(char *s, size_t count, const char *format, ...) { \ va_list va; \ va_start(va, format); \ const int ret = vsnprintf(s, count, format, va); \ va_end(va); \ return ret; \ } #define WRAP_VSPRINTF(name) \ int __wrap_##name(char *s, const char *format, va_list arg) { \ return vsprintf(s, format, arg); \ } #define WRAP_VSNPRINTF(name) \ int __wrap_##name(char *s, size_t count, const char *format, va_list arg) { \ return vsnprintf(s, count, format, arg); \ } #ifdef __cplusplus } // extern "C" #endif