22
33#include < fmt/core.h>
44
5- #include < array>
65#include < cassert>
7- #include < exception>
8- #include < string>
9- #include < vector>
106
117extern " C" {
128
13- using Context = fmt::format_context;
9+ using format_arg = fmt::basic_format_arg<fmt:: format_context> ;
1410
15- static bool populate_store (fmt::basic_format_arg<Context> * out,
16- const fmt_arg* c_args, size_t arg_count) {
17- if (arg_count > FMT_C_MAX_ARGS ) {
11+ static bool populate_store (format_arg * out, const fmt_arg* c_args ,
12+ size_t arg_count) {
13+ if (arg_count > fmt_c_max_args ) {
1814 return false ;
1915 }
2016
2117 for (size_t i = 0 ; i < arg_count; ++i) {
2218 switch (c_args[i].type ) {
23- case fmt_int:
24- out[i] = fmt::basic_format_arg<Context>(c_args[i].value .i64 );
25- break ;
26- case fmt_uint:
27- out[i] = fmt::basic_format_arg<Context>(c_args[i].value .u64 );
28- break ;
29- case fmt_float:
30- out[i] = fmt::basic_format_arg<Context>(c_args[i].value .f32 );
31- break ;
32- case fmt_double:
33- out[i] = fmt::basic_format_arg<Context>(c_args[i].value .f64 );
34- break ;
35- case fmt_long_double:
36- out[i] = fmt::basic_format_arg<Context>(c_args[i].value .f128 );
37- break ;
38- case fmt_ptr:
39- out[i] = fmt::basic_format_arg<Context>(c_args[i].value .ptr );
40- break ;
41- case fmt_char:
42- out[i] = fmt::basic_format_arg<Context>(
43- static_cast <char >(c_args[i].value .char_val ));
44- break ;
45- case fmt_bool:
46- out[i] = fmt::basic_format_arg<Context>(c_args[i].value .bool_val != 0 );
47- break ;
48- case fmt_string: {
49- const char * s = c_args[i].value .str ? c_args[i].value .str : " (null)" ;
50- out[i] = fmt::basic_format_arg<Context>(fmt::string_view (s));
51- break ;
52- }
53-
54- default : return false ;
19+ case fmt_int: out[i] = c_args[i].value .i64 ; break ;
20+ case fmt_uint: out[i] = c_args[i].value .u64 ; break ;
21+ case fmt_float: out[i] = c_args[i].value .f32 ; break ;
22+ case fmt_double: out[i] = c_args[i].value .f64 ; break ;
23+ case fmt_long_double: out[i] = c_args[i].value .f128 ; break ;
24+ case fmt_ptr: out[i] = c_args[i].value .ptr ; break ;
25+ case fmt_char: out[i] = c_args[i].value .char_val ; break ;
26+ case fmt_bool: out[i] = c_args[i].value .bool_val ; break ;
27+ case fmt_string: out[i] = c_args[i].value .str ; break ;
28+ default : return false ;
5529 }
5630 }
5731 return true ;
5832}
33+
5934int fmt_vformat (char * buffer, size_t capacity, const char * format_str,
6035 const fmt_arg* args, size_t arg_count) {
6136 assert (format_str);
6237
63- fmt::basic_format_arg<Context> format_args[FMT_C_MAX_ARGS ];
38+ format_arg format_args[fmt_c_max_args ];
6439
65- try {
66- if (arg_count > 0 ) {
67- assert (args);
68- if (!populate_store (format_args, args, arg_count)) {
69- return fmt_err_exception;
70- }
40+ if (arg_count > 0 ) {
41+ assert (args);
42+ if (!populate_store (format_args, args, arg_count)) {
43+ return fmt_err_invalid_arg;
7144 }
45+ }
7246
73- auto format_args_view = fmt::basic_format_args<Context>(
74- format_args, static_cast <int >(arg_count));
75-
76- size_t write_capacity = (capacity > 0 ) ? capacity - 1 : 0 ;
77- auto result =
78- fmt::vformat_to_n (buffer, write_capacity, format_str, format_args_view);
79-
80- if (capacity > 0 ) {
81- buffer[result.size ] = ' \0 ' ;
82- }
83- return static_cast <int >(result.size );
47+ auto format_args_view = fmt::basic_format_args<fmt::format_context>(
48+ format_args, static_cast <int >(arg_count));
8449
85- } catch (const std::bad_alloc&) {
86- return fmt_err_memory;
87- } catch (...) {
88- return fmt_err_exception;
89- }
50+ auto result =
51+ fmt::vformat_to_n (buffer, capacity, format_str, format_args_view);
52+ return static_cast <int >(result.size );
9053}
9154
92- } // extern "C"
55+ } // extern "C"
0 commit comments