#include "zbxmockassert.h"
#define _FAIL(file, line, prefix, message, ...) \
cm_print_error("%s%s" message "\n", (NULL != prefix_msg ? prefix_msg : ""), \
(NULL != prefix_msg && '\0' != *prefix_msg ? ": " : ""), \
void cm_print_error(const char * const format, ...);
static void json_flatten_contents(struct zbx_json_parse *jp, const char *prefix, zbx_vector_ptr_pair_t *props);
static void json_append_prop(zbx_vector_ptr_pair_t *props, const char *key, const char *value)
pair.first = zbx_strdup(NULL, key);
pair.second = zbx_strdup(NULL, value);
zbx_vector_ptr_pair_append_ptr(props, &pair);
static int json_compare_props(const void *d1, const void *d2)
const zbx_ptr_pair_t *p1 = (const zbx_ptr_pair_t *)d1;
const zbx_ptr_pair_t *p2 = (const zbx_ptr_pair_t *)d2;
return strcmp((const char *)p1->first, (const char *)p2->first);
static void json_flatten_value(const char *ptr, const char *path, zbx_vector_ptr_pair_t *props)
struct zbx_json_parse jp_value;
if (FAIL == zbx_json_brackets_open(ptr, &jp_value))
if (NULL == zbx_json_decodevalue_dyn(ptr, &value, &value_alloc, &type))
type = ZBX_JSON_TYPE_NULL;
json_append_prop(props, path, (ZBX_JSON_TYPE_NULL != type ? value : "null"));
json_flatten_contents(&jp_value, path, props);
static int json_quote_key(char *key, size_t size)
for (ptr = key; '\0' != *ptr; ptr++)
if ('\'' == *ptr || '\\' == *ptr)
if (0 == isalnum((unsigned char)*ptr) && '_' != *ptr && '-' != *ptr)