summaryrefslogtreecommitdiffstats
path: root/libnetdata/json
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--libnetdata/json/Makefile.am8
-rw-r--r--libnetdata/json/README.md14
-rw-r--r--libnetdata/json/json.c557
-rw-r--r--libnetdata/json/json.h77
-rw-r--r--src/libnetdata/json/jsmn.c (renamed from libnetdata/json/jsmn.c)0
-rw-r--r--src/libnetdata/json/jsmn.h (renamed from libnetdata/json/jsmn.h)0
6 files changed, 0 insertions, 656 deletions
diff --git a/libnetdata/json/Makefile.am b/libnetdata/json/Makefile.am
deleted file mode 100644
index 161784b8..00000000
--- a/libnetdata/json/Makefile.am
+++ /dev/null
@@ -1,8 +0,0 @@
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-AUTOMAKE_OPTIONS = subdir-objects
-MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
-
-dist_noinst_DATA = \
- README.md \
- $(NULL)
diff --git a/libnetdata/json/README.md b/libnetdata/json/README.md
deleted file mode 100644
index 1c49739b..00000000
--- a/libnetdata/json/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-<!--
-title: "json"
-custom_edit_url: https://github.com/netdata/netdata/edit/master/libnetdata/json/README.md
-sidebar_label: "json"
-learn_status: "Published"
-learn_topic_type: "Tasks"
-learn_rel_path: "Developers/libnetdata"
--->
-
-# json
-
-`json` contains a parser for json strings, based on `jsmn` (<https://github.com/zserge/jsmn>), but case you have installed the JSON-C library, the installation script will prefer it, you can also force its use with `--enable-jsonc` in the compilation time.
-
-
diff --git a/libnetdata/json/json.c b/libnetdata/json/json.c
deleted file mode 100644
index ec145291..00000000
--- a/libnetdata/json/json.c
+++ /dev/null
@@ -1,557 +0,0 @@
-#include "jsmn.h"
-#include "../libnetdata.h"
-#include "json.h"
-#include "libnetdata/libnetdata.h"
-#include "../../health/health.h"
-
-#define JSON_TOKENS 1024
-
-int json_tokens = JSON_TOKENS;
-
-/**
- * Json Tokenise
- *
- * Map the string given inside tokens.
- *
- * @param js is the string used to create the tokens
- * @param len is the string length
- * @param count the number of tokens present in the string
- *
- * @return it returns the json parsed in tokens
- */
-#ifdef ENABLE_JSONC
-json_object *json_tokenise(char *js) {
- if(!js) {
- netdata_log_error("JSON: json string is empty.");
- return NULL;
- }
-
- json_object *token = json_tokener_parse(js);
- if(!token) {
- netdata_log_error("JSON: Invalid json string.");
- return NULL;
- }
-
- return token;
-}
-#else
-jsmntok_t *json_tokenise(char *js, size_t len, size_t *count)
-{
- int n = json_tokens;
- if(!js || !len) {
- netdata_log_error("JSON: json string is empty.");
- return NULL;
- }
-
- jsmn_parser parser;
- jsmn_init(&parser);
-
- jsmntok_t *tokens = mallocz(sizeof(jsmntok_t) * n);
- if(!tokens) return NULL;
-
- int ret = jsmn_parse(&parser, js, len, tokens, n);
- while (ret == JSMN_ERROR_NOMEM) {
- n *= 2;
- jsmntok_t *new = reallocz(tokens, sizeof(jsmntok_t) * n);
- if(!new) {
- freez(tokens);
- return NULL;
- }
- tokens = new;
- ret = jsmn_parse(&parser, js, len, tokens, n);
- }
-
- if (ret == JSMN_ERROR_INVAL) {
- netdata_log_error("JSON: Invalid json string.");
- freez(tokens);
- return NULL;
- }
- else if (ret == JSMN_ERROR_PART) {
- netdata_log_error("JSON: Truncated JSON string.");
- freez(tokens);
- return NULL;
- }
-
- if(count) *count = (size_t)ret;
-
- if(json_tokens < n) json_tokens = n;
- return tokens;
-}
-#endif
-
-/**
- * Callback Print
- *
- * Set callback print case necessary and wrinte an information inside a buffer to write in the log.
- *
- * @param e a pointer for a structure that has the complete information about json structure.
- *
- * @return It always return 0
- */
-int json_callback_print(JSON_ENTRY *e)
-{
- BUFFER *wb=buffer_create(300, NULL);
-
- buffer_sprintf(wb,"%s = ", e->name);
- char txt[50];
- switch(e->type) {
- case JSON_OBJECT:
- e->callback_function = json_callback_print;
- buffer_strcat(wb,"OBJECT");
- break;
-
- case JSON_ARRAY:
- e->callback_function = json_callback_print;
- sprintf(txt,"ARRAY[%lu]", (long unsigned int) e->data.items);
- buffer_strcat(wb, txt);
- break;
-
- case JSON_STRING:
- buffer_strcat(wb, e->data.string);
- break;
-
- case JSON_NUMBER:
- sprintf(txt, NETDATA_DOUBLE_FORMAT_AUTO, e->data.number);
- buffer_strcat(wb,txt);
-
- break;
-
- case JSON_BOOLEAN:
- buffer_strcat(wb, e->data.boolean?"TRUE":"FALSE");
- break;
-
- case JSON_NULL:
- buffer_strcat(wb,"NULL");
- break;
- }
- netdata_log_info("JSON: %s", buffer_tostring(wb));
- buffer_free(wb);
- return 0;
-}
-
-/**
- * JSONC Set String
- *
- * Set the string value of the structure JSON_ENTRY.
- *
- * @param e the output structure
- */
-static inline void json_jsonc_set_string(JSON_ENTRY *e,char *key,const char *value) {
- size_t len = strlen(key);
- if(len > JSON_NAME_LEN)
- len = JSON_NAME_LEN;
- e->type = JSON_STRING;
- memcpy(e->name,key,len);
- e->name[len] = 0x00;
- e->data.string = (char *) value;
-}
-
-
-#ifdef ENABLE_JSONC
-/**
- * JSONC set Boolean
- *
- * Set the boolean value of the structure JSON_ENTRY
- *
- * @param e the output structure
- * @param value the input value
- */
-static inline void json_jsonc_set_boolean(JSON_ENTRY *e,int value) {
- e->type = JSON_BOOLEAN;
- e->data.boolean = value;
-}
-
-static inline void json_jsonc_set_integer(JSON_ENTRY *e, char *key, int64_t value) {
- size_t len = strlen(key);
- if(len > JSON_NAME_LEN)
- len = JSON_NAME_LEN;
- e->type = JSON_NUMBER;
- memcpy(e->name, key, len);
- e->name[len] = 0;
- e->data.number = (NETDATA_DOUBLE)value;
-}
-
-/**
- * Parse Array
- *
- * Parse the array object.
- *
- * @param ptr the pointer for the object that we will parse.
- * @param callback_data additional data to be used together the callback function
- * @param callback_function function used to create a silencer.
- */
-static inline void json_jsonc_parse_array(json_object *ptr, void *callback_data,int (*callback_function)(struct json_entry *)) {
- int end = json_object_array_length(ptr);
- JSON_ENTRY e;
-
- if(end) {
- int i;
- i = 0;
-
- enum json_type type;
- do {
- json_object *jvalue = json_object_array_get_idx(ptr, i);
- if(jvalue) {
- e.callback_data = callback_data;
- e.type = JSON_OBJECT;
- callback_function(&e);
- json_object_object_foreach(jvalue, key, val) {
- type = json_object_get_type(val);
- if (type == json_type_array) {
- e.type = JSON_ARRAY;
- json_jsonc_parse_array(val, callback_data, callback_function);
- } else if (type == json_type_object) {
- json_walk(val,callback_data,callback_function);
- } else if (type == json_type_string) {
- json_jsonc_set_string(&e,key,json_object_get_string(val));
- callback_function(&e);
- } else if (type == json_type_boolean) {
- json_jsonc_set_boolean(&e,json_object_get_boolean(val));
- callback_function(&e);
- }
- }
- }
-
- } while (++i < end);
- }
-}
-#else
-
-/**
- * Walk string
- *
- * Set JSON_ENTRY to string and map the values from jsmntok_t.
- *
- * @param js the original string
- * @param t the tokens
- * @param start the first position
- * @param e the output structure.
- *
- * @return It always return 1
- */
-size_t json_walk_string(char *js, jsmntok_t *t, size_t start, JSON_ENTRY *e)
-{
- char old = js[t[start].end];
- js[t[start].end] = '\0';
- e->original_string = &js[t[start].start];
-
- e->type = JSON_STRING;
- e->data.string = e->original_string;
- if(e->callback_function) e->callback_function(e);
- js[t[start].end] = old;
- return 1;
-}
-
-/**
- * Walk Primitive
- *
- * Define the data type of the string
- *
- * @param js the original string
- * @param t the tokens
- * @param start the first position
- * @param e the output structure.
- *
- * @return It always return 1
- */
-size_t json_walk_primitive(char *js, jsmntok_t *t, size_t start, JSON_ENTRY *e)
-{
- char old = js[t[start].end];
- js[t[start].end] = '\0';
- e->original_string = &js[t[start].start];
-
- switch(e->original_string[0]) {
- case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7':
- case '8': case '9': case '-': case '.':
- e->type = JSON_NUMBER;
- e->data.number = strtold(e->original_string, NULL);
- break;
-
- case 't': case 'T':
- e->type = JSON_BOOLEAN;
- e->data.boolean = 1;
- break;
-
- case 'f': case 'F':
- e->type = JSON_BOOLEAN;
- e->data.boolean = 0;
- break;
-
- case 'n': case 'N':
- default:
- e->type = JSON_NULL;
- break;
- }
- if(e->callback_function) e->callback_function(e);
- js[t[start].end] = old;
- return 1;
-}
-
-/**
- * Array
- *
- * Measure the array length
- *
- * @param js the original string
- * @param t the tokens
- * @param nest the length of structure t
- * @param start the first position
- * @param e the structure with values and callback to be used inside the function.
- *
- * @return It returns the array length
- */
-size_t json_walk_array(char *js, jsmntok_t *t, size_t nest, size_t start, JSON_ENTRY *e)
-{
- JSON_ENTRY ne;
-
- char old = js[t[start].end];
- js[t[start].end] = '\0';
- ne.original_string = &js[t[start].start];
-
- memcpy(&ne, e, sizeof(JSON_ENTRY));
- ne.type = JSON_ARRAY;
- ne.data.items = t[start].size;
- ne.callback_function = e->callback_function;
- ne.name[0]='\0';
- ne.fullname[0]='\0';
- if(e->callback_function) e->callback_function(&ne);
- js[t[start].end] = old;
-
- size_t i, init = start, size = t[start].size;
-
- start++;
- for(i = 0; i < size ; i++) {
- ne.pos = i;
- if (strlen(e->name) > JSON_NAME_LEN - 24 || strlen(e->fullname) > JSON_FULLNAME_LEN -24) {
- netdata_log_info("JSON: JSON walk_array ignoring element with name:%s fullname:%s",e->name, e->fullname);
- continue;
- }
- snprintfz(ne.name, JSON_NAME_LEN, "%s[%lu]", e->name, i);
- snprintfz(ne.fullname, JSON_FULLNAME_LEN, "%s[%lu]", e->fullname, i);
-
- switch(t[start].type) {
- case JSMN_PRIMITIVE:
- start += json_walk_primitive(js, t, start, &ne);
- break;
-
- case JSMN_OBJECT:
- start += json_walk_object(js, t, nest + 1, start, &ne);
- break;
-
- case JSMN_ARRAY:
- start += json_walk_array(js, t, nest + 1, start, &ne);
- break;
-
- case JSMN_STRING:
- start += json_walk_string(js, t, start, &ne);
- break;
- }
- }
- return start - init;
-}
-
-/**
- * Object
- *
- * Measure the Object length
- *
- * @param js the original string
- * @param t the tokens
- * @param nest the length of structure t
- * @param start the first position
- * @param e the output structure.
- *
- * @return It returns the Object length
- */
-size_t json_walk_object(char *js, jsmntok_t *t, size_t nest, size_t start, JSON_ENTRY *e)
-{
- JSON_ENTRY ne = {
- .name = "",
- .fullname = "",
- .callback_data = NULL,
- .callback_function = NULL
- };
-
- char old = js[t[start].end];
- js[t[start].end] = '\0';
- ne.original_string = &js[t[start].start];
- memcpy(&ne, e, sizeof(JSON_ENTRY));
- ne.type = JSON_OBJECT;
- ne.callback_function = e->callback_function;
- if(e->callback_function) e->callback_function(&ne);
- js[t[start].end] = old;
-
- int key = 1;
- size_t i, init = start, size = t[start].size;
-
- start++;
- for(i = 0; i < size ; i++) {
- switch(t[start].type) {
- case JSMN_PRIMITIVE:
- start += json_walk_primitive(js, t, start, &ne);
- key = 1;
- break;
-
- case JSMN_OBJECT:
- start += json_walk_object(js, t, nest + 1, start, &ne);
- key = 1;
- break;
-
- case JSMN_ARRAY:
- start += json_walk_array(js, t, nest + 1, start, &ne);
- key = 1;
- break;
-
- case JSMN_STRING:
- default:
- if(key) {
- int len = t[start].end - t[start].start;
- if (unlikely(len>JSON_NAME_LEN)) len=JSON_NAME_LEN;
- strncpy(ne.name, &js[t[start].start], len);
- ne.name[len] = '\0';
- len=strlen(e->fullname) + strlen(e->fullname[0]?".":"") + strlen(ne.name);
- char *c = mallocz((len+1)*sizeof(char));
- sprintf(c,"%s%s%s", e->fullname, e->fullname[0]?".":"", ne.name);
- if (unlikely(len>JSON_FULLNAME_LEN)) len=JSON_FULLNAME_LEN;
- strncpy(ne.fullname, c, len);
- freez(c);
- start++;
- key = 0;
- }
- else {
- start += json_walk_string(js, t, start, &ne);
- key = 1;
- }
- break;
- }
- }
- return start - init;
-}
-#endif
-
-/**
- * Tree
- *
- * Call the correct walk function according its type.
- *
- * @param t the json object to work
- * @param callback_data additional data to be used together the callback function
- * @param callback_function function used to create a silencer.
- *
- * @return It always return 1
- */
-#ifdef ENABLE_JSONC
-size_t json_walk(json_object *t, void *callback_data, int (*callback_function)(struct json_entry *)) {
- JSON_ENTRY e;
-
- e.callback_data = callback_data;
- enum json_type type;
- json_object_object_foreach(t, key, val) {
- type = json_object_get_type(val);
- if (type == json_type_array) {
- e.type = JSON_ARRAY;
- json_jsonc_parse_array(val,NULL,health_silencers_json_read_callback);
- } else if (type == json_type_object) {
- e.type = JSON_OBJECT;
- } else if (type == json_type_string) {
- json_jsonc_set_string(&e,key,json_object_get_string(val));
- callback_function(&e);
- } else if (type == json_type_boolean) {
- json_jsonc_set_boolean(&e,json_object_get_boolean(val));
- callback_function(&e);
- } else if (type == json_type_int) {
- json_jsonc_set_integer(&e,key,json_object_get_int64(val));
- callback_function(&e);
- }
- }
-
- return 1;
-}
-#else
-/**
- * Tree
- *
- * Call the correct walk function according its type.
- *
- * @param js the original string
- * @param t the tokens
- * @param callback_data additional data to be used together the callback function
- * @param callback_function function used to create a silencer.
- *
- * @return It always return 1
- */
-size_t json_walk_tree(char *js, jsmntok_t *t, void *callback_data, int (*callback_function)(struct json_entry *))
-{
- JSON_ENTRY e = {
- .name = "",
- .fullname = "",
- .callback_data = callback_data,
- .callback_function = callback_function
- };
-
- switch (t[0].type) {
- case JSMN_OBJECT:
- e.type = JSON_OBJECT;
- json_walk_object(js, t, 0, 0, &e);
- break;
-
- case JSMN_ARRAY:
- e.type = JSON_ARRAY;
- json_walk_array(js, t, 0, 0, &e);
- break;
-
- case JSMN_PRIMITIVE:
- case JSMN_STRING:
- break;
- }
-
- return 1;
-}
-#endif
-
-/**
- * JSON Parse
- *
- * Parse the json message with the callback function
- *
- * @param js the string that the callback function will parse
- * @param callback_data additional data to be used together the callback function
- * @param callback_function function used to create a silencer.
- *
- * @return JSON_OK case everything happened as expected, JSON_CANNOT_PARSE case there were errors in the
- * parsing process and JSON_CANNOT_DOWNLOAD case the string given(js) is NULL.
- */
-int json_parse(char *js, void *callback_data, int (*callback_function)(JSON_ENTRY *))
-{
- if(js) {
-#ifdef ENABLE_JSONC
- json_object *tokens = json_tokenise(js);
-#else
- size_t count;
- jsmntok_t *tokens = json_tokenise(js, strlen(js), &count);
-#endif
-
- if(tokens) {
-#ifdef ENABLE_JSONC
- json_walk(tokens, callback_data, callback_function);
- json_object_put(tokens);
-#else
- json_walk_tree(js, tokens, callback_data, callback_function);
- freez(tokens);
-#endif
- return JSON_OK;
- }
-
- return JSON_CANNOT_PARSE;
- }
-
- return JSON_CANNOT_DOWNLOAD;
-}
-
-/*
-int json_test(char *str)
-{
- return json_parse(str, NULL, json_callback_print);
-}
- */
-
diff --git a/libnetdata/json/json.h b/libnetdata/json/json.h
deleted file mode 100644
index b43f06b5..00000000
--- a/libnetdata/json/json.h
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef CHECKIN_JSON_H
-#define CHECKIN_JSON_H 1
-
-
-#if ENABLE_JSONC
-#include <json-c/json.h>
-// fix an older json-c bug
-// https://github.com/json-c/json-c/issues/135
-#ifdef error_description
-#undef error_description
-#endif // error_description
-#endif // ENABLE_JSONC
-
-#include "jsmn.h"
-
-//https://www.ibm.com/support/knowledgecenter/en/SS9H2Y_7.6.0/com.ibm.dp.doc/json_parserlimits.html
-#define JSON_NAME_LEN 256
-#define JSON_FULLNAME_LEN 1024
-
-typedef enum {
- JSON_OBJECT = 0,
- JSON_ARRAY = 1,
- JSON_STRING = 2,
- JSON_NUMBER = 3,
- JSON_BOOLEAN = 4,
- JSON_NULL = 5,
-} JSON_ENTRY_TYPE;
-
-typedef struct json_entry {
- JSON_ENTRY_TYPE type;
- char name[JSON_NAME_LEN + 1];
- char fullname[JSON_FULLNAME_LEN + 1];
- union {
- char *string; // type == JSON_STRING
- NETDATA_DOUBLE number; // type == JSON_NUMBER
- int boolean; // type == JSON_BOOLEAN
- size_t items; // type == JSON_ARRAY
- } data;
- size_t pos; // the position of this item in its parent
-
- char *original_string;
-
- void *callback_data;
- int (*callback_function)(struct json_entry *);
-} JSON_ENTRY;
-
-// ----------------------------------------------------------------------------
-// public functions
-
-#define JSON_OK 0
-#define JSON_CANNOT_DOWNLOAD 1
-#define JSON_CANNOT_PARSE 2
-
-int json_parse(char *js, void *callback_data, int (*callback_function)(JSON_ENTRY *));
-
-
-// ----------------------------------------------------------------------------
-// private functions
-
-#ifdef ENABLE_JSONC
-json_object *json_tokenise(char *js);
-size_t json_walk(json_object *t, void *callback_data, int (*callback_function)(struct json_entry *));
-#else
-jsmntok_t *json_tokenise(char *js, size_t len, size_t *count);
-size_t json_walk_tree(char *js, jsmntok_t *t, void *callback_data, int (*callback_function)(struct json_entry *));
-#endif
-
-size_t json_walk_object(char *js, jsmntok_t *t, size_t nest, size_t start, JSON_ENTRY *e);
-size_t json_walk_array(char *js, jsmntok_t *t, size_t nest, size_t start, JSON_ENTRY *e);
-size_t json_walk_string(char *js, jsmntok_t *t, size_t start, JSON_ENTRY *e);
-size_t json_walk_primitive(char *js, jsmntok_t *t, size_t start, JSON_ENTRY *e);
-
-int json_callback_print(JSON_ENTRY *e);
-
-
-
-#endif \ No newline at end of file
diff --git a/libnetdata/json/jsmn.c b/src/libnetdata/json/jsmn.c
index 2f48bd65..2f48bd65 100644
--- a/libnetdata/json/jsmn.c
+++ b/src/libnetdata/json/jsmn.c
diff --git a/libnetdata/json/jsmn.h b/src/libnetdata/json/jsmn.h
index beff586c..beff586c 100644
--- a/libnetdata/json/jsmn.h
+++ b/src/libnetdata/json/jsmn.h