]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/json.h
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / lib / json.h
index fe208f4fa9c2856200e34c63826cf8a2e32e75d3..4763803acd2461f6d3d0640eb3b290b9f86cb73d 100644 (file)
@@ -1,21 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /* json-c wrapper
  * Copyright (C) 2015 Cumulus Networks, Inc.
- *
- * This file is part of GNU Zebra.
- *
- * GNU Zebra is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2, or (at your option) any
- * later version.
- *
- * GNU Zebra is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; see the file COPYING; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #ifndef _QUAGGA_JSON_H
@@ -26,6 +11,7 @@ extern "C" {
 #endif
 
 #include "command.h"
+#include "printfrr.h"
 #include <json-c/json.h>
 
 /*
@@ -41,6 +27,15 @@ extern "C" {
             json_object_iter_equal(&(joi), &(join)) == 0;                     \
             json_object_iter_next(&(joi)))
 
+#define JSON_OBJECT_NEW_ARRAY(json_func, fields, n)                            \
+       ({                                                                     \
+               struct json_object *_json_array = json_object_new_array();     \
+               for (int _i = 0; _i < (n); _i++)                               \
+                       json_object_array_add(_json_array,                     \
+                                             (json_func)((fields)[_i]));      \
+               (_json_array);                                                 \
+       })
+
 extern bool use_json(const int argc, struct cmd_token *argv[]);
 extern void json_object_string_add(struct json_object *obj, const char *key,
                                   const char *s);
@@ -59,6 +54,75 @@ extern struct json_object *json_object_lock(struct json_object *obj);
 extern void json_object_free(struct json_object *obj);
 extern void json_array_string_add(json_object *json, const char *str);
 
+/* printfrr => json helpers */
+
+PRINTFRR(3, 0)
+extern void json_object_string_addv(struct json_object *obj, const char *key,
+                                   const char *fmt, va_list args);
+PRINTFRR(3, 4)
+static inline void json_object_string_addf(struct json_object *obj,
+                                          const char *key, const char *fmt,
+                                          ...)
+{
+       va_list args;
+
+       va_start(args, fmt);
+       json_object_string_addv(obj, key, fmt, args);
+       va_end(args);
+}
+
+PRINTFRR(2, 0)
+extern void json_array_string_addv(json_object *json, const char *fmt,
+                                  va_list args);
+PRINTFRR(2, 3)
+static inline void json_array_string_addf(struct json_object *obj,
+                                         const char *fmt, ...)
+{
+       va_list args;
+
+       va_start(args, fmt);
+       json_array_string_addv(obj, fmt, args);
+       va_end(args);
+}
+
+PRINTFRR(1, 0)
+extern struct json_object *json_object_new_stringv(const char *fmt,
+                                                  va_list args);
+PRINTFRR(1, 2)
+static inline struct json_object *json_object_new_stringf(const char *fmt, ...)
+{
+       struct json_object *ret;
+       va_list args;
+
+       va_start(args, fmt);
+       ret = json_object_new_stringv(fmt, args);
+       va_end(args);
+
+       return ret;
+}
+
+/* NOTE: argument order differs! (due to varargs)
+ *   json_object_object_add(parent, key, child)
+ *   json_object_object_addv(parent, child, key, va)
+ *   json_object_object_addf(parent, child, key, ...)
+ * (would be weird to have the child inbetween the format string and args)
+ */
+PRINTFRR(3, 0)
+extern void json_object_object_addv(struct json_object *parent,
+                                   struct json_object *child,
+                                   const char *keyfmt, va_list args);
+PRINTFRR(3, 4)
+static inline void json_object_object_addf(struct json_object *parent,
+                                          struct json_object *child,
+                                          const char *keyfmt, ...)
+{
+       va_list args;
+
+       va_start(args, keyfmt);
+       json_object_object_addv(parent, child, keyfmt, args);
+       va_end(args);
+}
+
 #define JSON_STR "JavaScript Object Notation\n"
 
 /* NOTE: json-c lib has following commit 316da85 which