87 lines
6.7 KiB
C
87 lines
6.7 KiB
C
/* Copyright (c) Kuba Szczodrzyński 2022-06-19. */
|
|
|
|
#pragma once
|
|
|
|
#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
|
|
|
|
#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();
|
|
|
|
#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; \
|
|
}
|
|
|
|
#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_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_VPRINTF(name) \
|
|
WRAP_DISABLE_DECL(name) \
|
|
int __wrap_##name(const char *format, va_list arg) { \
|
|
WRAP_DISABLE_CHECK(name); \
|
|
return vprintf(format, arg); \
|
|
}
|
|
|
|
#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); \
|
|
}
|