It is a source of possible bugs that json print handler print_uint was doing implict conversion to 64 bit than printing with the format specifier which often had only a unsigned format value.
Instead introduce wider range of print stubs for unsigned integer types. No color versions of these necessary. Signed-off-by: Stephen Hemminger <step...@networkplumber.org> --- include/json_print.h | 16 +++++++++++++--- lib/json_print.c | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/include/json_print.h b/include/json_print.h index 2ca7830adbd6..3d400ecf8f50 100644 --- a/include/json_print.h +++ b/include/json_print.h @@ -59,12 +59,22 @@ _PRINT_FUNC(int, int); _PRINT_FUNC(bool, bool); _PRINT_FUNC(null, const char*); _PRINT_FUNC(string, const char*); -_PRINT_FUNC(uint, uint64_t); -_PRINT_FUNC(hu, unsigned short); _PRINT_FUNC(hex, unsigned int); _PRINT_FUNC(0xhex, unsigned int); -_PRINT_FUNC(lluint, unsigned long long int); _PRINT_FUNC(float, double); #undef _PRINT_FUNC +#define _PRINT_FUNC(type_name, type) \ + void print_##type_name(enum output_type t, \ + const char *key, \ + const char *fmt, \ + type value); + +_PRINT_FUNC(hu, unsigned short); +_PRINT_FUNC(uint, unsigned int); +_PRINT_FUNC(luint, unsigned long int); +_PRINT_FUNC(uint64, uint64_t); +_PRINT_FUNC(lluint, unsigned long long int); +#undef _PRINT_FUNC + #endif /* _JSON_PRINT_H_ */ diff --git a/lib/json_print.c b/lib/json_print.c index bda7293350c3..696d8c01d3e6 100644 --- a/lib/json_print.c +++ b/lib/json_print.c @@ -116,12 +116,39 @@ void close_json_array(enum output_type type, const char *str) } \ } _PRINT_FUNC(int, int); -_PRINT_FUNC(hu, unsigned short); -_PRINT_FUNC(uint, uint64_t); -_PRINT_FUNC(lluint, unsigned long long int); _PRINT_FUNC(float, double); #undef _PRINT_FUNC +static void json_print_uint64(const char *key, uint64_t val) +{ + if (key) + jsonw_uint_field(_jw, key, val); + else + jsonw_uint(_jw, val); +} + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +#define PRINT_FUNC(type_name, type) \ + void print_##type_name(enum output_type t, \ + const char *key, \ + const char *fmt, \ + type value) \ + { \ + if (_IS_JSON_CONTEXT(t)) \ + json_print_uint64(key, value); \ + else if (_IS_FP_CONTEXT(t)) \ + printf(fmt, value); \ + } + +PRINT_FUNC(hu, unsigned short); +PRINT_FUNC(uint, unsigned int); +PRINT_FUNC(lluint, unsigned long long int); +PRINT_FUNC(luint, unsigned long int); +PRINT_FUNC(uint64, uint64_t); +#undef PRINT_FUNC +#pragma GCC diagnostic pop + void print_color_string(enum output_type type, enum color_attr color, const char *key, -- 2.17.0