]> 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 9d33ac7ae326a1e7286dedd64019f275a229fc86..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
@@ -42,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);
@@ -107,6 +101,28 @@ static inline struct json_object *json_object_new_stringf(const char *fmt, ...)
        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