back to topotato report
topotato coverage report
Current view: top level - lib - json.h (source / functions) Hit Total Coverage
Test: test_pim_crp.py::PIMCandidateBSRTest Lines: 6 19 31.6 %
Date: 2023-02-16 02:09:37 Functions: 1 3 33.3 %

          Line data    Source code
       1             : /* json-c wrapper
       2             :  * Copyright (C) 2015 Cumulus Networks, Inc.
       3             :  *
       4             :  * This file is part of GNU Zebra.
       5             :  *
       6             :  * GNU Zebra is free software; you can redistribute it and/or modify it
       7             :  * under the terms of the GNU General Public License as published by the
       8             :  * Free Software Foundation; either version 2, or (at your option) any
       9             :  * later version.
      10             :  *
      11             :  * GNU Zebra is distributed in the hope that it will be useful, but
      12             :  * WITHOUT ANY WARRANTY; without even the implied warranty of
      13             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14             :  * General Public License for more details.
      15             :  *
      16             :  * You should have received a copy of the GNU General Public License along
      17             :  * with this program; see the file COPYING; if not, write to the Free Software
      18             :  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
      19             :  */
      20             : 
      21             : #ifndef _QUAGGA_JSON_H
      22             : #define _QUAGGA_JSON_H
      23             : 
      24             : #ifdef __cplusplus
      25             : extern "C" {
      26             : #endif
      27             : 
      28             : #include "command.h"
      29             : #include "printfrr.h"
      30             : #include <json-c/json.h>
      31             : 
      32             : /*
      33             :  * FRR style JSON iteration.
      34             :  * Usage: JSON_FOREACH(...) { ... }
      35             :  */
      36             : #define JSON_FOREACH(jo, joi, join)                                            \
      37             :         /* struct json_object *jo; */                                          \
      38             :         /* struct json_object_iterator joi; */                                 \
      39             :         /* struct json_object_iterator join; */                                \
      40             :         for ((joi) = json_object_iter_begin((jo)),                             \
      41             :             (join) = json_object_iter_end((jo));                               \
      42             :              json_object_iter_equal(&(joi), &(join)) == 0;                     \
      43             :              json_object_iter_next(&(joi)))
      44             : 
      45             : #define JSON_OBJECT_NEW_ARRAY(json_func, fields, n)                            \
      46             :         ({                                                                     \
      47             :                 struct json_object *_json_array = json_object_new_array();     \
      48             :                 for (int _i = 0; _i < (n); _i++)                               \
      49             :                         json_object_array_add(_json_array,                     \
      50             :                                               (json_func)((fields)[_i]));      \
      51             :                 (_json_array);                                                 \
      52             :         })
      53             : 
      54             : extern bool use_json(const int argc, struct cmd_token *argv[]);
      55             : extern void json_object_string_add(struct json_object *obj, const char *key,
      56             :                                    const char *s);
      57             : extern void json_object_int_add(struct json_object *obj, const char *key,
      58             :                                 int64_t i);
      59             : void json_object_boolean_add(struct json_object *obj, const char *key,
      60             :                              bool val);
      61             : 
      62             : extern void json_object_double_add(struct json_object *obj, const char *key,
      63             :                                    double i);
      64             : extern void json_object_boolean_false_add(struct json_object *obj,
      65             :                                           const char *key);
      66             : extern void json_object_boolean_true_add(struct json_object *obj,
      67             :                                          const char *key);
      68             : extern struct json_object *json_object_lock(struct json_object *obj);
      69             : extern void json_object_free(struct json_object *obj);
      70             : extern void json_array_string_add(json_object *json, const char *str);
      71             : 
      72             : /* printfrr => json helpers */
      73             : 
      74             : PRINTFRR(3, 0)
      75             : extern void json_object_string_addv(struct json_object *obj, const char *key,
      76             :                                     const char *fmt, va_list args);
      77             : PRINTFRR(3, 4)
      78           5 : static inline void json_object_string_addf(struct json_object *obj,
      79             :                                            const char *key, const char *fmt,
      80             :                                            ...)
      81             : {
      82           5 :         va_list args;
      83             : 
      84           5 :         va_start(args, fmt);
      85           5 :         json_object_string_addv(obj, key, fmt, args);
      86           5 :         va_end(args);
      87           5 : }
      88             : 
      89             : PRINTFRR(2, 0)
      90             : extern void json_array_string_addv(json_object *json, const char *fmt,
      91             :                                    va_list args);
      92             : PRINTFRR(2, 3)
      93             : static inline void json_array_string_addf(struct json_object *obj,
      94             :                                           const char *fmt, ...)
      95             : {
      96             :         va_list args;
      97             : 
      98             :         va_start(args, fmt);
      99             :         json_array_string_addv(obj, fmt, args);
     100             :         va_end(args);
     101             : }
     102             : 
     103             : PRINTFRR(1, 0)
     104             : extern struct json_object *json_object_new_stringv(const char *fmt,
     105             :                                                    va_list args);
     106             : PRINTFRR(1, 2)
     107           0 : static inline struct json_object *json_object_new_stringf(const char *fmt, ...)
     108             : {
     109           0 :         struct json_object *ret;
     110           0 :         va_list args;
     111             : 
     112           0 :         va_start(args, fmt);
     113           0 :         ret = json_object_new_stringv(fmt, args);
     114           0 :         va_end(args);
     115             : 
     116           0 :         return ret;
     117             : }
     118             : 
     119             : /* NOTE: argument order differs! (due to varargs)
     120             :  *   json_object_object_add(parent, key, child)
     121             :  *   json_object_object_addv(parent, child, key, va)
     122             :  *   json_object_object_addf(parent, child, key, ...)
     123             :  * (would be weird to have the child inbetween the format string and args)
     124             :  */
     125             : PRINTFRR(3, 0)
     126             : extern void json_object_object_addv(struct json_object *parent,
     127             :                                     struct json_object *child,
     128             :                                     const char *keyfmt, va_list args);
     129             : PRINTFRR(3, 4)
     130           0 : static inline void json_object_object_addf(struct json_object *parent,
     131             :                                            struct json_object *child,
     132             :                                            const char *keyfmt, ...)
     133             : {
     134           0 :         va_list args;
     135             : 
     136           0 :         va_start(args, keyfmt);
     137           0 :         json_object_object_addv(parent, child, keyfmt, args);
     138           0 :         va_end(args);
     139           0 : }
     140             : 
     141             : #define JSON_STR "JavaScript Object Notation\n"
     142             : 
     143             : /* NOTE: json-c lib has following commit 316da85 which
     144             :  * handles escape of forward slash.
     145             :  * This allows prefix  "20.0.14.0\/24":{
     146             :  * to  "20.0.14.0/24":{ some platforms do not have
     147             :  * latest copy of json-c where defining below macro.
     148             :  */
     149             : 
     150             : #ifndef JSON_C_TO_STRING_NOSLASHESCAPE
     151             : 
     152             : /**
     153             :   * Don't escape forward slashes.
     154             :   */
     155             : #define JSON_C_TO_STRING_NOSLASHESCAPE (1<<4)
     156             : #endif
     157             : 
     158             : #ifdef __cplusplus
     159             : }
     160             : #endif
     161             : 
     162             : #endif /* _QUAGGA_JSON_H */

Generated by: LCOV version v1.16-topotato