2022-07-25 14:26:08 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
2024-07-16 16:11:26 +08:00
|
|
|
#include "util/FFstrbuf.h"
|
|
|
|
|
|
2024-11-14 10:04:57 +08:00
|
|
|
typedef enum __attribute__((__packed__)) FFformatArgType
|
2022-07-25 14:26:08 +02:00
|
|
|
{
|
|
|
|
|
FF_FORMAT_ARG_TYPE_NULL = 0,
|
|
|
|
|
FF_FORMAT_ARG_TYPE_UINT,
|
2023-09-08 00:07:14 +08:00
|
|
|
FF_FORMAT_ARG_TYPE_UINT64,
|
2022-07-25 14:26:08 +02:00
|
|
|
FF_FORMAT_ARG_TYPE_UINT16,
|
|
|
|
|
FF_FORMAT_ARG_TYPE_UINT8,
|
|
|
|
|
FF_FORMAT_ARG_TYPE_INT,
|
|
|
|
|
FF_FORMAT_ARG_TYPE_STRING,
|
|
|
|
|
FF_FORMAT_ARG_TYPE_STRBUF,
|
2023-01-09 18:59:02 +08:00
|
|
|
FF_FORMAT_ARG_TYPE_FLOAT,
|
2022-07-25 14:26:08 +02:00
|
|
|
FF_FORMAT_ARG_TYPE_DOUBLE,
|
2022-10-17 13:19:48 +02:00
|
|
|
FF_FORMAT_ARG_TYPE_LIST,
|
|
|
|
|
FF_FORMAT_ARG_TYPE_BOOL
|
2024-09-03 14:52:40 +08:00
|
|
|
} FFformatArgType;
|
|
|
|
|
|
|
|
|
|
#define FF_FORMAT_ARG(variable, var_name) { _Generic((variable), \
|
|
|
|
|
uint32_t: FF_FORMAT_ARG_TYPE_UINT, \
|
|
|
|
|
uint64_t: FF_FORMAT_ARG_TYPE_UINT64, \
|
|
|
|
|
uint16_t: FF_FORMAT_ARG_TYPE_UINT16, \
|
|
|
|
|
uint8_t: FF_FORMAT_ARG_TYPE_UINT8, \
|
|
|
|
|
int32_t: FF_FORMAT_ARG_TYPE_INT, \
|
|
|
|
|
char*: FF_FORMAT_ARG_TYPE_STRING, \
|
|
|
|
|
const char*: FF_FORMAT_ARG_TYPE_STRING, \
|
|
|
|
|
FFstrbuf: FF_FORMAT_ARG_TYPE_STRBUF, \
|
|
|
|
|
float: FF_FORMAT_ARG_TYPE_FLOAT, \
|
|
|
|
|
double: FF_FORMAT_ARG_TYPE_DOUBLE, \
|
|
|
|
|
FFlist: FF_FORMAT_ARG_TYPE_LIST, \
|
|
|
|
|
bool: FF_FORMAT_ARG_TYPE_BOOL \
|
|
|
|
|
), _Generic((variable), char*: (variable), const char*: (variable), default: &(variable) ), (var_name) }
|
2022-07-25 14:26:08 +02:00
|
|
|
|
|
|
|
|
typedef struct FFformatarg
|
|
|
|
|
{
|
2024-09-03 14:52:40 +08:00
|
|
|
FFformatArgType type;
|
2022-07-25 14:26:08 +02:00
|
|
|
const void* value;
|
2024-05-27 16:41:37 +08:00
|
|
|
const char* name; // argument name, must start with an alphabet
|
2022-07-25 14:26:08 +02:00
|
|
|
} FFformatarg;
|
|
|
|
|
|
|
|
|
|
void ffFormatAppendFormatArg(FFstrbuf* buffer, const FFformatarg* formatarg);
|
|
|
|
|
void ffParseFormatString(FFstrbuf* buffer, const FFstrbuf* formatstr, uint32_t numArgs, const FFformatarg* arguments);
|
2024-12-11 10:47:02 +08:00
|
|
|
#define FF_PARSE_FORMAT_STRING_CHECKED(buffer, formatstr, arguments) \
|
|
|
|
|
ffParseFormatString((buffer), (formatstr), sizeof(arguments) / sizeof(*arguments), (arguments));
|