back to topotato report
topotato coverage report
Current view: top level - lib - json.h (source / functions) Hit Total Coverage
Test: test_bgp_ecmp_enhe.py::BGP_Unnumbered_ECMP Lines: 6 19 31.6 %
Date: 2023-11-16 17:19:14 Functions: 1 6 16.7 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-or-later
       2             : /* json-c wrapper
       3             :  * Copyright (C) 2015 Cumulus Networks, Inc.
       4             :  */
       5             : 
       6             : #ifndef _QUAGGA_JSON_H
       7             : #define _QUAGGA_JSON_H
       8             : 
       9             : #ifdef __cplusplus
      10             : extern "C" {
      11             : #endif
      12             : 
      13             : #include "command.h"
      14             : #include "printfrr.h"
      15             : #include <json-c/json.h>
      16             : 
      17             : /*
      18             :  * FRR style JSON iteration.
      19             :  * Usage: JSON_FOREACH(...) { ... }
      20             :  */
      21             : #define JSON_FOREACH(jo, joi, join)                                            \
      22             :         /* struct json_object *jo; */                                          \
      23             :         /* struct json_object_iterator joi; */                                 \
      24             :         /* struct json_object_iterator join; */                                \
      25             :         for ((joi) = json_object_iter_begin((jo)),                             \
      26             :             (join) = json_object_iter_end((jo));                               \
      27             :              json_object_iter_equal(&(joi), &(join)) == 0;                     \
      28             :              json_object_iter_next(&(joi)))
      29             : 
      30             : #define JSON_OBJECT_NEW_ARRAY(json_func, fields, n)                            \
      31             :         ({                                                                     \
      32             :                 struct json_object *_json_array = json_object_new_array();     \
      33             :                 for (int _i = 0; _i < (n); _i++)                               \
      34             :                         json_object_array_add(_json_array,                     \
      35             :                                               (json_func)((fields)[_i]));      \
      36             :                 (_json_array);                                                 \
      37             :         })
      38             : 
      39             : extern bool use_json(const int argc, struct cmd_token *argv[]);
      40             : extern void json_object_string_add(struct json_object *obj, const char *key,
      41             :                                    const char *s);
      42             : extern void json_object_int_add(struct json_object *obj, const char *key,
      43             :                                 int64_t i);
      44             : void json_object_boolean_add(struct json_object *obj, const char *key,
      45             :                              bool val);
      46             : 
      47             : extern void json_object_double_add(struct json_object *obj, const char *key,
      48             :                                    double i);
      49             : extern void json_object_boolean_false_add(struct json_object *obj,
      50             :                                           const char *key);
      51             : extern void json_object_boolean_true_add(struct json_object *obj,
      52             :                                          const char *key);
      53             : extern struct json_object *json_object_lock(struct json_object *obj);
      54             : extern void json_object_free(struct json_object *obj);
      55             : extern void json_array_string_add(json_object *json, const char *str);
      56             : 
      57             : /* printfrr => json helpers */
      58             : 
      59             : PRINTFRR(3, 0)
      60             : extern void json_object_string_addv(struct json_object *obj, const char *key,
      61             :                                     const char *fmt, va_list args);
      62             : PRINTFRR(3, 4)
      63          40 : static inline void json_object_string_addf(struct json_object *obj,
      64             :                                            const char *key, const char *fmt,
      65             :                                            ...)
      66             : {
      67          40 :         va_list args;
      68             : 
      69          40 :         va_start(args, fmt);
      70          40 :         json_object_string_addv(obj, key, fmt, args);
      71          40 :         va_end(args);
      72          40 : }
      73             : 
      74             : PRINTFRR(2, 0)
      75             : extern void json_array_string_addv(json_object *json, const char *fmt,
      76             :                                    va_list args);
      77             : PRINTFRR(2, 3)
      78             : static inline void json_array_string_addf(struct json_object *obj,
      79             :                                           const char *fmt, ...)
      80             : {
      81             :         va_list args;
      82             : 
      83             :         va_start(args, fmt);
      84             :         json_array_string_addv(obj, fmt, args);
      85             :         va_end(args);
      86             : }
      87             : 
      88             : PRINTFRR(1, 0)
      89             : extern struct json_object *json_object_new_stringv(const char *fmt,
      90             :                                                    va_list args);
      91             : PRINTFRR(1, 2)
      92           0 : static inline struct json_object *json_object_new_stringf(const char *fmt, ...)
      93             : {
      94           0 :         struct json_object *ret;
      95           0 :         va_list args;
      96             : 
      97           0 :         va_start(args, fmt);
      98           0 :         ret = json_object_new_stringv(fmt, args);
      99           0 :         va_end(args);
     100             : 
     101           0 :         return ret;
     102             : }
     103             : 
     104             : /* NOTE: argument order differs! (due to varargs)
     105             :  *   json_object_object_add(parent, key, child)
     106             :  *   json_object_object_addv(parent, child, key, va)
     107             :  *   json_object_object_addf(parent, child, key, ...)
     108             :  * (would be weird to have the child inbetween the format string and args)
     109             :  */
     110             : PRINTFRR(3, 0)
     111             : extern void json_object_object_addv(struct json_object *parent,
     112             :                                     struct json_object *child,
     113             :                                     const char *keyfmt, va_list args);
     114             : PRINTFRR(3, 4)
     115           0 : static inline void json_object_object_addf(struct json_object *parent,
     116             :                                            struct json_object *child,
     117             :                                            const char *keyfmt, ...)
     118             : {
     119           0 :         va_list args;
     120             : 
     121           0 :         va_start(args, keyfmt);
     122           0 :         json_object_object_addv(parent, child, keyfmt, args);
     123           0 :         va_end(args);
     124           0 : }
     125             : 
     126             : #define JSON_STR "JavaScript Object Notation\n"
     127             : 
     128             : /* NOTE: json-c lib has following commit 316da85 which
     129             :  * handles escape of forward slash.
     130             :  * This allows prefix  "20.0.14.0\/24":{
     131             :  * to  "20.0.14.0/24":{ some platforms do not have
     132             :  * latest copy of json-c where defining below macro.
     133             :  */
     134             : 
     135             : #ifndef JSON_C_TO_STRING_NOSLASHESCAPE
     136             : 
     137             : /**
     138             :   * Don't escape forward slashes.
     139             :   */
     140             : #define JSON_C_TO_STRING_NOSLASHESCAPE (1<<4)
     141             : #endif
     142             : 
     143             : #ifdef __cplusplus
     144             : }
     145             : #endif
     146             : 
     147             : #endif /* _QUAGGA_JSON_H */

Generated by: LCOV version v1.16-topotato