1*de1e4e89SAndroid Build Coastguard Worker /* 2*de1e4e89SAndroid Build Coastguard Worker * json_print.h "print regular or json output, based on json_writer". 3*de1e4e89SAndroid Build Coastguard Worker * 4*de1e4e89SAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or 5*de1e4e89SAndroid Build Coastguard Worker * modify it under the terms of the GNU General Public License 6*de1e4e89SAndroid Build Coastguard Worker * as published by the Free Software Foundation; either version 7*de1e4e89SAndroid Build Coastguard Worker * 2 of the License, or (at your option) any later version. 8*de1e4e89SAndroid Build Coastguard Worker * 9*de1e4e89SAndroid Build Coastguard Worker * Authors: Julien Fortin, <[email protected]> 10*de1e4e89SAndroid Build Coastguard Worker */ 11*de1e4e89SAndroid Build Coastguard Worker 12*de1e4e89SAndroid Build Coastguard Worker #ifndef _JSON_PRINT_H_ 13*de1e4e89SAndroid Build Coastguard Worker #define _JSON_PRINT_H_ 14*de1e4e89SAndroid Build Coastguard Worker 15*de1e4e89SAndroid Build Coastguard Worker #include "json_writer.h" 16*de1e4e89SAndroid Build Coastguard Worker #include "color.h" 17*de1e4e89SAndroid Build Coastguard Worker 18*de1e4e89SAndroid Build Coastguard Worker json_writer_t *get_json_writer(void); 19*de1e4e89SAndroid Build Coastguard Worker 20*de1e4e89SAndroid Build Coastguard Worker /* 21*de1e4e89SAndroid Build Coastguard Worker * use: 22*de1e4e89SAndroid Build Coastguard Worker * - PRINT_ANY for context based output 23*de1e4e89SAndroid Build Coastguard Worker * - PRINT_FP for non json specific output 24*de1e4e89SAndroid Build Coastguard Worker * - PRINT_JSON for json specific output 25*de1e4e89SAndroid Build Coastguard Worker */ 26*de1e4e89SAndroid Build Coastguard Worker enum output_type { 27*de1e4e89SAndroid Build Coastguard Worker PRINT_FP = 1, 28*de1e4e89SAndroid Build Coastguard Worker PRINT_JSON = 2, 29*de1e4e89SAndroid Build Coastguard Worker PRINT_ANY = 4, 30*de1e4e89SAndroid Build Coastguard Worker }; 31*de1e4e89SAndroid Build Coastguard Worker 32*de1e4e89SAndroid Build Coastguard Worker void new_json_obj(int json); 33*de1e4e89SAndroid Build Coastguard Worker void delete_json_obj(void); 34*de1e4e89SAndroid Build Coastguard Worker 35*de1e4e89SAndroid Build Coastguard Worker bool is_json_context(void); 36*de1e4e89SAndroid Build Coastguard Worker 37*de1e4e89SAndroid Build Coastguard Worker void fflush_fp(void); 38*de1e4e89SAndroid Build Coastguard Worker 39*de1e4e89SAndroid Build Coastguard Worker void open_json_object(const char *str); 40*de1e4e89SAndroid Build Coastguard Worker void close_json_object(void); 41*de1e4e89SAndroid Build Coastguard Worker void open_json_array(enum output_type type, const char *delim); 42*de1e4e89SAndroid Build Coastguard Worker void close_json_array(enum output_type type, const char *delim); 43*de1e4e89SAndroid Build Coastguard Worker 44*de1e4e89SAndroid Build Coastguard Worker #define _PRINT_FUNC(type_name, type) \ 45*de1e4e89SAndroid Build Coastguard Worker void print_color_##type_name(enum output_type t, \ 46*de1e4e89SAndroid Build Coastguard Worker enum color_attr color, \ 47*de1e4e89SAndroid Build Coastguard Worker const char *key, \ 48*de1e4e89SAndroid Build Coastguard Worker const char *fmt, \ 49*de1e4e89SAndroid Build Coastguard Worker type value); \ 50*de1e4e89SAndroid Build Coastguard Worker \ 51*de1e4e89SAndroid Build Coastguard Worker static inline void print_##type_name(enum output_type t, \ 52*de1e4e89SAndroid Build Coastguard Worker const char *key, \ 53*de1e4e89SAndroid Build Coastguard Worker const char *fmt, \ 54*de1e4e89SAndroid Build Coastguard Worker type value) \ 55*de1e4e89SAndroid Build Coastguard Worker { \ 56*de1e4e89SAndroid Build Coastguard Worker print_color_##type_name(t, COLOR_NONE, key, fmt, value); \ 57*de1e4e89SAndroid Build Coastguard Worker } 58*de1e4e89SAndroid Build Coastguard Worker _PRINT_FUNC(int, int); 59*de1e4e89SAndroid Build Coastguard Worker _PRINT_FUNC(bool, bool); 60*de1e4e89SAndroid Build Coastguard Worker _PRINT_FUNC(null, const char*); 61*de1e4e89SAndroid Build Coastguard Worker _PRINT_FUNC(string, const char*); 62*de1e4e89SAndroid Build Coastguard Worker // ANDROID: upstream used 'uint' we rename the true function to 'uint32', see below 63*de1e4e89SAndroid Build Coastguard Worker #define print_color_uint32 print_color_uint 64*de1e4e89SAndroid Build Coastguard Worker _PRINT_FUNC(uint32, unsigned int); 65*de1e4e89SAndroid Build Coastguard Worker _PRINT_FUNC(hu, unsigned short); 66*de1e4e89SAndroid Build Coastguard Worker _PRINT_FUNC(hex, unsigned int); 67*de1e4e89SAndroid Build Coastguard Worker _PRINT_FUNC(0xhex, unsigned int); 68*de1e4e89SAndroid Build Coastguard Worker _PRINT_FUNC(lluint, unsigned long long int); 69*de1e4e89SAndroid Build Coastguard Worker #undef _PRINT_FUNC 70*de1e4e89SAndroid Build Coastguard Worker 71*de1e4e89SAndroid Build Coastguard Worker // ANDROID: The upstream version of iproute2 has a bug where print_uint() gets 72*de1e4e89SAndroid Build Coastguard Worker // called with "%u" fmt string and u64 value, which fails to generate the 73*de1e4e89SAndroid Build Coastguard Worker // correct behaviour on 32-bit userspace. Detect this and autocorrect. 74*de1e4e89SAndroid Build Coastguard Worker #define print_uint(t,key,fmt,val) do { \ 75*de1e4e89SAndroid Build Coastguard Worker if (sizeof(val) <= sizeof(unsigned int)) { \ 76*de1e4e89SAndroid Build Coastguard Worker print_uint32((t),(key),(fmt),(val)); \ 77*de1e4e89SAndroid Build Coastguard Worker } else { \ 78*de1e4e89SAndroid Build Coastguard Worker print_lluint((t),(key),(fmt),(val)); \ 79*de1e4e89SAndroid Build Coastguard Worker }; \ 80*de1e4e89SAndroid Build Coastguard Worker } while (0) 81*de1e4e89SAndroid Build Coastguard Worker 82*de1e4e89SAndroid Build Coastguard Worker #endif /* _JSON_PRINT_H_ */ 83