mirror of
https://github.com/fmtlib/fmt.git
synced 2026-06-15 08:26:13 +08:00
67 lines
2.3 KiB
C++
67 lines
2.3 KiB
C++
// Formatting library for C++ - the C API
|
|
//
|
|
// Copyright (c) 2012 - present, Victor Zverovich and {fmt} contributors
|
|
// All rights reserved.
|
|
//
|
|
// For the license information refer to format.h.
|
|
|
|
#include "fmt/fmt-c.h"
|
|
|
|
#include <fmt/base.h>
|
|
|
|
constexpr size_t max_c_format_args = 16;
|
|
static int convert_c_format_args(
|
|
fmt::basic_format_arg<fmt::format_context>* format_args,
|
|
const fmt_arg* args, size_t num_args) {
|
|
if (num_args > max_c_format_args) return fmt_error_invalid_arg;
|
|
|
|
for (size_t i = 0; i < num_args; ++i) {
|
|
switch (args[i].type) {
|
|
case fmt_int: format_args[i] = args[i].value.int_value; break;
|
|
case fmt_uint: format_args[i] = args[i].value.uint_value; break;
|
|
case fmt_bool: format_args[i] = args[i].value.bool_value; break;
|
|
case fmt_char: format_args[i] = args[i].value.char_value; break;
|
|
case fmt_float: format_args[i] = args[i].value.float_value; break;
|
|
case fmt_double: format_args[i] = args[i].value.double_value; break;
|
|
case fmt_long_double:
|
|
format_args[i] = args[i].value.long_double_value;
|
|
break;
|
|
case fmt_cstring: format_args[i] = args[i].value.cstring; break;
|
|
case fmt_pointer: format_args[i] = args[i].value.pointer; break;
|
|
default: return fmt_error_invalid_arg;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
extern "C" int fmt_vformat(char* buffer, size_t size, const char* fmt,
|
|
const fmt_arg* args, size_t num_args) {
|
|
fmt::basic_format_arg<fmt::format_context> format_args[max_c_format_args];
|
|
int error = convert_c_format_args(format_args, args, num_args);
|
|
if (error != 0) return error;
|
|
|
|
FMT_TRY {
|
|
auto result = fmt::vformat_to_n(
|
|
buffer, size, fmt,
|
|
fmt::format_args(format_args, static_cast<int>(num_args)));
|
|
return static_cast<int>(result.size);
|
|
}
|
|
FMT_CATCH(...) {}
|
|
return fmt_error;
|
|
}
|
|
|
|
extern "C" int fmt_vprint(FILE* stream, const char* fmt, const fmt_arg* args,
|
|
size_t num_args) {
|
|
fmt::basic_format_arg<fmt::format_context> format_args[max_c_format_args];
|
|
int error = convert_c_format_args(format_args, args, num_args);
|
|
if (error != 0) return error;
|
|
|
|
FMT_TRY {
|
|
fmt::vprint(stream, fmt,
|
|
fmt::format_args(format_args, static_cast<int>(num_args)));
|
|
return 0;
|
|
}
|
|
FMT_CATCH(...) {}
|
|
return fmt_error;
|
|
}
|