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