* 修改编译方式为CMake
* 删除C++适配代码 * 修改编译告警
This commit is contained in:
56
common/json/include/arraylist.h
Normal file
56
common/json/include/arraylist.h
Normal file
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* $Id: arraylist.h,v 1.4 2006/01/26 02:16:28 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _arraylist_h_
|
||||
#define _arraylist_h_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define ARRAY_LIST_DEFAULT_SIZE 32
|
||||
|
||||
typedef void (array_list_free_fn) (void *data);
|
||||
|
||||
struct array_list
|
||||
{
|
||||
void **array;
|
||||
int length;
|
||||
int size;
|
||||
array_list_free_fn *free_fn;
|
||||
};
|
||||
|
||||
extern struct array_list*
|
||||
array_list_new(array_list_free_fn *free_fn);
|
||||
|
||||
extern void
|
||||
array_list_free(struct array_list *al);
|
||||
|
||||
extern void*
|
||||
array_list_get_idx(struct array_list *al, int i);
|
||||
|
||||
extern int
|
||||
array_list_put_idx(struct array_list *al, int i, void *data);
|
||||
|
||||
extern int
|
||||
array_list_add(struct array_list *al, void *data);
|
||||
|
||||
extern int
|
||||
array_list_length(struct array_list *al);
|
||||
|
||||
extern void
|
||||
array_list_sort(struct array_list *arr, int(*compar)(const void *, const void *));
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
28
common/json/include/bits.h
Normal file
28
common/json/include/bits.h
Normal file
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* $Id: bits.h,v 1.10 2006/01/30 23:07:57 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _bits_h_
|
||||
#define _bits_h_
|
||||
|
||||
#ifndef json_min
|
||||
#define json_min(a,b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef json_max
|
||||
#define json_max(a,b) ((a) > (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#define hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x) & 7) + 9)
|
||||
#define error_ptr(error) ((void*)error)
|
||||
#define error_description(error) (json_tokener_errors[error])
|
||||
#define is_error(ptr) (ptr == NULL)
|
||||
|
||||
#endif
|
||||
175
common/json/include/config.h
Normal file
175
common/json/include/config.h
Normal file
@@ -0,0 +1,175 @@
|
||||
/* config.h. Generated from config.h.in by configure. */
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Enable RDRANR Hardware RNG Hash Seed */
|
||||
/* #undef ENABLE_RDRAND */
|
||||
|
||||
/* Define if .gnu.warning accepts long strings. */
|
||||
/* #undef HAS_GNU_WARNING_LONG */
|
||||
|
||||
/* Define to 1 if you have the declaration of `INFINITY', and to 0 if you
|
||||
don't. */
|
||||
#define HAVE_DECL_INFINITY 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `isinf', and to 0 if you don't.
|
||||
*/
|
||||
#define HAVE_DECL_ISINF 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `isnan', and to 0 if you don't.
|
||||
*/
|
||||
#define HAVE_DECL_ISNAN 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `nan', and to 0 if you don't. */
|
||||
#define HAVE_DECL_NAN 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `_finite', and to 0 if you
|
||||
don't. */
|
||||
#define HAVE_DECL__FINITE 0
|
||||
|
||||
/* Define to 1 if you have the declaration of `_isnan', and to 0 if you don't.
|
||||
*/
|
||||
#define HAVE_DECL__ISNAN 0
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#define HAVE_DLFCN_H 1
|
||||
|
||||
/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
|
||||
/* #undef HAVE_DOPRNT */
|
||||
|
||||
/* Define to 1 if you have the <endian.h> header file. */
|
||||
#define HAVE_ENDIAN_H 1
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#define HAVE_FCNTL_H 1
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <limits.h> header file. */
|
||||
#define HAVE_LIMITS_H 1
|
||||
|
||||
/* Define to 1 if you have the <locale.h> header file. */
|
||||
#define HAVE_LOCALE_H 1
|
||||
|
||||
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
|
||||
to 0 otherwise. */
|
||||
#define HAVE_MALLOC 1
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#define HAVE_MEMORY_H 1
|
||||
|
||||
/* Define to 1 if you have the `open' function. */
|
||||
#define HAVE_OPEN 1
|
||||
|
||||
/* Define to 1 if your system has a GNU libc compatible `realloc' function,
|
||||
and to 0 otherwise. */
|
||||
#define HAVE_REALLOC 1
|
||||
|
||||
/* Define to 1 if you have the `setlocale' function. */
|
||||
#define HAVE_SETLOCALE 1
|
||||
|
||||
/* Define to 1 if you have the `snprintf' function. */
|
||||
#define HAVE_SNPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the <stdarg.h> header file. */
|
||||
#define HAVE_STDARG_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#define HAVE_STDINT_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define to 1 if you have the `strcasecmp' function. */
|
||||
#define HAVE_STRCASECMP 1
|
||||
|
||||
/* Define to 1 if you have the `strdup' function. */
|
||||
#define HAVE_STRDUP 1
|
||||
|
||||
/* Define to 1 if you have the `strerror' function. */
|
||||
#define HAVE_STRERROR 1
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#define HAVE_STRINGS_H 1
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#define HAVE_STRING_H 1
|
||||
|
||||
/* Define to 1 if you have the `strncasecmp' function. */
|
||||
#define HAVE_STRNCASECMP 1
|
||||
|
||||
/* Define to 1 if you have the <syslog.h> header file. */
|
||||
#define HAVE_SYSLOG_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/cdefs.h> header file. */
|
||||
#define HAVE_SYS_CDEFS_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/param.h> header file. */
|
||||
#define HAVE_SYS_PARAM_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* Define to 1 if you have the `vasprintf' function. */
|
||||
#define HAVE_VASPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the `vprintf' function. */
|
||||
#define HAVE_VPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the `vsnprintf' function. */
|
||||
#define HAVE_VSNPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the `vsyslog' function. */
|
||||
#define HAVE_VSYSLOG 1
|
||||
|
||||
/* Public define for json_inttypes.h */
|
||||
#define JSON_C_HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
||||
*/
|
||||
#define LT_OBJDIR ".libs/"
|
||||
|
||||
/* Name of package */
|
||||
#define PACKAGE "json-c"
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT "json-c@googlegroups.com"
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define PACKAGE_NAME "json-c"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "json-c 0.12"
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME "json-c"
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#define PACKAGE_URL ""
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION "0.12"
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "0.12"
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
/* #undef const */
|
||||
|
||||
/* Define to rpl_malloc if the replacement function should be used. */
|
||||
/* #undef malloc */
|
||||
|
||||
/* Define to rpl_realloc if the replacement function should be used. */
|
||||
/* #undef realloc */
|
||||
|
||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||
/* #undef size_t */
|
||||
71
common/json/include/debug.h
Normal file
71
common/json/include/debug.h
Normal file
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* $Id: debug.h,v 1.5 2006/01/30 23:07:57 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
* Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _DEBUG_H_
|
||||
#define _DEBUG_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void mc_set_debug(int debug);
|
||||
extern int mc_get_debug(void);
|
||||
|
||||
extern void mc_set_syslog(int syslog);
|
||||
|
||||
extern void mc_debug(const char *msg, ...);
|
||||
extern void mc_error(const char *msg, ...);
|
||||
extern void mc_info(const char *msg, ...);
|
||||
|
||||
#ifndef __STRING
|
||||
#define __STRING(x) #x
|
||||
#endif
|
||||
|
||||
#ifndef PARSER_BROKEN_FIXED
|
||||
|
||||
#define JASSERT(cond) do {} while(0)
|
||||
|
||||
#else
|
||||
|
||||
#define JASSERT(cond) do { \
|
||||
if (!(cond)) { \
|
||||
mc_error("cjson assert failure %s:%d : cond \"" __STRING(cond) "failed\n", __FILE__, __LINE__); \
|
||||
*(int *)0 = 1;\
|
||||
abort(); \
|
||||
}\
|
||||
} while(0)
|
||||
|
||||
#endif
|
||||
|
||||
#define MC_ERROR(x, ...) mc_error(x, ##__VA_ARGS__)
|
||||
|
||||
#ifdef MC_MAINTAINER_MODE
|
||||
#define MC_SET_DEBUG(x) mc_set_debug(x)
|
||||
#define MC_GET_DEBUG() mc_get_debug()
|
||||
#define MC_SET_SYSLOG(x) mc_set_syslog(x)
|
||||
#define MC_DEBUG(x, ...) mc_debug(x, ##__VA_ARGS__)
|
||||
#define MC_INFO(x, ...) mc_info(x, ##__VA_ARGS__)
|
||||
#else
|
||||
#define MC_SET_DEBUG(x) if (0) mc_set_debug(x)
|
||||
#define MC_GET_DEBUG() (0)
|
||||
#define MC_SET_SYSLOG(x) if (0) mc_set_syslog(x)
|
||||
#define MC_DEBUG(x, ...) if (0) mc_debug(x, ##__VA_ARGS__)
|
||||
#define MC_INFO(x, ...) if (0) mc_info(x, ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
34
common/json/include/json.h
Normal file
34
common/json/include/json.h
Normal file
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* $Id: json.h,v 1.6 2006/01/26 02:16:28 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
* Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _json_h_
|
||||
#define _json_h_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "bits.h"
|
||||
#include "debug.h"
|
||||
#include "linkhash.h"
|
||||
#include "arraylist.h"
|
||||
#include "json_util.h"
|
||||
#include "json_object.h"
|
||||
#include "json_tokener.h"
|
||||
#include "json_object_iterator.h"
|
||||
#include "json_c_version.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
22
common/json/include/json_c_version.h
Normal file
22
common/json/include/json_c_version.h
Normal file
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Eric Haszlakiewicz
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*/
|
||||
|
||||
#ifndef _json_c_version_h_
|
||||
#define _json_c_version_h_
|
||||
|
||||
#define JSON_C_MAJOR_VERSION 0
|
||||
#define JSON_C_MINOR_VERSION 12
|
||||
#define JSON_C_MICRO_VERSION 0
|
||||
#define JSON_C_VERSION_NUM ((JSON_C_MAJOR_VERSION << 16) | \
|
||||
(JSON_C_MINOR_VERSION << 8) | \
|
||||
JSON_C_MICRO_VERSION)
|
||||
#define JSON_C_VERSION "0.12"
|
||||
|
||||
const char *json_c_version(void); /* Returns JSON_C_VERSION */
|
||||
int json_c_version_num(void); /* Returns JSON_C_VERSION_NUM */
|
||||
|
||||
#endif
|
||||
39
common/json/include/json_checker.h
Normal file
39
common/json/include/json_checker.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/* JSON_checker.h */
|
||||
|
||||
/* 2016-11-11 */
|
||||
|
||||
/*
|
||||
The JSON_checker_struct is used to hold the state of the JSON_checker
|
||||
so that the code can be reentrant.
|
||||
*/
|
||||
|
||||
typedef struct JSON_checker_struct {
|
||||
int valid;
|
||||
int state;
|
||||
int depth;
|
||||
int top;
|
||||
int* stack;
|
||||
} * JSON_checker;
|
||||
|
||||
|
||||
extern JSON_checker new_JSON_checker(int depth);
|
||||
|
||||
/*
|
||||
Make a new JSON_checker. You indicate the maximum depth that is allowed.
|
||||
It will return an object that you will pass to the other functions.
|
||||
They will destroy the object for you.
|
||||
*/
|
||||
|
||||
extern int JSON_checker_char(JSON_checker jc, int next_char);
|
||||
|
||||
/*
|
||||
You should call JSON_checker_char for each character of the JSON text.
|
||||
It will return false if the text is not right.
|
||||
*/
|
||||
|
||||
extern int JSON_checker_done(JSON_checker jc);
|
||||
|
||||
/*
|
||||
When there are no more JSON text characters, call JSON_checker_done.
|
||||
It will return false if the text was not right.
|
||||
*/
|
||||
4
common/json/include/json_config.h
Normal file
4
common/json/include/json_config.h
Normal file
@@ -0,0 +1,4 @@
|
||||
/* json_config.h. Generated from json_config.h.in by configure. */
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define JSON_C_HAVE_INTTYPES_H 1
|
||||
28
common/json/include/json_inttypes.h
Normal file
28
common/json/include/json_inttypes.h
Normal file
@@ -0,0 +1,28 @@
|
||||
|
||||
#ifndef _json_inttypes_h_
|
||||
#define _json_inttypes_h_
|
||||
|
||||
#include "json_config.h"
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER <= 1700
|
||||
|
||||
/* Anything less than Visual Studio C++ 10 is missing stdint.h and inttypes.h */
|
||||
typedef __int32 int32_t;
|
||||
#define INT32_MIN ((int32_t)_I32_MIN)
|
||||
#define INT32_MAX ((int32_t)_I32_MAX)
|
||||
typedef __int64 int64_t;
|
||||
#define INT64_MIN ((int64_t)_I64_MIN)
|
||||
#define INT64_MAX ((int64_t)_I64_MAX)
|
||||
#define PRId64 "I64d"
|
||||
#define SCNd64 "I64d"
|
||||
|
||||
#else
|
||||
|
||||
#ifdef JSON_C_HAVE_INTTYPES_H
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
/* inttypes.h includes stdint.h */
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
617
common/json/include/json_object.h
Normal file
617
common/json/include/json_object.h
Normal file
@@ -0,0 +1,617 @@
|
||||
/*
|
||||
* $Id: json_object.h,v 1.12 2006/01/30 23:07:57 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
* Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _json_object_h_
|
||||
#define _json_object_h_
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define THIS_FUNCTION_IS_DEPRECATED(func) func __attribute__ ((deprecated))
|
||||
#elif defined(_MSC_VER)
|
||||
#define THIS_FUNCTION_IS_DEPRECATED(func) __declspec(deprecated) func
|
||||
#else
|
||||
#define THIS_FUNCTION_IS_DEPRECATED(func) func
|
||||
#endif
|
||||
|
||||
#include "json_inttypes.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define JSON_OBJECT_DEF_HASH_ENTRIES 16
|
||||
|
||||
/**
|
||||
* A flag for the json_object_to_json_string_ext() and
|
||||
* json_object_to_file_ext() functions which causes the output
|
||||
* to have no extra whitespace or formatting applied.
|
||||
*/
|
||||
#define JSON_C_TO_STRING_PLAIN 0
|
||||
/**
|
||||
* A flag for the json_object_to_json_string_ext() and
|
||||
* json_object_to_file_ext() functions which causes the output to have
|
||||
* minimal whitespace inserted to make things slightly more readable.
|
||||
*/
|
||||
#define JSON_C_TO_STRING_SPACED (1<<0)
|
||||
/**
|
||||
* A flag for the json_object_to_json_string_ext() and
|
||||
* json_object_to_file_ext() functions which causes
|
||||
* the output to be formatted.
|
||||
*
|
||||
* See the "Two Space Tab" option at http://jsonformatter.curiousconcept.com/
|
||||
* for an example of the format.
|
||||
*/
|
||||
#define JSON_C_TO_STRING_PRETTY (1<<1)
|
||||
/**
|
||||
* A flag to drop trailing zero for float values
|
||||
*/
|
||||
#define JSON_C_TO_STRING_NOZERO (1<<2)
|
||||
|
||||
#undef FALSE
|
||||
#define FALSE ((json_bool)0)
|
||||
|
||||
#undef TRUE
|
||||
#define TRUE ((json_bool)1)
|
||||
|
||||
extern const char *json_number_chars;
|
||||
extern const char *json_hex_chars;
|
||||
|
||||
/* CAW: added for ANSI C iteration correctness */
|
||||
struct json_object_iter
|
||||
{
|
||||
char *key;
|
||||
struct json_object *val;
|
||||
struct lh_entry *entry;
|
||||
};
|
||||
|
||||
/* forward structure definitions */
|
||||
|
||||
typedef int json_bool;
|
||||
typedef struct printbuf printbuf;
|
||||
typedef struct lh_table lh_table;
|
||||
typedef struct array_list array_list;
|
||||
typedef struct json_object json_object;
|
||||
typedef struct json_object_iter json_object_iter;
|
||||
typedef struct json_tokener json_tokener;
|
||||
|
||||
/**
|
||||
* Type of custom user delete functions. See json_object_set_serializer.
|
||||
*/
|
||||
typedef void (json_object_delete_fn)(struct json_object *jso, void *userdata);
|
||||
|
||||
/**
|
||||
* Type of a custom serialization function. See json_object_set_serializer.
|
||||
*/
|
||||
typedef int (json_object_to_json_string_fn)(struct json_object *jso,
|
||||
struct printbuf *pb,
|
||||
int level,
|
||||
int flags);
|
||||
|
||||
/* supported object types */
|
||||
|
||||
typedef enum json_type {
|
||||
/* If you change this, be sure to update json_type_to_name() too */
|
||||
json_type_null,
|
||||
json_type_boolean,
|
||||
json_type_double,
|
||||
json_type_int,
|
||||
json_type_object,
|
||||
json_type_array,
|
||||
json_type_string,
|
||||
} json_type;
|
||||
|
||||
/* reference counting functions */
|
||||
|
||||
/**
|
||||
* Increment the reference count of json_object, thereby grabbing shared
|
||||
* ownership of obj.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
*/
|
||||
extern struct json_object* json_object_get(struct json_object *obj);
|
||||
|
||||
/**
|
||||
* Decrement the reference count of json_object and free if it reaches zero.
|
||||
* You must have ownership of obj prior to doing this or you will cause an
|
||||
* imbalance in the reference count.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns 1 if the object was freed.
|
||||
*/
|
||||
int json_object_put(struct json_object *obj);
|
||||
|
||||
/**
|
||||
* Check if the json_object is of a given type
|
||||
* @param obj the json_object instance
|
||||
* @param type one of:
|
||||
json_type_null (i.e. obj == NULL),
|
||||
json_type_boolean,
|
||||
json_type_double,
|
||||
json_type_int,
|
||||
json_type_object,
|
||||
json_type_array,
|
||||
json_type_string,
|
||||
*/
|
||||
extern int json_object_is_type(struct json_object *obj, enum json_type type);
|
||||
|
||||
/**
|
||||
* Get the type of the json_object. See also json_type_to_name() to turn this
|
||||
* into a string suitable, for instance, for logging.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns type being one of:
|
||||
json_type_null (i.e. obj == NULL),
|
||||
json_type_boolean,
|
||||
json_type_double,
|
||||
json_type_int,
|
||||
json_type_object,
|
||||
json_type_array,
|
||||
json_type_string,
|
||||
*/
|
||||
extern enum json_type json_object_get_type(struct json_object *obj);
|
||||
|
||||
|
||||
/** Stringify object to json format.
|
||||
* Equivalent to json_object_to_json_string_ext(obj, JSON_C_TO_STRING_SPACED)
|
||||
* @param obj the json_object instance
|
||||
* @returns a string in JSON format
|
||||
*/
|
||||
extern const char* json_object_to_json_string(struct json_object *obj);
|
||||
|
||||
/** Stringify object to json format
|
||||
* @param obj the json_object instance
|
||||
* @param flags formatting options, see JSON_C_TO_STRING_PRETTY and other constants
|
||||
* @returns a string in JSON format
|
||||
*/
|
||||
extern const char* json_object_to_json_string_ext(struct json_object *obj, int
|
||||
flags);
|
||||
|
||||
/**
|
||||
* Set a custom serialization function to be used when this particular object
|
||||
* is converted to a string by json_object_to_json_string.
|
||||
*
|
||||
* If a custom serializer is already set on this object, any existing
|
||||
* user_delete function is called before the new one is set.
|
||||
*
|
||||
* If to_string_func is NULL, the other parameters are ignored
|
||||
* and the default behaviour is reset.
|
||||
*
|
||||
* The userdata parameter is optional and may be passed as NULL. If provided,
|
||||
* it is passed to to_string_func as-is. This parameter may be NULL even
|
||||
* if user_delete is non-NULL.
|
||||
*
|
||||
* The user_delete parameter is optional and may be passed as NULL, even if
|
||||
* the userdata parameter is non-NULL. It will be called just before the
|
||||
* json_object is deleted, after it's reference count goes to zero
|
||||
* (see json_object_put()).
|
||||
* If this is not provided, it is up to the caller to free the userdata at
|
||||
* an appropriate time. (i.e. after the json_object is deleted)
|
||||
*
|
||||
* @param jso the object to customize
|
||||
* @param to_string_func the custom serialization function
|
||||
* @param userdata an optional opaque cookie
|
||||
* @param user_delete an optional function from freeing userdata
|
||||
*/
|
||||
extern void json_object_set_serializer(json_object *jso,
|
||||
json_object_to_json_string_fn to_string_func,
|
||||
void *userdata,
|
||||
json_object_delete_fn *user_delete);
|
||||
|
||||
/**
|
||||
* Simply call free on the userdata pointer.
|
||||
* Can be used with json_object_set_serializer().
|
||||
*
|
||||
* @param jso unused
|
||||
* @param userdata the pointer that is passed to free().
|
||||
*/
|
||||
json_object_delete_fn json_object_free_userdata;
|
||||
|
||||
/**
|
||||
* Copy the jso->_userdata string over to pb as-is.
|
||||
* Can be used with json_object_set_serializer().
|
||||
*
|
||||
* @param jso The object whose _userdata is used.
|
||||
* @param pb The destination buffer.
|
||||
* @param level Ignored.
|
||||
* @param flags Ignored.
|
||||
*/
|
||||
json_object_to_json_string_fn json_object_userdata_to_json_string;
|
||||
|
||||
|
||||
/* object type methods */
|
||||
|
||||
/** Create a new empty object with a reference count of 1. The caller of
|
||||
* this object initially has sole ownership. Remember, when using
|
||||
* json_object_object_add or json_object_array_put_idx, ownership will
|
||||
* transfer to the object/array. Call json_object_get if you want to maintain
|
||||
* shared ownership or also add this object as a child of multiple objects or
|
||||
* arrays. Any ownerships you acquired but did not transfer must be released
|
||||
* through json_object_put.
|
||||
*
|
||||
* @returns a json_object of type json_type_object
|
||||
*/
|
||||
extern struct json_object* json_object_new_object(void);
|
||||
|
||||
/** Get the hashtable of a json_object of type json_type_object
|
||||
* @param obj the json_object instance
|
||||
* @returns a linkhash
|
||||
*/
|
||||
extern struct lh_table* json_object_get_object(struct json_object *obj);
|
||||
|
||||
/** Get the size of an object in terms of the number of fields it has.
|
||||
* @param obj the json_object whose length to return
|
||||
*/
|
||||
extern int json_object_object_length(struct json_object* obj);
|
||||
|
||||
/** Add an object field to a json_object of type json_type_object
|
||||
*
|
||||
* The reference count will *not* be incremented. This is to make adding
|
||||
* fields to objects in code more compact. If you want to retain a reference
|
||||
* to an added object, independent of the lifetime of obj, you must wrap the
|
||||
* passed object with json_object_get.
|
||||
*
|
||||
* Upon calling this, the ownership of val transfers to obj. Thus you must
|
||||
* make sure that you do in fact have ownership over this object. For instance,
|
||||
* json_object_new_object will give you ownership until you transfer it,
|
||||
* whereas json_object_object_get does not.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param key the object field name (a private copy will be duplicated)
|
||||
* @param val a json_object or NULL member to associate with the given field
|
||||
*/
|
||||
extern void json_object_object_add(struct json_object* obj, const char *key,
|
||||
struct json_object *val);
|
||||
|
||||
/** Get the json_object associate with a given object field
|
||||
*
|
||||
* *No* reference counts will be changed. There is no need to manually adjust
|
||||
* reference counts through the json_object_put/json_object_get methods unless
|
||||
* you need to have the child (value) reference maintain a different lifetime
|
||||
* than the owning parent (obj). Ownership of the returned value is retained
|
||||
* by obj (do not do json_object_put unless you have done a json_object_get).
|
||||
* If you delete the value from obj (json_object_object_del) and wish to access
|
||||
* the returned reference afterwards, make sure you have first gotten shared
|
||||
* ownership through json_object_get (& don't forget to do a json_object_put
|
||||
* or transfer ownership to prevent a memory leak).
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param key the object field name
|
||||
* @returns the json_object associated with the given field name
|
||||
* @deprecated Please use json_object_object_get_ex
|
||||
*/
|
||||
#if 0
|
||||
/** BY TSIHANG */
|
||||
THIS_FUNCTION_IS_DEPRECATED(extern struct json_object* json_object_object_get(struct json_object* obj,
|
||||
const char *key));
|
||||
#else
|
||||
extern struct json_object* json_object_object_get(struct json_object* obj,
|
||||
const char *key);
|
||||
#endif
|
||||
/** Get the json_object associated with a given object field.
|
||||
*
|
||||
* This returns true if the key is found, false in all other cases (including
|
||||
* if obj isn't a json_type_object).
|
||||
*
|
||||
* *No* reference counts will be changed. There is no need to manually adjust
|
||||
* reference counts through the json_object_put/json_object_get methods unless
|
||||
* you need to have the child (value) reference maintain a different lifetime
|
||||
* than the owning parent (obj). Ownership of value is retained by obj.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param key the object field name
|
||||
* @param value a pointer where to store a reference to the json_object
|
||||
* associated with the given field name.
|
||||
*
|
||||
* It is safe to pass a NULL value.
|
||||
* @returns whether or not the key exists
|
||||
*/
|
||||
extern json_bool json_object_object_get_ex(struct json_object* obj,
|
||||
const char *key,
|
||||
struct json_object **value);
|
||||
|
||||
/** Delete the given json_object field
|
||||
*
|
||||
* The reference count will be decremented for the deleted object. If there
|
||||
* are no more owners of the value represented by this key, then the value is
|
||||
* freed. Otherwise, the reference to the value will remain in memory.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param key the object field name
|
||||
*/
|
||||
extern void json_object_object_del(struct json_object* obj, const char *key);
|
||||
|
||||
/**
|
||||
* Iterate through all keys and values of an object.
|
||||
*
|
||||
* Adding keys to the object while iterating is NOT allowed.
|
||||
*
|
||||
* Deleting an existing key, or replacing an existing key with a
|
||||
* new value IS allowed.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param key the local name for the char* key variable defined in the body
|
||||
* @param val the local name for the json_object* object variable defined in
|
||||
* the body
|
||||
*/
|
||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && __STDC_VERSION__ >= 199901L
|
||||
|
||||
# define json_object_object_foreach(obj,key,val) \
|
||||
char *key; \
|
||||
struct json_object *val __attribute__((__unused__)); \
|
||||
for(struct lh_entry *entry ## key = json_object_get_object(obj)->head, *entry_next ## key = NULL; \
|
||||
({ if(entry ## key) { \
|
||||
key = (char*)entry ## key->k; \
|
||||
val = (struct json_object*)entry ## key->v; \
|
||||
entry_next ## key = entry ## key->next; \
|
||||
} ; entry ## key; }); \
|
||||
entry ## key = entry_next ## key )
|
||||
|
||||
#else /* ANSI C or MSC */
|
||||
|
||||
# define json_object_object_foreach(obj,key,val) \
|
||||
char *key;\
|
||||
struct json_object *val; \
|
||||
struct lh_entry *entry ## key; \
|
||||
struct lh_entry *entry_next ## key = NULL; \
|
||||
for(entry ## key = json_object_get_object(obj)->head; \
|
||||
(entry ## key ? ( \
|
||||
key = (char*)entry ## key->k, \
|
||||
val = (struct json_object*)entry ## key->v, \
|
||||
entry_next ## key = entry ## key->next, \
|
||||
entry ## key) : 0); \
|
||||
entry ## key = entry_next ## key)
|
||||
|
||||
#endif /* defined(__GNUC__) && !defined(__STRICT_ANSI__) && __STDC_VERSION__ >= 199901L */
|
||||
|
||||
/** Iterate through all keys and values of an object (ANSI C Safe)
|
||||
* @param obj the json_object instance
|
||||
* @param iter the object iterator
|
||||
*/
|
||||
#define json_object_object_foreachC(obj,iter) \
|
||||
for(iter.entry = json_object_get_object(obj)->head; (iter.entry ? (iter.key = (char*)iter.entry->k, iter.val = (struct json_object*)iter.entry->v, iter.entry) : 0); iter.entry = iter.entry->next)
|
||||
|
||||
/* Array type methods */
|
||||
|
||||
/** Create a new empty json_object of type json_type_array
|
||||
* @returns a json_object of type json_type_array
|
||||
*/
|
||||
extern struct json_object* json_object_new_array(void);
|
||||
|
||||
/** Get the arraylist of a json_object of type json_type_array
|
||||
* @param obj the json_object instance
|
||||
* @returns an arraylist
|
||||
*/
|
||||
extern struct array_list* json_object_get_array(struct json_object *obj);
|
||||
|
||||
/** Get the length of a json_object of type json_type_array
|
||||
* @param obj the json_object instance
|
||||
* @returns an int
|
||||
*/
|
||||
extern int json_object_array_length(struct json_object *obj);
|
||||
|
||||
/** Sorts the elements of jso of type json_type_array
|
||||
*
|
||||
* Pointers to the json_object pointers will be passed as the two arguments
|
||||
* to @sort_fn
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param sort_fn a sorting function
|
||||
*/
|
||||
extern void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *));
|
||||
|
||||
/** Add an element to the end of a json_object of type json_type_array
|
||||
*
|
||||
* The reference count will *not* be incremented. This is to make adding
|
||||
* fields to objects in code more compact. If you want to retain a reference
|
||||
* to an added object you must wrap the passed object with json_object_get
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param val the json_object to be added
|
||||
*/
|
||||
extern int json_object_array_add(struct json_object *obj,
|
||||
struct json_object *val);
|
||||
|
||||
/** Insert or replace an element at a specified index in an array (a json_object of type json_type_array)
|
||||
*
|
||||
* The reference count will *not* be incremented. This is to make adding
|
||||
* fields to objects in code more compact. If you want to retain a reference
|
||||
* to an added object you must wrap the passed object with json_object_get
|
||||
*
|
||||
* The reference count of a replaced object will be decremented.
|
||||
*
|
||||
* The array size will be automatically be expanded to the size of the
|
||||
* index if the index is larger than the current size.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param idx the index to insert the element at
|
||||
* @param val the json_object to be added
|
||||
*/
|
||||
extern int json_object_array_put_idx(struct json_object *obj, int idx,
|
||||
struct json_object *val);
|
||||
|
||||
/** Get the element at specificed index of the array (a json_object of type json_type_array)
|
||||
* @param obj the json_object instance
|
||||
* @param idx the index to get the element at
|
||||
* @returns the json_object at the specified index (or NULL)
|
||||
*/
|
||||
extern struct json_object* json_object_array_get_idx(struct json_object *obj,
|
||||
int idx);
|
||||
|
||||
/* json_bool type methods */
|
||||
|
||||
/** Create a new empty json_object of type json_type_boolean
|
||||
* @param b a json_bool TRUE or FALSE (0 or 1)
|
||||
* @returns a json_object of type json_type_boolean
|
||||
*/
|
||||
extern struct json_object* json_object_new_boolean(json_bool b);
|
||||
|
||||
/** Get the json_bool value of a json_object
|
||||
*
|
||||
* The type is coerced to a json_bool if the passed object is not a json_bool.
|
||||
* integer and double objects will return FALSE if there value is zero
|
||||
* or TRUE otherwise. If the passed object is a string it will return
|
||||
* TRUE if it has a non zero length. If any other object type is passed
|
||||
* TRUE will be returned if the object is not NULL.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns a json_bool
|
||||
*/
|
||||
extern json_bool json_object_get_boolean(struct json_object *obj);
|
||||
|
||||
|
||||
/* int type methods */
|
||||
|
||||
/** Create a new empty json_object of type json_type_int
|
||||
* Note that values are stored as 64-bit values internally.
|
||||
* To ensure the full range is maintained, use json_object_new_int64 instead.
|
||||
* @param i the integer
|
||||
* @returns a json_object of type json_type_int
|
||||
*/
|
||||
extern struct json_object* json_object_new_int(int32_t i);
|
||||
|
||||
|
||||
/** Create a new empty json_object of type json_type_int
|
||||
* @param i the integer
|
||||
* @returns a json_object of type json_type_int
|
||||
*/
|
||||
extern struct json_object* json_object_new_int64(int64_t i);
|
||||
|
||||
|
||||
/** Get the int value of a json_object
|
||||
*
|
||||
* The type is coerced to a int if the passed object is not a int.
|
||||
* double objects will return their integer conversion. Strings will be
|
||||
* parsed as an integer. If no conversion exists then 0 is returned
|
||||
* and errno is set to EINVAL. null is equivalent to 0 (no error values set)
|
||||
*
|
||||
* Note that integers are stored internally as 64-bit values.
|
||||
* If the value of too big or too small to fit into 32-bit, INT32_MAX or
|
||||
* INT32_MIN are returned, respectively.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns an int
|
||||
*/
|
||||
extern int32_t json_object_get_int(struct json_object *obj);
|
||||
|
||||
/** Get the int value of a json_object
|
||||
*
|
||||
* The type is coerced to a int64 if the passed object is not a int64.
|
||||
* double objects will return their int64 conversion. Strings will be
|
||||
* parsed as an int64. If no conversion exists then 0 is returned.
|
||||
*
|
||||
* NOTE: Set errno to 0 directly before a call to this function to determine
|
||||
* whether or not conversion was successful (it does not clear the value for
|
||||
* you).
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns an int64
|
||||
*/
|
||||
extern int64_t json_object_get_int64(struct json_object *obj);
|
||||
|
||||
|
||||
/* double type methods */
|
||||
|
||||
/** Create a new empty json_object of type json_type_double
|
||||
* @param d the double
|
||||
* @returns a json_object of type json_type_double
|
||||
*/
|
||||
extern struct json_object* json_object_new_double(double d);
|
||||
|
||||
/**
|
||||
* Create a new json_object of type json_type_double, using
|
||||
* the exact serialized representation of the value.
|
||||
*
|
||||
* This allows for numbers that would otherwise get displayed
|
||||
* inefficiently (e.g. 12.3 => "12.300000000000001") to be
|
||||
* serialized with the more convenient form.
|
||||
*
|
||||
* Note: this is used by json_tokener_parse_ex() to allow for
|
||||
* an exact re-serialization of a parsed object.
|
||||
*
|
||||
* An equivalent sequence of calls is:
|
||||
* @code
|
||||
* jso = json_object_new_double(d);
|
||||
* json_object_set_serializer(d, json_object_userdata_to_json_string,
|
||||
* strdup(ds), json_object_free_userdata)
|
||||
* @endcode
|
||||
*
|
||||
* @param d the numeric value of the double.
|
||||
* @param ds the string representation of the double. This will be copied.
|
||||
*/
|
||||
extern struct json_object* json_object_new_double_s(double d, const char *ds);
|
||||
|
||||
/** Get the double floating point value of a json_object
|
||||
*
|
||||
* The type is coerced to a double if the passed object is not a double.
|
||||
* integer objects will return their double conversion. Strings will be
|
||||
* parsed as a double. If no conversion exists then 0.0 is returned and
|
||||
* errno is set to EINVAL. null is equivalent to 0 (no error values set)
|
||||
*
|
||||
* If the value is too big to fit in a double, then the value is set to
|
||||
* the closest infinity with errno set to ERANGE. If strings cannot be
|
||||
* converted to their double value, then EINVAL is set & NaN is returned.
|
||||
*
|
||||
* Arrays of length 0 are interpreted as 0 (with no error flags set).
|
||||
* Arrays of length 1 are effectively cast to the equivalent object and
|
||||
* converted using the above rules. All other arrays set the error to
|
||||
* EINVAL & return NaN.
|
||||
*
|
||||
* NOTE: Set errno to 0 directly before a call to this function to
|
||||
* determine whether or not conversion was successful (it does not clear
|
||||
* the value for you).
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns a double floating point number
|
||||
*/
|
||||
extern double json_object_get_double(struct json_object *obj);
|
||||
|
||||
|
||||
/* string type methods */
|
||||
|
||||
/** Create a new empty json_object of type json_type_string
|
||||
*
|
||||
* A copy of the string is made and the memory is managed by the json_object
|
||||
*
|
||||
* @param s the string
|
||||
* @returns a json_object of type json_type_string
|
||||
*/
|
||||
extern struct json_object* json_object_new_string(const char *s);
|
||||
|
||||
extern struct json_object* json_object_new_string_len(const char *s, int len);
|
||||
|
||||
/** Get the string value of a json_object
|
||||
*
|
||||
* If the passed object is not of type json_type_string then the JSON
|
||||
* representation of the object is returned.
|
||||
*
|
||||
* The returned string memory is managed by the json_object and will
|
||||
* be freed when the reference count of the json_object drops to zero.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns a string
|
||||
*/
|
||||
extern const char* json_object_get_string(struct json_object *obj);
|
||||
|
||||
/** Get the string length of a json_object
|
||||
*
|
||||
* If the passed object is not of type json_type_string then zero
|
||||
* will be returned.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns int
|
||||
*/
|
||||
extern int json_object_get_string_len(struct json_object *obj);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
239
common/json/include/json_object_iterator.h
Normal file
239
common/json/include/json_object_iterator.h
Normal file
@@ -0,0 +1,239 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file json_object_iterator.h
|
||||
*
|
||||
* Copyright (c) 2009-2012 Hewlett-Packard Development Company, L.P.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
* @brief json-c forces clients to use its private data
|
||||
* structures for JSON Object iteration. This API
|
||||
* corrects that by abstracting the private json-c
|
||||
* details.
|
||||
*
|
||||
* API attributes: <br>
|
||||
* * Thread-safe: NO<br>
|
||||
* * Reentrant: NO
|
||||
*
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef JSON_OBJECT_ITERATOR_H
|
||||
#define JSON_OBJECT_ITERATOR_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Forward declaration for the opaque iterator information.
|
||||
*/
|
||||
struct json_object_iter_info_;
|
||||
|
||||
/**
|
||||
* The opaque iterator that references a name/value pair within
|
||||
* a JSON Object instance or the "end" iterator value.
|
||||
*/
|
||||
struct json_object_iterator {
|
||||
const void* opaque_;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* forward declaration of json-c's JSON value instance structure
|
||||
*/
|
||||
struct json_object;
|
||||
|
||||
|
||||
/**
|
||||
* Initializes an iterator structure to a "default" value that
|
||||
* is convenient for initializing an iterator variable to a
|
||||
* default state (e.g., initialization list in a class'
|
||||
* constructor).
|
||||
*
|
||||
* @code
|
||||
* struct json_object_iterator iter = json_object_iter_init_default();
|
||||
* MyClass() : iter_(json_object_iter_init_default())
|
||||
* @endcode
|
||||
*
|
||||
* @note The initialized value doesn't reference any specific
|
||||
* pair, is considered an invalid iterator, and MUST NOT
|
||||
* be passed to any json-c API that expects a valid
|
||||
* iterator.
|
||||
*
|
||||
* @note User and internal code MUST NOT make any assumptions
|
||||
* about and dependencies on the value of the "default"
|
||||
* iterator value.
|
||||
*
|
||||
* @return json_object_iterator
|
||||
*/
|
||||
struct json_object_iterator
|
||||
json_object_iter_init_default(void);
|
||||
|
||||
/** Retrieves an iterator to the first pair of the JSON Object.
|
||||
*
|
||||
* @warning Any modification of the underlying pair invalidates all
|
||||
* iterators to that pair.
|
||||
*
|
||||
* @param obj JSON Object instance (MUST be of type json_object)
|
||||
*
|
||||
* @return json_object_iterator If the JSON Object has at
|
||||
* least one pair, on return, the iterator refers
|
||||
* to the first pair. If the JSON Object doesn't
|
||||
* have any pairs, the returned iterator is
|
||||
* equivalent to the "end" iterator for the same
|
||||
* JSON Object instance.
|
||||
*
|
||||
* @code
|
||||
* struct json_object_iterator it;
|
||||
* struct json_object_iterator itEnd;
|
||||
* struct json_object* obj;
|
||||
*
|
||||
* obj = json_tokener_parse("{'first':'george', 'age':100}");
|
||||
* it = json_object_iter_begin(obj);
|
||||
* itEnd = json_object_iter_end(obj);
|
||||
*
|
||||
* while (!json_object_iter_equal(&it, &itEnd)) {
|
||||
* printf("%s\n",
|
||||
* json_object_iter_peek_name(&it));
|
||||
* json_object_iter_next(&it);
|
||||
* }
|
||||
*
|
||||
* @endcode
|
||||
*/
|
||||
struct json_object_iterator
|
||||
json_object_iter_begin(struct json_object* obj);
|
||||
|
||||
/** Retrieves the iterator that represents the position beyond the
|
||||
* last pair of the given JSON Object instance.
|
||||
*
|
||||
* @warning Do NOT write code that assumes that the "end"
|
||||
* iterator value is NULL, even if it is so in a
|
||||
* particular instance of the implementation.
|
||||
*
|
||||
* @note The reason we do not (and MUST NOT) provide
|
||||
* "json_object_iter_is_end(json_object_iterator* iter)"
|
||||
* type of API is because it would limit the underlying
|
||||
* representation of name/value containment (or force us
|
||||
* to add additional, otherwise unnecessary, fields to
|
||||
* the iterator structure). The "end" iterator and the
|
||||
* equality test method, on the other hand, permit us to
|
||||
* cleanly abstract pretty much any reasonable underlying
|
||||
* representation without burdening the iterator
|
||||
* structure with unnecessary data.
|
||||
*
|
||||
* @note For performance reasons, memorize the "end" iterator prior
|
||||
* to any loop.
|
||||
*
|
||||
* @param obj JSON Object instance (MUST be of type json_object)
|
||||
*
|
||||
* @return json_object_iterator On return, the iterator refers
|
||||
* to the "end" of the Object instance's pairs
|
||||
* (i.e., NOT the last pair, but "beyond the last
|
||||
* pair" value)
|
||||
*/
|
||||
struct json_object_iterator
|
||||
json_object_iter_end(const struct json_object* obj);
|
||||
|
||||
/** Returns an iterator to the next pair, if any
|
||||
*
|
||||
* @warning Any modification of the underlying pair
|
||||
* invalidates all iterators to that pair.
|
||||
*
|
||||
* @param iter [IN/OUT] Pointer to iterator that references a
|
||||
* name/value pair; MUST be a valid, non-end iterator.
|
||||
* WARNING: bad things will happen if invalid or "end"
|
||||
* iterator is passed. Upon return will contain the
|
||||
* reference to the next pair if there is one; if there
|
||||
* are no more pairs, will contain the "end" iterator
|
||||
* value, which may be compared against the return value
|
||||
* of json_object_iter_end() for the same JSON Object
|
||||
* instance.
|
||||
*/
|
||||
void
|
||||
json_object_iter_next(struct json_object_iterator* iter);
|
||||
|
||||
|
||||
/** Returns a const pointer to the name of the pair referenced
|
||||
* by the given iterator.
|
||||
*
|
||||
* @param iter pointer to iterator that references a name/value
|
||||
* pair; MUST be a valid, non-end iterator.
|
||||
*
|
||||
* @warning bad things will happen if an invalid or
|
||||
* "end" iterator is passed.
|
||||
*
|
||||
* @return const char* Pointer to the name of the referenced
|
||||
* name/value pair. The name memory belongs to the
|
||||
* name/value pair, will be freed when the pair is
|
||||
* deleted or modified, and MUST NOT be modified or
|
||||
* freed by the user.
|
||||
*/
|
||||
const char*
|
||||
json_object_iter_peek_name(const struct json_object_iterator* iter);
|
||||
|
||||
|
||||
/** Returns a pointer to the json-c instance representing the
|
||||
* value of the referenced name/value pair, without altering
|
||||
* the instance's reference count.
|
||||
*
|
||||
* @param iter pointer to iterator that references a name/value
|
||||
* pair; MUST be a valid, non-end iterator.
|
||||
*
|
||||
* @warning bad things will happen if invalid or
|
||||
* "end" iterator is passed.
|
||||
*
|
||||
* @return struct json_object* Pointer to the json-c value
|
||||
* instance of the referenced name/value pair; the
|
||||
* value's reference count is not changed by this
|
||||
* function: if you plan to hold on to this json-c node,
|
||||
* take a look at json_object_get() and
|
||||
* json_object_put(). IMPORTANT: json-c API represents
|
||||
* the JSON Null value as a NULL json_object instance
|
||||
* pointer.
|
||||
*/
|
||||
struct json_object*
|
||||
json_object_iter_peek_value(const struct json_object_iterator* iter);
|
||||
|
||||
|
||||
/** Tests two iterators for equality. Typically used to test
|
||||
* for end of iteration by comparing an iterator to the
|
||||
* corresponding "end" iterator (that was derived from the same
|
||||
* JSON Object instance).
|
||||
*
|
||||
* @note The reason we do not (and MUST NOT) provide
|
||||
* "json_object_iter_is_end(json_object_iterator* iter)"
|
||||
* type of API is because it would limit the underlying
|
||||
* representation of name/value containment (or force us
|
||||
* to add additional, otherwise unnecessary, fields to
|
||||
* the iterator structure). The equality test method, on
|
||||
* the other hand, permits us to cleanly abstract pretty
|
||||
* much any reasonable underlying representation.
|
||||
*
|
||||
* @param iter1 Pointer to first valid, non-NULL iterator
|
||||
* @param iter2 POinter to second valid, non-NULL iterator
|
||||
*
|
||||
* @warning if a NULL iterator pointer or an uninitialized
|
||||
* or invalid iterator, or iterators derived from
|
||||
* different JSON Object instances are passed, bad things
|
||||
* will happen!
|
||||
*
|
||||
* @return json_bool non-zero if iterators are equal (i.e., both
|
||||
* reference the same name/value pair or are both at
|
||||
* "end"); zero if they are not equal.
|
||||
*/
|
||||
json_bool
|
||||
json_object_iter_equal(const struct json_object_iterator* iter1,
|
||||
const struct json_object_iterator* iter2);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* JSON_OBJECT_ITERATOR_H */
|
||||
47
common/json/include/json_object_private.h
Normal file
47
common/json/include/json_object_private.h
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* $Id: json_object_private.h,v 1.4 2006/01/26 02:16:28 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _json_object_private_h_
|
||||
#define _json_object_private_h_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef void (json_object_private_delete_fn)(struct json_object *o);
|
||||
|
||||
struct json_object
|
||||
{
|
||||
enum json_type o_type;
|
||||
json_object_private_delete_fn *_delete;
|
||||
json_object_to_json_string_fn *_to_json_string;
|
||||
int _ref_count;
|
||||
struct printbuf *_pb;
|
||||
union data {
|
||||
json_bool c_boolean;
|
||||
double c_double;
|
||||
int64_t c_int64;
|
||||
struct lh_table *c_object;
|
||||
struct array_list *c_array;
|
||||
struct {
|
||||
char *str;
|
||||
int len;
|
||||
} c_string;
|
||||
} o;
|
||||
json_object_delete_fn *_user_delete;
|
||||
void *_userdata;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
208
common/json/include/json_tokener.h
Normal file
208
common/json/include/json_tokener.h
Normal file
@@ -0,0 +1,208 @@
|
||||
/*
|
||||
* $Id: json_tokener.h,v 1.10 2006/07/25 03:24:50 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _json_tokener_h_
|
||||
#define _json_tokener_h_
|
||||
|
||||
#include <stddef.h>
|
||||
#include "json_object.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
enum json_tokener_error {
|
||||
json_tokener_success,
|
||||
json_tokener_continue,
|
||||
json_tokener_error_depth,
|
||||
json_tokener_error_parse_eof,
|
||||
json_tokener_error_parse_unexpected,
|
||||
json_tokener_error_parse_null,
|
||||
json_tokener_error_parse_boolean,
|
||||
json_tokener_error_parse_number,
|
||||
json_tokener_error_parse_array,
|
||||
json_tokener_error_parse_object_key_name,
|
||||
json_tokener_error_parse_object_key_sep,
|
||||
json_tokener_error_parse_object_value_sep,
|
||||
json_tokener_error_parse_string,
|
||||
json_tokener_error_parse_comment,
|
||||
json_tokener_error_size
|
||||
};
|
||||
|
||||
enum json_tokener_state {
|
||||
json_tokener_state_eatws,
|
||||
json_tokener_state_start,
|
||||
json_tokener_state_finish,
|
||||
json_tokener_state_null,
|
||||
json_tokener_state_comment_start,
|
||||
json_tokener_state_comment,
|
||||
json_tokener_state_comment_eol,
|
||||
json_tokener_state_comment_end,
|
||||
json_tokener_state_string,
|
||||
json_tokener_state_string_escape,
|
||||
json_tokener_state_escape_unicode,
|
||||
json_tokener_state_boolean,
|
||||
json_tokener_state_number,
|
||||
json_tokener_state_array,
|
||||
json_tokener_state_array_add,
|
||||
json_tokener_state_array_sep,
|
||||
json_tokener_state_object_field_start,
|
||||
json_tokener_state_object_field,
|
||||
json_tokener_state_object_field_end,
|
||||
json_tokener_state_object_value,
|
||||
json_tokener_state_object_value_add,
|
||||
json_tokener_state_object_sep,
|
||||
json_tokener_state_array_after_sep,
|
||||
json_tokener_state_object_field_start_after_sep,
|
||||
json_tokener_state_inf
|
||||
};
|
||||
|
||||
struct json_tokener_srec
|
||||
{
|
||||
enum json_tokener_state state, saved_state;
|
||||
struct json_object *obj;
|
||||
struct json_object *current;
|
||||
char *obj_field_name;
|
||||
};
|
||||
|
||||
#define JSON_TOKENER_DEFAULT_DEPTH 32
|
||||
|
||||
struct json_tokener
|
||||
{
|
||||
char *str;
|
||||
struct printbuf *pb;
|
||||
int max_depth, depth, is_double, st_pos, char_offset;
|
||||
enum json_tokener_error err;
|
||||
unsigned int ucs_char;
|
||||
char quote_char;
|
||||
struct json_tokener_srec *stack;
|
||||
int flags;
|
||||
};
|
||||
|
||||
/**
|
||||
* Be strict when parsing JSON input. Use caution with
|
||||
* this flag as what is considered valid may become more
|
||||
* restrictive from one release to the next, causing your
|
||||
* code to fail on previously working input.
|
||||
*
|
||||
* This flag is not set by default.
|
||||
*
|
||||
* @see json_tokener_set_flags()
|
||||
*/
|
||||
#define JSON_TOKENER_STRICT 0x01
|
||||
|
||||
/**
|
||||
* Given an error previously returned by json_tokener_get_error(),
|
||||
* return a human readable description of the error.
|
||||
*
|
||||
* @return a generic error message is returned if an invalid error value is provided.
|
||||
*/
|
||||
const char *json_tokener_error_desc(enum json_tokener_error jerr);
|
||||
|
||||
/**
|
||||
* Retrieve the error caused by the last call to json_tokener_parse_ex(),
|
||||
* or json_tokener_success if there is no error.
|
||||
*
|
||||
* When parsing a JSON string in pieces, if the tokener is in the middle
|
||||
* of parsing this will return json_tokener_continue.
|
||||
*
|
||||
* See also json_tokener_error_desc().
|
||||
*/
|
||||
enum json_tokener_error json_tokener_get_error(struct json_tokener *tok);
|
||||
|
||||
extern struct json_tokener* json_tokener_new(void);
|
||||
extern struct json_tokener* json_tokener_new_ex(int depth);
|
||||
extern void json_tokener_free(struct json_tokener *tok);
|
||||
extern void json_tokener_reset(struct json_tokener *tok);
|
||||
extern struct json_object* json_tokener_parse(const char *str);
|
||||
extern struct json_object* json_tokener_parse_verbose(const char *str, enum json_tokener_error *error);
|
||||
|
||||
/**
|
||||
* Set flags that control how parsing will be done.
|
||||
*/
|
||||
extern void json_tokener_set_flags(struct json_tokener *tok, int flags);
|
||||
|
||||
/**
|
||||
* Parse a string and return a non-NULL json_object if a valid JSON value
|
||||
* is found. The string does not need to be a JSON object or array;
|
||||
* it can also be a string, number or boolean value.
|
||||
*
|
||||
* A partial JSON string can be parsed. If the parsing is incomplete,
|
||||
* NULL will be returned and json_tokener_get_error() will be return
|
||||
* json_tokener_continue.
|
||||
* json_tokener_parse_ex() can then be called with additional bytes in str
|
||||
* to continue the parsing.
|
||||
*
|
||||
* If json_tokener_parse_ex() returns NULL and the error anything other than
|
||||
* json_tokener_continue, a fatal error has occurred and parsing must be
|
||||
* halted. Then tok object must not be re-used until json_tokener_reset() is
|
||||
* called.
|
||||
*
|
||||
* When a valid JSON value is parsed, a non-NULL json_object will be
|
||||
* returned. Also, json_tokener_get_error() will return json_tokener_success.
|
||||
* Be sure to check the type with json_object_is_type() or
|
||||
* json_object_get_type() before using the object.
|
||||
*
|
||||
* @b XXX this shouldn't use internal fields:
|
||||
* Trailing characters after the parsed value do not automatically cause an
|
||||
* error. It is up to the caller to decide whether to treat this as an
|
||||
* error or to handle the additional characters, perhaps by parsing another
|
||||
* json value starting from that point.
|
||||
*
|
||||
* Extra characters can be detected by comparing the tok->char_offset against
|
||||
* the length of the last len parameter passed in.
|
||||
*
|
||||
* The tokener does \b not maintain an internal buffer so the caller is
|
||||
* responsible for calling json_tokener_parse_ex with an appropriate str
|
||||
* parameter starting with the extra characters.
|
||||
*
|
||||
* This interface is presently not 64-bit clean due to the int len argument
|
||||
* so the function limits the maximum string size to INT32_MAX (2GB).
|
||||
* If the function is called with len == -1 then strlen is called to check
|
||||
* the string length is less than INT32_MAX (2GB)
|
||||
*
|
||||
* Example:
|
||||
* @code
|
||||
json_object *jobj = NULL;
|
||||
const char *mystring = NULL;
|
||||
int stringlen = 0;
|
||||
enum json_tokener_error jerr;
|
||||
do {
|
||||
mystring = ... // get JSON string, e.g. read from file, etc...
|
||||
stringlen = strlen(mystring);
|
||||
jobj = json_tokener_parse_ex(tok, mystring, stringlen);
|
||||
} while ((jerr = json_tokener_get_error(tok)) == json_tokener_continue);
|
||||
if (jerr != json_tokener_success)
|
||||
{
|
||||
fprintf(stderr, "Error: %s\n", json_tokener_error_desc(jerr));
|
||||
// Handle errors, as appropriate for your application.
|
||||
}
|
||||
if (tok->char_offset < stringlen) // XXX shouldn't access internal fields
|
||||
{
|
||||
// Handle extra characters after parsed object as desired.
|
||||
// e.g. issue an error, parse another object from that point, etc...
|
||||
}
|
||||
// Success, use jobj here.
|
||||
|
||||
@endcode
|
||||
*
|
||||
* @param tok a json_tokener previously allocated with json_tokener_new()
|
||||
* @param str an string with any valid JSON expression, or portion of. This does not need to be null terminated.
|
||||
* @param len the length of str
|
||||
*/
|
||||
extern struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
|
||||
const char *str, int len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
41
common/json/include/json_util.h
Normal file
41
common/json/include/json_util.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* $Id: json_util.h,v 1.4 2006/01/30 23:07:57 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _json_util_h_
|
||||
#define _json_util_h_
|
||||
|
||||
#include "json_object.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define JSON_FILE_BUF_SIZE 4096
|
||||
|
||||
/* utility functions */
|
||||
extern struct json_object* json_object_from_file(const char *filename);
|
||||
extern int json_object_to_file(const char *filename, struct json_object *obj);
|
||||
extern int json_object_to_file_ext(const char *filename, struct json_object *obj, int flags);
|
||||
extern int json_parse_int64(const char *buf, int64_t *retval);
|
||||
extern int json_parse_double(const char *buf, double *retval);
|
||||
|
||||
|
||||
/**
|
||||
* Return a string describing the type of the object.
|
||||
* e.g. "int", or "object", etc...
|
||||
*/
|
||||
extern const char *json_type_to_name(enum json_type o_type);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
292
common/json/include/linkhash.h
Normal file
292
common/json/include/linkhash.h
Normal file
@@ -0,0 +1,292 @@
|
||||
/*
|
||||
* $Id: linkhash.h,v 1.6 2006/01/30 23:07:57 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
* Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _linkhash_h_
|
||||
#define _linkhash_h_
|
||||
|
||||
#include "json_object.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* golden prime used in hash functions
|
||||
*/
|
||||
#define LH_PRIME 0x9e370001UL
|
||||
|
||||
/**
|
||||
* The fraction of filled hash buckets until an insert will cause the table
|
||||
* to be resized.
|
||||
* This can range from just above 0 up to 1.0.
|
||||
*/
|
||||
#define LH_LOAD_FACTOR 0.66
|
||||
|
||||
/**
|
||||
* sentinel pointer value for empty slots
|
||||
*/
|
||||
#define LH_EMPTY (void*)-1
|
||||
|
||||
/**
|
||||
* sentinel pointer value for freed slots
|
||||
*/
|
||||
#define LH_FREED (void*)-2
|
||||
|
||||
struct lh_entry;
|
||||
|
||||
/**
|
||||
* callback function prototypes
|
||||
*/
|
||||
typedef void (lh_entry_free_fn) (struct lh_entry *e);
|
||||
/**
|
||||
* callback function prototypes
|
||||
*/
|
||||
typedef unsigned long (lh_hash_fn) (const void *k);
|
||||
/**
|
||||
* callback function prototypes
|
||||
*/
|
||||
typedef int (lh_equal_fn) (const void *k1, const void *k2);
|
||||
|
||||
/**
|
||||
* An entry in the hash table
|
||||
*/
|
||||
struct lh_entry {
|
||||
/**
|
||||
* The key.
|
||||
*/
|
||||
void *k;
|
||||
/**
|
||||
* The value.
|
||||
*/
|
||||
const void *v;
|
||||
/**
|
||||
* The next entry
|
||||
*/
|
||||
struct lh_entry *next;
|
||||
/**
|
||||
* The previous entry.
|
||||
*/
|
||||
struct lh_entry *prev;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* The hash table structure.
|
||||
*/
|
||||
struct lh_table {
|
||||
/**
|
||||
* Size of our hash.
|
||||
*/
|
||||
int size;
|
||||
/**
|
||||
* Numbers of entries.
|
||||
*/
|
||||
int count;
|
||||
|
||||
/**
|
||||
* Number of collisions.
|
||||
*/
|
||||
int collisions;
|
||||
|
||||
/**
|
||||
* Number of resizes.
|
||||
*/
|
||||
int resizes;
|
||||
|
||||
/**
|
||||
* Number of lookups.
|
||||
*/
|
||||
int lookups;
|
||||
|
||||
/**
|
||||
* Number of inserts.
|
||||
*/
|
||||
int inserts;
|
||||
|
||||
/**
|
||||
* Number of deletes.
|
||||
*/
|
||||
int deletes;
|
||||
|
||||
/**
|
||||
* Name of the hash table.
|
||||
*/
|
||||
const char *name;
|
||||
|
||||
/**
|
||||
* The first entry.
|
||||
*/
|
||||
struct lh_entry *head;
|
||||
|
||||
/**
|
||||
* The last entry.
|
||||
*/
|
||||
struct lh_entry *tail;
|
||||
|
||||
struct lh_entry *table;
|
||||
|
||||
/**
|
||||
* A pointer onto the function responsible for freeing an entry.
|
||||
*/
|
||||
lh_entry_free_fn *free_fn;
|
||||
lh_hash_fn *hash_fn;
|
||||
lh_equal_fn *equal_fn;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Pre-defined hash and equality functions
|
||||
*/
|
||||
extern unsigned long lh_ptr_hash(const void *k);
|
||||
extern int lh_ptr_equal(const void *k1, const void *k2);
|
||||
|
||||
extern unsigned long lh_char_hash(const void *k);
|
||||
extern int lh_char_equal(const void *k1, const void *k2);
|
||||
|
||||
|
||||
/**
|
||||
* Convenience list iterator.
|
||||
*/
|
||||
#define lh_foreach(table, entry) \
|
||||
for(entry = table->head; entry; entry = entry->next)
|
||||
|
||||
/**
|
||||
* lh_foreach_safe allows calling of deletion routine while iterating.
|
||||
*/
|
||||
#define lh_foreach_safe(table, entry, tmp) \
|
||||
for(entry = table->head; entry && ((tmp = entry->next) || 1); entry = tmp)
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Create a new linkhash table.
|
||||
* @param size initial table size. The table is automatically resized
|
||||
* although this incurs a performance penalty.
|
||||
* @param name the table name.
|
||||
* @param free_fn callback function used to free memory for entries
|
||||
* when lh_table_free or lh_table_delete is called.
|
||||
* If NULL is provided, then memory for keys and values
|
||||
* must be freed by the caller.
|
||||
* @param hash_fn function used to hash keys. 2 standard ones are defined:
|
||||
* lh_ptr_hash and lh_char_hash for hashing pointer values
|
||||
* and C strings respectively.
|
||||
* @param equal_fn comparison function to compare keys. 2 standard ones defined:
|
||||
* lh_ptr_hash and lh_char_hash for comparing pointer values
|
||||
* and C strings respectively.
|
||||
* @return a pointer onto the linkhash table.
|
||||
*/
|
||||
extern struct lh_table* lh_table_new(int size, const char *name,
|
||||
lh_entry_free_fn *free_fn,
|
||||
lh_hash_fn *hash_fn,
|
||||
lh_equal_fn *equal_fn);
|
||||
|
||||
/**
|
||||
* Convenience function to create a new linkhash
|
||||
* table with char keys.
|
||||
* @param size initial table size.
|
||||
* @param name table name.
|
||||
* @param free_fn callback function used to free memory for entries.
|
||||
* @return a pointer onto the linkhash table.
|
||||
*/
|
||||
extern struct lh_table* lh_kchar_table_new(int size, const char *name,
|
||||
lh_entry_free_fn *free_fn);
|
||||
|
||||
|
||||
/**
|
||||
* Convenience function to create a new linkhash
|
||||
* table with ptr keys.
|
||||
* @param size initial table size.
|
||||
* @param name table name.
|
||||
* @param free_fn callback function used to free memory for entries.
|
||||
* @return a pointer onto the linkhash table.
|
||||
*/
|
||||
extern struct lh_table* lh_kptr_table_new(int size, const char *name,
|
||||
lh_entry_free_fn *free_fn);
|
||||
|
||||
|
||||
/**
|
||||
* Free a linkhash table.
|
||||
* If a callback free function is provided then it is called for all
|
||||
* entries in the table.
|
||||
* @param t table to free.
|
||||
*/
|
||||
extern void lh_table_free(struct lh_table *t);
|
||||
|
||||
|
||||
/**
|
||||
* Insert a record into the table.
|
||||
* @param t the table to insert into.
|
||||
* @param k a pointer to the key to insert.
|
||||
* @param v a pointer to the value to insert.
|
||||
*/
|
||||
extern int lh_table_insert(struct lh_table *t, void *k, const void *v);
|
||||
|
||||
|
||||
/**
|
||||
* Lookup a record into the table.
|
||||
* @param t the table to lookup
|
||||
* @param k a pointer to the key to lookup
|
||||
* @return a pointer to the record structure of the value or NULL if it does not exist.
|
||||
*/
|
||||
extern struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k);
|
||||
|
||||
/**
|
||||
* Lookup a record into the table
|
||||
* @param t the table to lookup
|
||||
* @param k a pointer to the key to lookup
|
||||
* @return a pointer to the found value or NULL if it does not exist.
|
||||
* @deprecated Use lh_table_lookup_ex instead.
|
||||
*/
|
||||
THIS_FUNCTION_IS_DEPRECATED(extern const void* lh_table_lookup(struct lh_table *t, const void *k));
|
||||
|
||||
/**
|
||||
* Lookup a record in the table
|
||||
* @param t the table to lookup
|
||||
* @param k a pointer to the key to lookup
|
||||
* @param v a pointer to a where to store the found value (set to NULL if it doesn't exist).
|
||||
* @return whether or not the key was found
|
||||
*/
|
||||
extern json_bool lh_table_lookup_ex(struct lh_table *t, const void *k, void **v);
|
||||
|
||||
/**
|
||||
* Delete a record from the table.
|
||||
* If a callback free function is provided then it is called for the
|
||||
* for the item being deleted.
|
||||
* @param t the table to delete from.
|
||||
* @param e a pointer to the entry to delete.
|
||||
* @return 0 if the item was deleted.
|
||||
* @return -1 if it was not found.
|
||||
*/
|
||||
extern int lh_table_delete_entry(struct lh_table *t, struct lh_entry *e);
|
||||
|
||||
|
||||
/**
|
||||
* Delete a record from the table.
|
||||
* If a callback free function is provided then it is called for the
|
||||
* for the item being deleted.
|
||||
* @param t the table to delete from.
|
||||
* @param k a pointer to the key to delete.
|
||||
* @return 0 if the item was deleted.
|
||||
* @return -1 if it was not found.
|
||||
*/
|
||||
extern int lh_table_delete(struct lh_table *t, const void *k);
|
||||
|
||||
extern int lh_table_length(struct lh_table *t);
|
||||
|
||||
void lh_abort(const char *msg, ...);
|
||||
void lh_table_resize(struct lh_table *t, int new_size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
28
common/json/include/math_compat.h
Normal file
28
common/json/include/math_compat.h
Normal file
@@ -0,0 +1,28 @@
|
||||
#ifndef __math_compat_h
|
||||
#define __math_compat_h
|
||||
|
||||
/* Define isnan and isinf on Windows/MSVC */
|
||||
|
||||
#ifndef HAVE_DECL_ISNAN
|
||||
# ifdef HAVE_DECL__ISNAN
|
||||
#include <float.h>
|
||||
#define isnan(x) _isnan(x)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DECL_ISINF
|
||||
# ifdef HAVE_DECL__FINITE
|
||||
#include <float.h>
|
||||
#define isinf(x) (!_finite(x))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DECL_NAN
|
||||
#error This platform does not have nan()
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DECL_INFINITY
|
||||
#error This platform does not have INFINITY
|
||||
#endif
|
||||
|
||||
#endif
|
||||
4
common/json/include/parse_flags.h
Normal file
4
common/json/include/parse_flags.h
Normal file
@@ -0,0 +1,4 @@
|
||||
#ifndef __parse_flags_h
|
||||
#define __parse_flags_h
|
||||
int parse_flags(int argc, char **argv);
|
||||
#endif
|
||||
77
common/json/include/printbuf.h
Normal file
77
common/json/include/printbuf.h
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* $Id: printbuf.h,v 1.4 2006/01/26 02:16:28 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 2008-2009 Yahoo! Inc. All rights reserved.
|
||||
* The copyrights to the contents of this file are licensed under the MIT License
|
||||
* (http://www.opensource.org/licenses/mit-license.php)
|
||||
*/
|
||||
|
||||
#ifndef _printbuf_h_
|
||||
#define _printbuf_h_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct printbuf {
|
||||
char *buf;
|
||||
int bpos;
|
||||
int size;
|
||||
};
|
||||
|
||||
extern struct printbuf*
|
||||
printbuf_new(void);
|
||||
|
||||
/* As an optimization, printbuf_memappend_fast is defined as a macro
|
||||
* that handles copying data if the buffer is large enough; otherwise
|
||||
* it invokes printbuf_memappend_real() which performs the heavy
|
||||
* lifting of realloc()ing the buffer and copying data.
|
||||
* Your code should not use printbuf_memappend directly--use
|
||||
* printbuf_memappend_fast instead.
|
||||
*/
|
||||
extern int
|
||||
printbuf_memappend(struct printbuf *p, const char *buf, int size);
|
||||
|
||||
#define printbuf_memappend_fast(p, bufptr, bufsize) \
|
||||
do { \
|
||||
if ((p->size - p->bpos) > bufsize) { \
|
||||
memcpy(p->buf + p->bpos, (bufptr), bufsize); \
|
||||
p->bpos += bufsize; \
|
||||
p->buf[p->bpos]= '\0'; \
|
||||
} else { printbuf_memappend(p, (bufptr), bufsize); } \
|
||||
} while (0)
|
||||
|
||||
#define printbuf_length(p) ((p)->bpos)
|
||||
|
||||
/**
|
||||
* Set len bytes of the buffer to charvalue, starting at offset offset.
|
||||
* Similar to calling memset(x, charvalue, len);
|
||||
*
|
||||
* The memory allocated for the buffer is extended as necessary.
|
||||
*
|
||||
* If offset is -1, this starts at the end of the current data in the buffer.
|
||||
*/
|
||||
extern int
|
||||
printbuf_memset(struct printbuf *pb, int offset, int charvalue, int len);
|
||||
|
||||
extern int
|
||||
sprintbuf(struct printbuf *p, const char *msg, ...);
|
||||
|
||||
extern void
|
||||
printbuf_reset(struct printbuf *p);
|
||||
|
||||
extern void
|
||||
printbuf_free(struct printbuf *p);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
25
common/json/include/random_seed.h
Normal file
25
common/json/include/random_seed.h
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* random_seed.h
|
||||
*
|
||||
* Copyright (c) 2013 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef seed_h
|
||||
#define seed_h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern int json_c_get_random_seed();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user