1*1b481fc3SMaciej Żenczykowski /* SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) */ 2*1b481fc3SMaciej Żenczykowski /* 3*1b481fc3SMaciej Żenczykowski * Simple streaming JSON writer 4*1b481fc3SMaciej Żenczykowski * 5*1b481fc3SMaciej Żenczykowski * This takes care of the annoying bits of JSON syntax like the commas 6*1b481fc3SMaciej Żenczykowski * after elements 7*1b481fc3SMaciej Żenczykowski * 8*1b481fc3SMaciej Żenczykowski * Authors: Stephen Hemminger <[email protected]> 9*1b481fc3SMaciej Żenczykowski */ 10*1b481fc3SMaciej Żenczykowski 11*1b481fc3SMaciej Żenczykowski #ifndef _JSON_WRITER_H_ 12*1b481fc3SMaciej Żenczykowski #define _JSON_WRITER_H_ 13*1b481fc3SMaciej Żenczykowski 14*1b481fc3SMaciej Żenczykowski #include <stdbool.h> 15*1b481fc3SMaciej Żenczykowski #include <stdint.h> 16*1b481fc3SMaciej Żenczykowski 17*1b481fc3SMaciej Żenczykowski /* Opaque class structure */ 18*1b481fc3SMaciej Żenczykowski typedef struct json_writer json_writer_t; 19*1b481fc3SMaciej Żenczykowski 20*1b481fc3SMaciej Żenczykowski /* Create a new JSON stream */ 21*1b481fc3SMaciej Żenczykowski json_writer_t *jsonw_new(FILE *f); 22*1b481fc3SMaciej Żenczykowski /* End output to JSON stream */ 23*1b481fc3SMaciej Żenczykowski void jsonw_destroy(json_writer_t **self_p); 24*1b481fc3SMaciej Żenczykowski 25*1b481fc3SMaciej Żenczykowski /* Cause output to have pretty whitespace */ 26*1b481fc3SMaciej Żenczykowski void jsonw_pretty(json_writer_t *self, bool on); 27*1b481fc3SMaciej Żenczykowski 28*1b481fc3SMaciej Żenczykowski /* Add property name */ 29*1b481fc3SMaciej Żenczykowski void jsonw_name(json_writer_t *self, const char *name); 30*1b481fc3SMaciej Żenczykowski 31*1b481fc3SMaciej Żenczykowski /* Add value */ 32*1b481fc3SMaciej Żenczykowski __attribute__((format(printf, 2, 3))) 33*1b481fc3SMaciej Żenczykowski void jsonw_printf(json_writer_t *self, const char *fmt, ...); 34*1b481fc3SMaciej Żenczykowski void jsonw_string(json_writer_t *self, const char *value); 35*1b481fc3SMaciej Żenczykowski void jsonw_bool(json_writer_t *self, bool value); 36*1b481fc3SMaciej Żenczykowski void jsonw_float(json_writer_t *self, double number); 37*1b481fc3SMaciej Żenczykowski void jsonw_float_fmt(json_writer_t *self, const char *fmt, double num); 38*1b481fc3SMaciej Żenczykowski void jsonw_uint(json_writer_t *self, unsigned int number); 39*1b481fc3SMaciej Żenczykowski void jsonw_u64(json_writer_t *self, uint64_t number); 40*1b481fc3SMaciej Żenczykowski void jsonw_xint(json_writer_t *self, uint64_t number); 41*1b481fc3SMaciej Żenczykowski void jsonw_hhu(json_writer_t *self, unsigned char num); 42*1b481fc3SMaciej Żenczykowski void jsonw_hu(json_writer_t *self, unsigned short number); 43*1b481fc3SMaciej Żenczykowski void jsonw_int(json_writer_t *self, int number); 44*1b481fc3SMaciej Żenczykowski void jsonw_s64(json_writer_t *self, int64_t number); 45*1b481fc3SMaciej Żenczykowski void jsonw_null(json_writer_t *self); 46*1b481fc3SMaciej Żenczykowski void jsonw_luint(json_writer_t *self, unsigned long num); 47*1b481fc3SMaciej Żenczykowski void jsonw_lluint(json_writer_t *self, unsigned long long num); 48*1b481fc3SMaciej Żenczykowski 49*1b481fc3SMaciej Żenczykowski /* Useful Combinations of name and value */ 50*1b481fc3SMaciej Żenczykowski void jsonw_string_field(json_writer_t *self, const char *prop, const char *val); 51*1b481fc3SMaciej Żenczykowski void jsonw_bool_field(json_writer_t *self, const char *prop, bool value); 52*1b481fc3SMaciej Żenczykowski void jsonw_float_field(json_writer_t *self, const char *prop, double num); 53*1b481fc3SMaciej Żenczykowski void jsonw_uint_field(json_writer_t *self, const char *prop, unsigned int num); 54*1b481fc3SMaciej Żenczykowski void jsonw_u64_field(json_writer_t *self, const char *prop, uint64_t num); 55*1b481fc3SMaciej Żenczykowski void jsonw_xint_field(json_writer_t *self, const char *prop, uint64_t num); 56*1b481fc3SMaciej Żenczykowski void jsonw_hhu_field(json_writer_t *self, const char *prop, unsigned char num); 57*1b481fc3SMaciej Żenczykowski void jsonw_hu_field(json_writer_t *self, const char *prop, unsigned short num); 58*1b481fc3SMaciej Żenczykowski void jsonw_int_field(json_writer_t *self, const char *prop, int num); 59*1b481fc3SMaciej Żenczykowski void jsonw_s64_field(json_writer_t *self, const char *prop, int64_t num); 60*1b481fc3SMaciej Żenczykowski void jsonw_null_field(json_writer_t *self, const char *prop); 61*1b481fc3SMaciej Żenczykowski void jsonw_luint_field(json_writer_t *self, const char *prop, 62*1b481fc3SMaciej Żenczykowski unsigned long num); 63*1b481fc3SMaciej Żenczykowski void jsonw_lluint_field(json_writer_t *self, const char *prop, 64*1b481fc3SMaciej Żenczykowski unsigned long long num); 65*1b481fc3SMaciej Żenczykowski 66*1b481fc3SMaciej Żenczykowski /* Collections */ 67*1b481fc3SMaciej Żenczykowski void jsonw_start_object(json_writer_t *self); 68*1b481fc3SMaciej Żenczykowski void jsonw_end_object(json_writer_t *self); 69*1b481fc3SMaciej Żenczykowski 70*1b481fc3SMaciej Żenczykowski void jsonw_start_array(json_writer_t *self); 71*1b481fc3SMaciej Żenczykowski void jsonw_end_array(json_writer_t *self); 72*1b481fc3SMaciej Żenczykowski 73*1b481fc3SMaciej Żenczykowski /* Override default exception handling */ 74*1b481fc3SMaciej Żenczykowski typedef void (jsonw_err_handler_fn)(const char *); 75*1b481fc3SMaciej Żenczykowski 76*1b481fc3SMaciej Żenczykowski #endif /* _JSON_WRITER_H_ */ 77