CMake: allow to replace native *printf to stb_*printf

This commit is contained in:
Carter Li
2024-10-28 14:47:08 +08:00
parent 332ddfc6ed
commit e19ed4c8f6
8 changed files with 80 additions and 4 deletions
+7
View File
@@ -20,8 +20,15 @@ void ffStrbufInitVF(FFstrbuf* strbuf, const char* format, va_list arguments)
{
assert(format != NULL);
#ifndef FF_USE_STBPRINTF
int len = vasprintf(&strbuf->chars, format, arguments);
assert(len >= 0);
#else
int len = vsnprintf(NULL, 0, format, arguments);
assert(len >= 0);
strbuf->chars = (char*) malloc(sizeof(char) * (len + 1));
vsnprintf(strbuf->chars, len + 1, format, arguments);
#endif
strbuf->allocated = (uint32_t)(len + 1);
strbuf->length = (uint32_t)len;
+2
View File
@@ -18,6 +18,8 @@
#define FASTFETCH_STRBUF_DEFAULT_ALLOC 32
#include "stb_printf.h"
typedef struct FFstrbuf
{
uint32_t allocated;
+3
View File
@@ -0,0 +1,3 @@
#define STB_SPRINTF_IMPLEMENTATION 1
#pragma GCC diagnostic ignored "-Wsign-conversion"
#include "3rdparty/stb/stb_sprintf.h"
+50
View File
@@ -0,0 +1,50 @@
#pragma once
#ifdef FF_USE_STBPRINTF
#include <stdio.h>
#include <stdint.h>
#include "3rdparty/stb/stb_sprintf.h"
static inline char *STB_SPRINTF_DECORATE(printf_callback)(const char* __restrict buf, void* __restrict user, int len)
{
fwrite(buf, 1, (uint32_t) len, (FILE *)user);
return (char *) buf;
}
static inline int STB_SPRINTF_DECORATE(vfprintf)(FILE* file, char const* __restrict fmt, va_list va)
{
char tmp[STB_SPRINTF_MIN];
return STB_SPRINTF_DECORATE(vsprintfcb)(STB_SPRINTF_DECORATE(printf_callback), file, tmp, fmt, va);
}
#define vfprintf(...) STB_SPRINTF_DECORATE(vfprintf)(__VA_ARGS__)
static inline int STBSP__ATTRIBUTE_FORMAT(1,2) STB_SPRINTF_DECORATE(printf)(char const* __restrict fmt, ...)
{
va_list va;
va_start(va, fmt);
int result = STB_SPRINTF_DECORATE(vfprintf)(stdout, fmt, va);
va_end(va);
return result;
}
#define printf(...) STB_SPRINTF_DECORATE(printf)(__VA_ARGS__)
static inline int STBSP__ATTRIBUTE_FORMAT(2,3) STB_SPRINTF_DECORATE(fprintf)(FILE* __restrict file, char const* __restrict fmt, ...)
{
va_list va;
va_start(va, fmt);
int result = STB_SPRINTF_DECORATE(vfprintf)(file, fmt, va);
va_end(va);
return result;
}
#define fprintf(...) STB_SPRINTF_DECORATE(fprintf)(__VA_ARGS__)
#define vsprintf(...) STB_SPRINTF_DECORATE(vsprintf)(__VA_ARGS__)
#define vsnprintf(...) STB_SPRINTF_DECORATE(vsnprintf)(__VA_ARGS__)
#define sprintf(...) STB_SPRINTF_DECORATE(sprintf)(__VA_ARGS__)
#define snprintf(...) STB_SPRINTF_DECORATE(snprintf)(__VA_ARGS__)
#endif