From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stephen Hemminger Subject: [RFC iproute 2/5] json: make json print_uint take unsigned int Date: Fri, 20 Apr 2018 10:15:16 -0700 Message-ID: <20180420171519.8028-3-stephen@networkplumber.org> References: <20180420171519.8028-1-stephen@networkplumber.org> Cc: netdev@vger.kernel.org, Stephen Hemminger To: alin.nastac@gmail.com Return-path: Received: from mail-pl0-f65.google.com ([209.85.160.65]:37218 "EHLO mail-pl0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752618AbeDTRPZ (ORCPT ); Fri, 20 Apr 2018 13:15:25 -0400 Received: by mail-pl0-f65.google.com with SMTP id f7-v6so5613916plr.4 for ; Fri, 20 Apr 2018 10:15:25 -0700 (PDT) In-Reply-To: <20180420171519.8028-1-stephen@networkplumber.org> Sender: netdev-owner@vger.kernel.org List-ID: 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 --- 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