xref: /aosp_15_r20/external/iproute2/include/json_print.h (revision de1e4e894b0c224df933550f0afdecc354b238c4)
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