Imported Upstream version 0.13 92/172792/1 upstream/0.13
authorDongHun Kwak <dh0128.kwak@samsung.com>
Fri, 16 Mar 2018 02:31:50 +0000 (11:31 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Fri, 16 Mar 2018 02:31:57 +0000 (11:31 +0900)
Change-Id: I265381f2d0b409acb033133448495bf6e4985f4f
Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
232 files changed:
.editorconfig [new file with mode: 0644]
.gitignore
.travis.yml [new file with mode: 0644]
Android.configure.mk
CMakeLists.txt [new file with mode: 0644]
ChangeLog
Doxyfile
INSTALL
Makefile.am
Makefile.am.inc [deleted file]
Makefile.in
NEWS
README
README-WIN32.html [deleted file]
README.html
README.md [new file with mode: 0644]
RELEASE_CHECKLIST.txt
STYLE.txt [new file with mode: 0755]
aclocal.m4
appveyor.yml [new file with mode: 0644]
arraylist.c
arraylist.h
autoconf-archive/README.txt [new file with mode: 0644]
autoconf-archive/m4/ax_append_compile_flags.m4 [new file with mode: 0644]
autoconf-archive/m4/ax_append_flag.m4 [new file with mode: 0644]
autoconf-archive/m4/ax_check_compile_flag.m4 [new file with mode: 0644]
autoconf-archive/m4/ax_compile_check_sizeof.m4 [new file with mode: 0644]
autoconf-archive/m4/ax_require_defined.m4 [new file with mode: 0644]
bits.h
config.guess
config.h.in
config.h.win32
config.sub
configure
configure.ac
debug.c
debug.h
doc/html/README_8md.html [new file with mode: 0644]
doc/html/annotated.html
doc/html/arraylist_8h.html
doc/html/arrowdown.png [deleted file]
doc/html/arrowright.png [deleted file]
doc/html/bits_8h.html
doc/html/classes.html
doc/html/debug_8h.html
doc/html/deprecated.html
doc/html/doxygen.css
doc/html/files.html
doc/html/ftv2blank.png [deleted file]
doc/html/ftv2cl.png [deleted file]
doc/html/ftv2doc.png [deleted file]
doc/html/ftv2folderclosed.png [deleted file]
doc/html/ftv2folderopen.png [deleted file]
doc/html/ftv2lastnode.png [deleted file]
doc/html/ftv2link.png [deleted file]
doc/html/ftv2mlastnode.png [deleted file]
doc/html/ftv2mnode.png [deleted file]
doc/html/ftv2mo.png [deleted file]
doc/html/ftv2node.png [deleted file]
doc/html/ftv2ns.png [deleted file]
doc/html/ftv2plastnode.png [deleted file]
doc/html/ftv2pnode.png [deleted file]
doc/html/ftv2splitbar.png [deleted file]
doc/html/ftv2vertline.png [deleted file]
doc/html/functions.html
doc/html/functions_vars.html
doc/html/globals.html
doc/html/globals_0x61.html [deleted file]
doc/html/globals_0x65.html [deleted file]
doc/html/globals_0x66.html [deleted file]
doc/html/globals_0x68.html [deleted file]
doc/html/globals_0x69.html [deleted file]
doc/html/globals_0x6a.html [deleted file]
doc/html/globals_0x6c.html [deleted file]
doc/html/globals_0x6d.html [deleted file]
doc/html/globals_0x70.html [deleted file]
doc/html/globals_0x73.html [deleted file]
doc/html/globals_0x74.html [deleted file]
doc/html/globals_a.html
doc/html/globals_defs.html
doc/html/globals_e.html
doc/html/globals_enum.html
doc/html/globals_eval.html
doc/html/globals_f.html
doc/html/globals_func.html
doc/html/globals_h.html
doc/html/globals_i.html
doc/html/globals_j.html
doc/html/globals_l.html
doc/html/globals_m.html
doc/html/globals_n.html [new file with mode: 0644]
doc/html/globals_p.html
doc/html/globals_s.html
doc/html/globals_t.html
doc/html/globals_type.html
doc/html/globals_vars.html
doc/html/index.html
doc/html/issues__closed__for__0_813_8md.html [new file with mode: 0644]
doc/html/jquery.js
doc/html/json_8h.html
doc/html/json__c__version_8h.html
doc/html/json__inttypes_8h.html
doc/html/json__object_8h.html
doc/html/json__object__iterator_8h.html
doc/html/json__object__private_8h.html
doc/html/json__pointer_8h.html [new file with mode: 0644]
doc/html/json__tokener_8h.html
doc/html/json__util_8h.html
doc/html/json__visit_8h.html [new file with mode: 0644]
doc/html/linkhash_8h.html
doc/html/math__compat_8h.html
doc/html/md_issues_closed_for_0_813.html [new file with mode: 0644]
doc/html/menu.js [new file with mode: 0644]
doc/html/menudata.js [new file with mode: 0644]
doc/html/pages.html
doc/html/printbuf_8h.html
doc/html/random__seed_8h.html
doc/html/snprintf__compat_8h.html [new file with mode: 0644]
doc/html/strdup__compat_8h.html [new file with mode: 0644]
doc/html/strerror__override_8h.html [new file with mode: 0644]
doc/html/strerror__override__private_8h.html [new file with mode: 0644]
doc/html/structarray__list.html
doc/html/structjson__object.html
doc/html/structjson__object__iter.html
doc/html/structjson__object__iterator.html
doc/html/structjson__tokener.html
doc/html/structjson__tokener__srec.html
doc/html/structlh__entry.html
doc/html/structlh__table.html
doc/html/structprintbuf.html
doc/html/tabs.css
doc/html/unionjson__object_1_1data.html
doc/html/vasprintf__compat_8h.html [new file with mode: 0644]
install-sh
issues_closed_for_0.13.md [new file with mode: 0644]
json-c.pc.in
json-c.vcproj [deleted file]
json.h
json_c_version.h
json_config.h.win32 [new file with mode: 0644]
json_inttypes.h
json_object.c
json_object.h
json_object_iterator.c
json_object_iterator.h
json_object_private.h
json_pointer.c [new file with mode: 0644]
json_pointer.h [new file with mode: 0644]
json_tokener.c
json_tokener.h
json_util.c
json_util.h
json_visit.c [new file with mode: 0644]
json_visit.h [new file with mode: 0644]
libjson.c
linkhash.c
linkhash.h
ltmain.sh
math_compat.h
missing
printbuf.c
printbuf.h
random_seed.c
random_seed.h
snprintf_compat.h [new file with mode: 0644]
strdup_compat.h [new file with mode: 0644]
strerror_override.c [new file with mode: 0644]
strerror_override.h [new file with mode: 0644]
strerror_override_private.h [new file with mode: 0644]
test-driver
tests/Makefile.am
tests/Makefile.in
tests/parse_flags.c
tests/test-defs.sh
tests/test1.c
tests/test1.expected
tests/test1Formatted_plain.expected
tests/test1Formatted_pretty.expected
tests/test1Formatted_spaced.expected
tests/test2.c
tests/test4.c
tests/test4.test [changed from file to symlink]
tests/testReplaceExisting.c
tests/testReplaceExisting.expected
tests/testReplaceExisting.test [changed from file to symlink]
tests/test_basic.test [new file with mode: 0755]
tests/test_cast.c
tests/test_cast.test [changed from file to symlink]
tests/test_charcase.c
tests/test_charcase.test [changed from file to symlink]
tests/test_compare.c [new file with mode: 0644]
tests/test_compare.expected [new file with mode: 0644]
tests/test_compare.test [new symlink]
tests/test_deep_copy.c [new file with mode: 0644]
tests/test_deep_copy.expected [new file with mode: 0644]
tests/test_deep_copy.test [new symlink]
tests/test_double_serializer.c [new file with mode: 0644]
tests/test_double_serializer.expected [new file with mode: 0644]
tests/test_double_serializer.test [new symlink]
tests/test_float.c [new file with mode: 0644]
tests/test_float.expected [new file with mode: 0644]
tests/test_float.test [new symlink]
tests/test_int_add.c [new file with mode: 0644]
tests/test_int_add.expected [new file with mode: 0644]
tests/test_int_add.test [new symlink]
tests/test_json_pointer.c [new file with mode: 0644]
tests/test_json_pointer.expected [new file with mode: 0644]
tests/test_json_pointer.test [new symlink]
tests/test_locale.c
tests/test_locale.expected
tests/test_locale.test [changed from file to symlink]
tests/test_null.c
tests/test_null.test [changed from file to symlink]
tests/test_parse.c
tests/test_parse.expected
tests/test_parse.test [changed from file to symlink]
tests/test_parse_int64.test [changed from file to symlink]
tests/test_printbuf.c
tests/test_printbuf.expected
tests/test_printbuf.test [changed from file to symlink]
tests/test_set_serializer.test [changed from file to symlink]
tests/test_set_value.c [new file with mode: 0644]
tests/test_set_value.expected [new file with mode: 0644]
tests/test_set_value.test [new symlink]
tests/test_util_file.c [new file with mode: 0644]
tests/test_util_file.expected [new file with mode: 0644]
tests/test_util_file.test [new symlink]
tests/test_visit.c [new file with mode: 0644]
tests/test_visit.expected [new file with mode: 0644]
tests/test_visit.test [new symlink]
tests/valid.json [new file with mode: 0644]
vasprintf_compat.h [new file with mode: 0644]

diff --git a/.editorconfig b/.editorconfig
new file mode 100644 (file)
index 0000000..7a625d1
--- /dev/null
@@ -0,0 +1,15 @@
+# EditorConfig
+# http://EditorConfig.org
+
+# top-most EditorConfig file
+root = true
+
+# LF end-of-line, insert an empty new line and UTF-8
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
+
+# Tab indentation
+[makefile,Makefile]
+indent_style = tab
index 15000ba..6347caa 100644 (file)
@@ -1,31 +1,17 @@
+# Temp files
 *~
 *.swp
-/INSTALL
-.deps/
-.libs/
-/aclocal.m4
-/autom4te.cache
-/config.guess
-/json_config.h
-/compile
-/config.h
-/config.log
-/config.status
-/config.sub
-/configure
-/depcomp
-/doc
-/install-sh
-/json.pc
-/json-c.pc
-/json-c-uninstalled.pc
-/libtool
-/ltmain.sh
-/Makefile
-/Makefile.in
-/missing
-/stamp-h1
-/stamp-h2
+*.bak
+*.backup
+\#*
+.\#*
+*\#
+*.sav
+*.save
+*.autosav
+*.autosave
+
+# Tests
 /test-driver
 /tests/Makefile
 /tests/Makefile.in
 /tests/test4
 /tests/testReplaceExisting
 /tests/testSubDir
-/tests/test_parse_int64
-/tests/test_parse
 /tests/test_cast
 /tests/test_charcase
+/tests/test_compare
+/tests/test_deep_copy
+/tests/test_double_serializer
+/tests/test_float
+/tests/test_int_add
+/tests/test_json_pointer
 /tests/test_locale
 /tests/test_null
+/tests/test_parse
+/tests/test_parse_int64
 /tests/test_printbuf
 /tests/test_set_serializer
+/tests/test_set_value
+/tests/test_util_file
+/tests/test_visit
 /tests/*.vg.out
 /tests/*.log
 /tests/*.trs
+
+# Generated folders
 /Debug
 /Release
+/*/Debug
+/*/Release
+
+# Generated binaries
 *.lo
 *.o
 /libjson-c.la
 /libjson.la
+
+# Archives
+*.zip
+*.tar.*
+*.tgz
+*.gz
+*.bz2
+*.xz
+*.lz
+*.lzma
+*.7z
+*.dll
+*.deb
+*.rpm
+*.apk
+*.exe
+*.msi
+*.dmg
+*.ipa
+
+.deps/
+.libs/
+/aclocal.m4
+/autoconf-archive
+/autom4te.cache
+/config.guess
+/config.h.in
+/json_config.h
+/compile
+/config.h
+/config.log
+/config.status
+/config.sub
+/configure
+/depcomp
+/doc
+/install-sh
+/json.pc
+/json-c.pc
+/json-c-uninstalled.pc
+/libtool
+/ltmain.sh
+/Makefile
+/Makefile.in
+/missing
+/stamp-h1
+/stamp-h2
+
+# cmake auto-generated files
+/CMakeCache.txt
+/CMakeFiles
+/cmake_install.cmake
+/include
+/libjson-c.a
+/libjson-c.so
diff --git a/.travis.yml b/.travis.yml
new file mode 100644 (file)
index 0000000..1471983
--- /dev/null
@@ -0,0 +1,32 @@
+language: cpp\r
+\r
+compiler:\r
+  - gcc\r
+  - clang\r
+\r
+addons:\r
+  apt:\r
+    packages:\r
+      - cppcheck\r
+\r
+os:\r
+  - linux\r
+  - osx\r
+\r
+before_install:\r
+  - echo $LANG\r
+  - echo $LC_ALL\r
+  - set -e\r
+\r
+install:\r
+  - sh autogen.sh\r
+\r
+before_script:\r
+  - ./configure\r
+\r
+script:\r
+  - make\r
+\r
+after_success:\r
+  - make check\r
+  - if type cppcheck &> /dev/null ; then cppcheck --error-exitcode=1 --quiet *.h *.c tests/ ; fi\r
index a6265ad..9b09f44 100644 (file)
@@ -1,4 +1,14 @@
 # This file is the top android makefile for all sub-modules.
+#
+# Suggested settings to build for Android:
+#
+# export PATH=$PATH:/opt/android-ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/
+# export SYSROOT=/opt/android-ndk/platforms/android-9/arch-arm/usr/
+# export LD=arm-linux-androideabi-ld
+# export CC="arm-linux-androideabi-gcc --sysroot=/opt/android-ndk/platforms/android-9/arch-arm"
+#
+# Then run autogen.sh, configure and make.
+#
 
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..6b38781
--- /dev/null
@@ -0,0 +1,136 @@
+#Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+cmake_minimum_required(VERSION 2.8.7)
+cmake_policy(SET CMP0048 NEW)
+project(json-c VERSION 0.13)
+
+
+include(CheckSymbolExists)
+
+check_symbol_exists(strtoll "stdlib.h" HAVE_STRTOLL)
+
+set(cmake_strtoll "strtoll")
+if (NOT HAVE_STRTOLL)
+  # Use _strtoi64 if strtoll is not available.
+  check_symbol_exists(_strtoi64 stdlib.h have_strtoi64)
+  if (have_strtoi64)
+    set(HAVE_STRTOLL 1)
+    set(cmake_strtoll "_strtoi64")
+    # could do the same for strtoull, if needed
+  endif ()
+endif ()
+
+
+
+if(MSVC)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4100 /wd4996 /wd4244 /wd4706 /wd4702 /wd4127 /wd4701")
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4100 /wd4996 /wd4244 /wd4706 /wd4702 /wd4127 /wd4701")
+  set(cmake_create_config 1)
+elseif(MINGW)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -D_GNU_SOURCE=1")
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -D_GNU_SOURCE=1")
+  if (MSYS OR CMAKE_GENERATOR STREQUAL "Unix Makefiles")
+    execute_process(COMMAND echo ${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+    execute_process(COMMAND sh autogen.sh WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+    execute_process(COMMAND sh ./configure WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+    file(COPY ./config.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/)
+    file(COPY ./json_config.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/)
+  else()
+    set(cmake_create_config 1)
+  endif()
+elseif(UNIX)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -D_GNU_SOURCE")
+  execute_process(COMMAND echo ${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+  execute_process(COMMAND sh autogen.sh WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+  execute_process(COMMAND ./configure WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+  file(COPY ./config.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/)
+  file(COPY ./json_config.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/)
+endif()
+
+if (cmake_create_config)
+  file(REMOVE ./config.h)  # make sure any stale one is gone
+  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.win32 ${CMAKE_CURRENT_BINARY_DIR}/include/config.h)
+  file(COPY ./json_config.h.win32 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/)
+  file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/include/json_config.h.win32 ${CMAKE_CURRENT_BINARY_DIR}/include/json_config.h)
+endif ()
+
+include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
+
+set(JSON_C_PUBLIC_HEADERS
+    ./json.h
+    ${CMAKE_CURRENT_BINARY_DIR}/include/config.h
+    ${CMAKE_CURRENT_BINARY_DIR}/include/json_config.h
+    ./arraylist.h
+    ./debug.h
+    ./json_c_version.h
+    ./json_inttypes.h
+    ./json_object.h
+    ./json_pointer.h
+    ./json_tokener.h
+    ./json_util.h
+    ./linkhash.h
+    ./printbuf.h
+)
+set(JSON_C_HEADERS
+    ${JSON_C_PUBLIC_HEADERS}
+    ./json_object_private.h
+    ./random_seed.h
+    ./strerror_override.h
+    ./strerror_override_private.h
+    ./math_compat.h
+    ./snprintf_compat.h
+    ./strdup_compat.h
+    ./vasprintf_compat.h
+)
+
+set(JSON_C_SOURCES
+    ./arraylist.c
+    ./debug.c
+    ./json_c_version.c
+    ./json_object.c
+    ./json_object_iterator.c
+    ./json_pointer.c
+    ./json_tokener.c
+    ./json_util.c
+    ./json_visit.c
+    ./linkhash.c
+    ./printbuf.c
+    ./random_seed.c
+    ./strerror_override.c
+)
+
+add_library(json-c
+    SHARED
+    ${JSON_C_SOURCES}
+    ${JSON_C_HEADERS}
+)
+
+add_library(json-c-static
+    STATIC
+    ${JSON_C_SOURCES}
+    ${JSON_C_HEADERS}
+)
+
+set_property(TARGET json-c PROPERTY C_STANDARD 99)
+set_property(TARGET json-c-static PROPERTY C_STANDARD 99)
+set_target_properties(json-c-static PROPERTIES OUTPUT_NAME json-c)
+
+install(TARGETS json-c json-c-static
+    RUNTIME DESTINATION bin
+    LIBRARY DESTINATION lib
+    ARCHIVE DESTINATION lib
+)
+
+install(FILES ${JSON_C_PUBLIC_HEADERS} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/json-c )
+
+if (UNIX)
+       set(prefix ${CMAKE_INSTALL_PREFIX})
+       set(exec_prefix ${CMAKE_INSTALL_PREFIX}/bin)
+       set(libdir ${CMAKE_INSTALL_PREFIX}/lib)
+       set(includedir ${CMAKE_INSTALL_PREFIX}/include)
+       set(VERSION ${PROJECT_VERSION})
+       configure_file(json-c.pc.in json-c.pc @ONLY)
+       set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files")
+       install(FILES ${CMAKE_BINARY_DIR}/json-c.pc DESTINATION "${INSTALL_PKGCONFIG_DIR}")
+endif ()
index 52f4b42..e079337 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,149 @@
 
+0.13 (up to commit 5dae561, 2017/11/29)
+=================================
+
+This release, being three and a half years after the 0.12 branch (f84d9c),
+   has quite a number of changes included.  The following is a sampling of
+   the most significant ones.
+
+Since the 0.12 release, 250 issues and pull requests have been closed.
+See issues_closed_for_0.13.md for a complete list.
+
+
+Deprecated and removed features:
+--------------------------------
+* All internal use of bits.h has been eliminated.  The file will be removed.
+       Do not use: hexdigit(), error_ptr(), error_descrition() and it_error() 
+* lh_abort() is deprecated.  It will be removed.
+
+Behavior changes:
+-----------------
+* Tighten the number parsing algorithm to raise errors instead of truncating
+     the results.  For example 12.3.4 or 2015-01-15, which now return null.
+        See commit 99d8fc
+
+* Use size_t for array length and size.  Platforms where sizeof(size_t) != sizeof(int) may not be backwards compatible
+       See commits 45c56b, 92e9a5 and others.
+
+* Check for failue when allocating memory, returning NULL and errno=ENOMEM.
+        See commit 2149a04.
+
+* Change json_object_object_add() return type from void to int, and will return -1 on failures, instead of exiting. (Note: this is not an ABI change)
+
+New features:
+-------------
+* We're aiming to follow RFC 7159 now.
+
+* Add a couple of additional option to json_object_to_json_string_ext:
+       JSON_C_TO_STRING_PRETTY_TAB
+       JSON_C_TO_STRING_NOSLASHESCAPE
+
+* Add a json_object_object_add_ex() function to allow for performance
+       improvements when certain constraints are known to be true.
+
+* Make serialization format of doubles configurable, in two different ways:
+       Call json_object_set_serializer with json_object_double_to_json_string and a custom
+        format on each double object, or
+       Call json_c_set_serialization_double_format() to set a global or thread-wide format.
+
+* Add utility function for comparing json_objects - json_object_equal()
+
+* Add a way to copy entire object trees: json_object_deep_copy()
+* Add json_object_set_<type> function to modify the value of existing json_object's
+ without the need to recreate them.  Also add a json_object_int_inc function to
+ adjust an int's value.
+* Add support for JSON pointer, RFC 6901.  See json_pointer.h
+* Add a json_util_get_last_err() function to retrieve the string describing the
+ cause of errors, instead of printing to stderr.
+* Add perllike hash function for strings, and json_global_set_string_hash() 8f8d03d
+* Add a json_c_visit() function to provide a way to iterate over a tree of json-c objects.
+
+Notable bug fixes and other improvements:
+-----------------------------------------
+* Make reference increment and decrement atomic to allow passing json objects between threads.
+* Fix json_object_object_foreach to avoid uninitialized variable warnings.
+* Improve performance by removing unneeded data items from hashtable code and reducing duplicate hash computation.
+* Improve performance by storing small strings inside json_object
+* Improve performance of json_object_to_json_string by removing variadic printf. commit 9ff0f49
+* Issue #371: fix parsing of "-Infinity", and avoid needlessly copying the input when doing so.
+* Fix stack buffer overflow in json_object_double_to_json_string_format() - commit 2c2deb87
+* Fix various potential null ptr deref and int32 overflows
+* Issue #332: fix a long-standing bug in array_list_put_idx() where it would attempt to free previously free'd entries due to not checking the current array length.
+* Issue #195: use uselocale() instead of setlocale() in json_tokener to behave better in threaded environments.
+* Issue #275: fix out of bounds read when handling unicode surrogate pairs.
+* Ensure doubles that happen to be a whole number are emitted with ".0" - commit ca7a19
+* PR#331: for Visual Studio, use a snprintf/vsnprintf wrapper that ensures the string is terminated.
+* Fix double to int cast overflow in json_object_get_int64.
+* Clamp double to int32 when narrowing in json_object_get_int.
+* Use strtoll() to parse ints - instead of sscanf
+* Miscellaneous smaller changes, including removing unused variables, fixing warning
+ about uninitialized variables adding const qualifiers, reformatting code, etc...
+
+Build changes:
+--------------
+* Add Appveyor and Travis build support
+* Switch to using CMake when building on Windows with Visual Studio.
+       A dynamic .dll is generated instead of a .lib
+       config.h is now generated, config.h.win32 should no longer be manually copied
+* Add support for MacOS through CMake too.
+* Enable silent build by default
+* Link against libm when needed
+* Add support for building with AddressSanitizer
+* Add support for building with Clang
+* Add a --enable-threading configure option, and only use the (slower) __sync_add_and_fetch()/__sync_sub_and_fetch() function when it is specified.
+
+List of new functions added:
+----------------------------
+### json_object.h
+* array_list_bsearch()
+* array_list_del_idx()
+* json_object_to_json_string_length()
+* json_object_get_userdata()
+* json_object_set_userdata()
+* json_object_object_add_ex()
+* json_object_array_bsearch()
+* json_object_array_del_idx()
+* json_object_set_boolean()
+* json_object_set_int()
+* json_object_int_inc()
+* json_object_set_int64()
+* json_c_set_serialization_double_format()
+* json_object_double_to_json_string()
+* json_object_set_double()
+* json_object_set_string()
+* json_object_set_string_len()
+* json_object_equal()
+* json_object_deep_copy()
+
+### json_pointer.h
+* json_pointer_get()
+* json_pointer_getf()
+* json_pointer_set()
+* json_pointer_setf()
+
+### json_util.h
+* json_object_from_fd()
+* json_object_to_fd()
+* json_util_get_last_err()
+
+### json_visit.h
+* json_c_visit()
+
+### linkhash.h
+* json_global_set_string_hash()
+* lh_table_resize()
+
+### printbuf.h
+* printbuf_strappend()
+
+
 0.12.1
+======
 
   * Minimal changes to address compile issues.
 
 0.12
+====
 
   * Address security issues:
     * CVE-2013-6371: hash collision denial of service
 
 
 0.11
+====
 
   * IMPORTANT: the name of the library has changed to libjson-c.so and
      the header files are now in include/json-c.
   * Fix a bug (buffer overrun) when expanding arrays to more than 64 entries.
 
 0.10
+====
 
   * Add a json_object_to_json_string_ext() function to allow output to be
      formatted in a more human readable form.
     Brent Miller, bdmiller at yahoo dash inc dot com
 
 0.9
+===
   * Add README.html README-WIN32.html config.h.win32 to Makefile.am
     Michael Clark, <michael@metaparadigm.com>
   * Add const qualifier to the json_tokener_parse functions
     Gerard Krol, g dot c dot krol at student dot tudelft dot nl
 
 0.8
+===
   * Add va_end for every va_start
     Dotan Barak, dotanba at gmail dot com
   * Add macros to enable compiling out debug code
     Geoffrey Young, geoff at modperlcookbook dot org
 
 0.7
+===
   * Add escaping of backslash to json output
   * Add escaping of foward slash on tokenizing and output
   * Changes to internal tokenizer from using recursion to
     using a depth state structure to allow incremental parsing
 
 0.6
+===
   * Fix bug in escaping of control characters
     Johan Björklund, johbjo09 at kth dot se
   * Remove include "config.h" from headers (should only
     Michael Clark <michael@metaparadigm.com>
 
 0.5
+===
   * Make headers C++ compatible by change *this to *obj
   * Add ifdef C++ extern "C" to headers
   * Use simpler definition of min and max in bits.h
     Michael Clark <michael@metaparadigm.com>
 
 0.4
+===
   * Fix additional error case in object parsing
   * Add back sign reversal in nested object parse as error pointer
     value is negative, while error value is positive.
     Michael Clark <michael@metaparadigm.com>
 
 0.3
+===
   * fix pointer arithmetic bug for error pointer check in is_error() macro
   * fix type passed to printbuf_memappend in json_tokener
   * update autotools bootstrap instructions in README
     Michael Clark <michael@metaparadigm.com>
 
 0.2
+===
   * printbuf.c - C. Watford (christopher.watford@gmail.com)
     Added a Win32/Win64 compliant implementation of vasprintf
   * debug.c - C. Watford (christopher.watford@gmail.com)
     Michael Clark <michael@metaparadigm.com>
        
 0.1
+===
   * initial release
index 5e0cf5d..aa7face 100644 (file)
--- a/Doxyfile
+++ b/Doxyfile
-# Doxyfile 1.3.8
+# Doxyfile 1.8.8
 
 # This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
+# doxygen (www.doxygen.org) for a project.
 #
-# All text after a hash (#) is considered a comment and will be ignored
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
 # The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
 
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
-# by quotes) that should identify the project.
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
 
 PROJECT_NAME           = json-c
 
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = 0.13
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =
 
-PROJECT_NUMBER         = 0.12.1
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
 
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
 
 OUTPUT_DIRECTORY       = doc
 
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-# 4096 sub-directories (in 2 levels) under the output directory of each output 
-# format and will distribute the generated files over these directories. 
-# Enabling this option can be useful when feeding doxygen a huge amount of source 
-# files, where putting all generated files in the same directory would otherwise 
-# cause performance problems for the file system.
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
 
 CREATE_SUBDIRS         = NO
 
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, 
-# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, 
-# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, 
-# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, 
-# Swedish, and Ukrainian.
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
 
 OUTPUT_LANGUAGE        = English
 
-# This tag can be used to specify the encoding used in the generated output. 
-# The encoding is not always determined by the language that is chosen, 
-# but also whether or not the output is meant for Windows or non-Windows users. 
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
-# forces the Windows encoding (this is the default for the Windows binary), 
-# whereas setting the tag to NO uses a Unix-style encoding (the default for 
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING   = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
 
 BRIEF_MEMBER_DESC      = YES
 
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
 # brief descriptions will be completely suppressed.
+# The default value is: YES.
 
 REPEAT_BRIEF           = YES
 
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is used 
-# as the annotated text. Otherwise, the brief description is used as-is. If left 
-# blank, the following values are used ("$name" is automatically replaced with the 
-# name of the entity): "The $name class" "The $name widget" "The $name file" 
-# "is" "provides" "specifies" "contains" "represents" "a" "an" "the"
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
 
-ABBREVIATE_BRIEF       = 
+ABBREVIATE_BRIEF       =
 
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
 # description.
+# The default value is: NO.
 
 ALWAYS_DETAILED_SEC    = NO
 
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited 
-# members of a class in the documentation of that class as if those members were 
-# ordinary class members. Constructors, destructors and assignment operators of 
-# the base classes will not be shown.
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
 
 INLINE_INHERITED_MEMB  = NO
 
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
 
 FULL_PATH_NAMES        = YES
 
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. The tag can be used to show relative paths in the file list. 
-# If left blank the directory from which doxygen is run is used as the 
-# path to strip.
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
 
-STRIP_FROM_PATH        = 
+STRIP_FROM_PATH        =
 
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-# the path mentioned in the documentation of a class, which tells 
-# the reader which header file to include in order to use a class. 
-# If left blank only the name of the header file containing the class 
-# definition is used. Otherwise one should specify the include paths that 
-# are normally passed to the compiler using the -I flag.
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
 
-STRIP_FROM_INC_PATH    = 
+STRIP_FROM_INC_PATH    =
 
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful is your file systems 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
 
 SHORT_NAMES            = NO
 
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like the Qt-style comments (thus requiring an 
-# explicit @brief command for a brief description.
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
 
 JAVADOC_AUTOBRIEF      = NO
 
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
 
-MULTILINE_CPP_IS_BRIEF = NO
+QT_AUTOBRIEF           = NO
 
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member 
-# documentation.
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
 
-DETAILS_AT_TOP         = NO
+MULTILINE_CPP_IS_BRIEF = NO
 
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
 
 INHERIT_DOCS           = YES
 
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
-# all members of a group must be documented explicitly.
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
 
-DISTRIBUTE_GROUP_DOC   = NO
+SEPARATE_MEMBER_PAGES  = NO
 
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
 
 TAB_SIZE               = 8
 
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
 
-ALIASES                = 
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
 
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources 
-# only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_FOR_C  = YES
 
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources 
-# only. Doxygen will then generate output that is more tailored for Java. 
-# For instance, namespaces will be presented as packages, qualified scopes 
-# will look different, etc.
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_JAVA   = NO
 
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
 
 SUBGROUPING            = YES
 
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
 
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
 
 EXTRACT_ALL            = YES
 
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
 
 EXTRACT_PRIVATE        = NO
 
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
 
 EXTRACT_STATIC         = NO
 
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
 
 EXTRACT_LOCAL_CLASSES  = NO
 
-# This flag is only useful for Objective-C code. When set to YES local 
-# methods, which are defined in the implementation section but not in 
-# the interface are included in the documentation. 
-# If set to NO (the default) only methods in the interface are included.
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
 
 EXTRACT_LOCAL_METHODS  = NO
 
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
 
 HIDE_UNDOC_MEMBERS     = NO
 
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
 
 HIDE_UNDOC_CLASSES     = NO
 
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
 
 HIDE_FRIEND_COMPOUNDS  = NO
 
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
 
 HIDE_IN_BODY_DOCS      = NO
 
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
 
 INTERNAL_DOCS          = NO
 
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
 # and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
 
 CASE_SENSE_NAMES       = YES
 
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
 
 HIDE_SCOPE_NAMES       = NO
 
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
 
 SHOW_INCLUDE_FILES     = NO
 
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
 
 INLINE_INFO            = YES
 
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
 
 SORT_MEMBER_DOCS       = YES
 
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-# brief documentation of file, namespace and class members alphabetically 
-# by member name. If set to NO (the default) the members will appear in 
-# declaration order.
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
 
 SORT_BRIEF_DOCS        = NO
 
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-# sorted by fully-qualified names, including namespaces. If set to 
-# NO (the default), the class list will be sorted only by class name, 
-# not including the namespace part. 
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
 # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the 
-# alphabetical list.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
 
 SORT_BY_SCOPE_NAME     = NO
 
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
 
 GENERATE_TODOLIST      = YES
 
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
 
 GENERATE_TESTLIST      = YES
 
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
 
 GENERATE_BUGLIST       = YES
 
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
 
 GENERATE_DEPRECATEDLIST= YES
 
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if sectionname ... \endif.
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
 
-ENABLED_SECTIONS       = 
+ENABLED_SECTIONS       =
 
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or define consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and defines in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
 
 MAX_INITIALIZER_LINES  = 30
 
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
-# list will mention the files that were used to generate the documentation.
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
 
 SHOW_USED_FILES        = YES
 
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
 #---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
+# Configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
 
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
 
 QUIET                  = NO
 
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
 
 WARNINGS               = YES
 
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
 
 WARN_IF_UNDOCUMENTED   = YES
 
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
 
 WARN_IF_DOC_ERROR      = YES
 
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text.
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
 
 WARN_FORMAT            = "$file:$line: $text"
 
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
 
-WARN_LOGFILE           = 
+WARN_LOGFILE           =
 
 #---------------------------------------------------------------------------
-# configuration options related to the input files
+# Configuration options related to the input files
 #---------------------------------------------------------------------------
 
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = README.md \
+                         .
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
 
-INPUT                  = 
+INPUT_ENCODING         = UTF-8
 
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp 
-# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
 
-FILE_PATTERNS          = *.h
+FILE_PATTERNS          = *.h \
+                         *.md
 
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
 
 RECURSIVE              = NO
 
-# The EXCLUDE tag can be used to specify files and/or directories that should 
-# excluded from the INPUT source files. This way you can easily exclude a 
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
 # subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
 
-EXCLUDE                = 
+EXCLUDE                =
 
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories 
-# that are symbolic links (a Unix filesystem feature) are excluded from the input.
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
 
 EXCLUDE_SYMLINKS       = NO
 
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
 # certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
 
-EXCLUDE_PATTERNS       = 
+EXCLUDE_PATTERNS       =
 
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
 
-EXAMPLE_PATH           = 
+EXCLUDE_SYMBOLS        =
 
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
 
-EXAMPLE_PATTERNS       = 
+EXAMPLE_PATH           =
 
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
 
 EXAMPLE_RECURSIVE      = NO
 
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
 
-IMAGE_PATH             = 
+IMAGE_PATH             =
 
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-# ignored.
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
 
-INPUT_FILTER           = 
+INPUT_FILTER           =
 
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-# basis.  Doxygen will compare the file name with each pattern and apply the 
-# filter if there is a match.  The filters are a list of the form: 
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
-# is applied to all files.
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
 
-FILTER_PATTERNS        = 
+FILTER_PATTERNS        =
 
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
 
 FILTER_SOURCE_FILES    = NO
 
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
 #---------------------------------------------------------------------------
-# configuration options related to source browsing
+# Configuration options related to source browsing
 #---------------------------------------------------------------------------
 
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO.
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
 
 SOURCE_BROWSER         = NO
 
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
 
 INLINE_SOURCES         = NO
 
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C and C++ comments will always remain visible.
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
 
 STRIP_CODE_COMMENTS    = YES
 
-# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
-# then for each documented function all documented 
-# functions referencing it will be listed.
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
 
 REFERENCED_BY_RELATION = YES
 
-# If the REFERENCES_RELATION tag is set to YES (the default) 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
 
 REFERENCES_RELATION    = YES
 
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
 
 VERBATIM_HEADERS       = NO
 
+# If the CLANG_ASSISTED_PARSING tag is set to YES, then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# compiled with the --with-libclang option.
+# The default value is: NO.
+
+#CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+#CLANG_OPTIONS          =
+
 #---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
+# Configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
 
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
 
 ALPHABETICAL_INDEX     = NO
 
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
 COLS_IN_ALPHA_INDEX    = 5
 
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
-IGNORE_PREFIX          = 
+IGNORE_PREFIX          =
 
 #---------------------------------------------------------------------------
-# configuration options related to the HTML output
+# Configuration options related to the HTML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: YES.
 
 GENERATE_HTML          = YES
 
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_OUTPUT            = html
 
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_FILE_EXTENSION    = .html
 
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
 # standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra stylesheet files is of importance (e.g. the last
+# stylesheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-HTML_HEADER            = 
+GENERATE_HTMLHELP      = NO
 
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-HTML_FOOTER            = 
+CHM_FILE               =
 
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet. Note that doxygen will try to copy 
-# the style sheet file to the HTML output directory, so don't put your own 
-# stylesheet in the HTML output directory as well, or it will be erased!
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-HTML_STYLESHEET        = 
+HHC_LOCATION           =
 
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
-# files or namespaces will be aligned in HTML using tables. If set to 
-# NO a bullet list will be used.
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-HTML_ALIGN_MEMBERS     = YES
+GENERATE_CHI           = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
-# of the generated HTML documentation.
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-GENERATE_HTMLHELP      = NO
+CHM_INDEX_ENCODING     =
 
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
-# written to the html output directory.
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-CHM_FILE               = 
+BINARY_TOC             = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-HHC_LOCATION           = 
+TOC_EXPAND             = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-GENERATE_CHI           = NO
+DISABLE_INDEX          = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-BINARY_TOC             = NO
+GENERATE_TREEVIEW      = NO
 
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-TOC_EXPAND             = NO
+ENUM_VALUES_PER_LINE   = 4
 
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
-# top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it.
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-DISABLE_INDEX          = NO
+TREEVIEW_WIDTH         = 250
 
-# This tag can be used to set the number of enum values (range [1..20]) 
-# that doxygen will group on one line in the generated HTML documentation.
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-ENUM_VALUES_PER_LINE   = 4
+EXT_LINKS_IN_WINDOW    = NO
 
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
-# probably better off using the HTML help feature.
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-GENERATE_TREEVIEW      = NO
+FORMULA_FONTSIZE       = 10
 
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-TREEVIEW_WIDTH         = 250
+SEARCHENGINE           = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
 
 #---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
+# Configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
 
 GENERATE_LATEX         = NO
 
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_OUTPUT           = latex
 
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name.
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_CMD_NAME         = latex
 
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 MAKEINDEX_CMD_NAME     = makeindex
 
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 COMPACT_LATEX          = NO
 
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, a4wide, letter, legal and 
-# executive. If left blank a4wide will be used.
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 PAPER_TYPE             = a4wide
 
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
-EXTRA_PACKAGES         = 
+EXTRA_PACKAGES         =
 
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empy string,
+# for the replacement values of the other commands the user is refered to
+# HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
 
-LATEX_HEADER           = 
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 PDF_HYPERLINKS         = NO
 
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
 # higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 USE_PDFLATEX           = NO
 
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_BATCHMODE        = NO
 
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_HIDE_INDICES     = NO
 
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
 #---------------------------------------------------------------------------
-# configuration options related to the RTF output
+# Configuration options related to the RTF output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
 
 GENERATE_RTF           = NO
 
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_OUTPUT             = rtf
 
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 COMPACT_RTF            = NO
 
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_HYPERLINKS         = NO
 
-# Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
-RTF_STYLESHEET_FILE    = 
+RTF_STYLESHEET_FILE    =
 
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
-RTF_EXTENSIONS_FILE    = 
+RTF_EXTENSIONS_FILE    =
 
 #---------------------------------------------------------------------------
-# configuration options related to the man page output
+# Configuration options related to the man page output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
 
 GENERATE_MAN           = NO
 
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_OUTPUT             = man
 
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_EXTENSION          = .3
 
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_LINKS              = NO
 
 #---------------------------------------------------------------------------
-# configuration options related to the XML output
+# Configuration options related to the XML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
 
 GENERATE_XML           = NO
 
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
 
 XML_OUTPUT             = xml
 
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
 
-XML_SCHEMA             = 
+XML_PROGRAMLISTING     = YES
 
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
 
-XML_DTD                = 
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
 
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
+GENERATE_DOCBOOK       = NO
 
-XML_PROGRAMLISTING     = YES
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
 
 #---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
+# Configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
 
 GENERATE_AUTOGEN_DEF   = NO
 
 #---------------------------------------------------------------------------
-# configuration options related to the Perl module output
+# Configuration options related to the Perl module output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
 
 GENERATE_PERLMOD       = NO
 
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
 PERLMOD_LATEX          = NO
 
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
 PERLMOD_PRETTY         = YES
 
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
-PERLMOD_MAKEVAR_PREFIX = 
+PERLMOD_MAKEVAR_PREFIX =
 
 #---------------------------------------------------------------------------
-# Configuration options related to the preprocessor   
+# Configuration options related to the preprocessor
 #---------------------------------------------------------------------------
 
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
 
 ENABLE_PREPROCESSING   = YES
 
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-MACRO_EXPANSION        = NO
+MACRO_EXPANSION        = YES
 
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-EXPAND_ONLY_PREDEF     = NO
+EXPAND_ONLY_PREDEF     = YES
 
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 SEARCH_INCLUDES        = YES
 
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
 
-INCLUDE_PATH           = 
+INCLUDE_PATH           =
 
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-INCLUDE_FILE_PATTERNS  = 
+INCLUDE_FILE_PATTERNS  =
 
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed.
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-PREDEFINED             = 
+PREDEFINED             = THIS_FUNCTION_IS_DEPRECATED(f)=f
 
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition.
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-EXPAND_AS_DEFINED      = 
+EXPAND_AS_DEFINED      =
 
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all function-like macros that are alone 
-# on a line, have an all uppercase name, and do not end with a semicolon. Such 
-# function macros are typically used for boiler-plate code, and will confuse the 
-# parser if not removed.
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 SKIP_FUNCTION_MACROS   = YES
 
 #---------------------------------------------------------------------------
-# Configuration::additions related to external references   
+# Configuration options related to external references
 #---------------------------------------------------------------------------
 
-# The TAGFILES option can be used to specify one or more tagfiles. 
-# Optionally an initial location of the external documentation 
-# can be added for each tagfile. The format of a tag file without 
-# this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths or 
-# URLs. If a location is present for each tag, the installdox tool 
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen 
-# is run, you must also specify the path to the tagfile here.
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
 
-TAGFILES               = 
+TAGFILES               =
 
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
 
-GENERATE_TAGFILE       = 
+GENERATE_TAGFILE       =
 
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
 
 ALLEXTERNALS           = NO
 
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
 
 EXTERNAL_GROUPS        = YES
 
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
 
 PERL_PATH              = /usr/bin/perl
 
 #---------------------------------------------------------------------------
-# Configuration options related to the dot tool   
+# Configuration options related to the dot tool
 #---------------------------------------------------------------------------
 
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or 
-# super classes. Setting the tag to NO turns the diagrams off. Note that this 
-# option is superseded by the HAVE_DOT option below. This is only a fallback. It is 
-# recommended to install and use dot, since it yields more powerful graphs.
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
 
 CLASS_DIAGRAMS         = YES
 
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
 
 HIDE_UNDOC_RELATIONS   = YES
 
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: YES.
 
 HAVE_DOT               = NO
 
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# the CLASS_DIAGRAMS tag to NO.
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CLASS_GRAPH            = YES
 
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 COLLABORATION_GRAPH    = YES
 
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
 # Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 UML_LOOK               = NO
 
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 TEMPLATE_RELATIONS     = NO
 
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 INCLUDE_GRAPH          = YES
 
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 INCLUDED_BY_GRAPH      = YES
 
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
-# generate a call dependency graph for every global function or class method. 
-# Note that enabling this option will significantly increase the time of a run. 
-# So in most cases it will be better to enable call graphs for selected 
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
 # functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CALL_GRAPH             = NO
 
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY    = YES
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
+CALLER_GRAPH           = NO
 
-DOT_IMAGE_FORMAT       = png
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
-# found. If left blank, it is assumed the dot tool can be found on the path.
-
-DOT_PATH               = 
+GRAPHICAL_HIERARCHY    = YES
 
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
-DOTFILE_DIRS           = 
+DOT_IMAGE_FORMAT       = png
 
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+PLANTUML_JAR_PATH      =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
-MAX_DOT_GRAPH_WIDTH    = 1024
+MAX_DOT_GRAPH_DEPTH    = 0
 
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
-MAX_DOT_GRAPH_HEIGHT   = 1024
+DOT_TRANSPARENT        = NO
 
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes that 
-# lay further from the root node will be omitted. Note that setting this option to 
-# 1 or 2 may greatly reduce the computation time needed for large code bases. Also 
-# note that a graph may be further truncated if the graph's image dimensions are 
-# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). 
-# If 0 is used for the depth value (the default), the graph is not depth-constrained.
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
-MAX_DOT_GRAPH_DEPTH    = 0
+DOT_MULTI_TARGETS      = NO
 
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GENERATE_LEGEND        = YES
 
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_CLEANUP            = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine   
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be 
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE           = NO
diff --git a/INSTALL b/INSTALL
index 007e939..5fb10a0 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -1,370 +1,3 @@
-Installation Instructions
-*************************
 
-Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
-Inc.
+See README.md for installation instructions.
 
-   Copying and distribution of this file, with or without modification,
-are permitted in any medium without royalty provided the copyright
-notice and this notice are preserved.  This file is offered as-is,
-without warranty of any kind.
-
-Basic Installation
-==================
-
-   Briefly, the shell commands `./configure; make; make install' should
-configure, build, and install this package.  The following
-more-detailed instructions are generic; see the `README' file for
-instructions specific to this package.  Some packages provide this
-`INSTALL' file but do not implement all of the features documented
-below.  The lack of an optional feature in a given package is not
-necessarily a bug.  More recommendations for GNU packages can be found
-in *note Makefile Conventions: (standards)Makefile Conventions.
-
-   The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
-   It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.
-
-   If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release.  If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
-   The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'.  You need `configure.ac' if
-you want to change it or regenerate `configure' using a newer version
-of `autoconf'.
-
-   The simplest way to compile this package is:
-
-  1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.
-
-     Running `configure' might take a while.  While running, it prints
-     some messages telling which features it is checking for.
-
-  2. Type `make' to compile the package.
-
-  3. Optionally, type `make check' to run any self-tests that come with
-     the package, generally using the just-built uninstalled binaries.
-
-  4. Type `make install' to install the programs and any data files and
-     documentation.  When installing into a prefix owned by root, it is
-     recommended that the package be configured and built as a regular
-     user, and only the `make install' phase executed with root
-     privileges.
-
-  5. Optionally, type `make installcheck' to repeat any self-tests, but
-     this time using the binaries in their final installed location.
-     This target does not install anything.  Running this target as a
-     regular user, particularly if the prior `make install' required
-     root privileges, verifies that the installation completed
-     correctly.
-
-  6. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  To also remove the
-     files that `configure' created (so you can compile the package for
-     a different kind of computer), type `make distclean'.  There is
-     also a `make maintainer-clean' target, but that is intended mainly
-     for the package's developers.  If you use it, you may have to get
-     all sorts of other programs in order to regenerate files that came
-     with the distribution.
-
-  7. Often, you can also type `make uninstall' to remove the installed
-     files again.  In practice, not all packages have tested that
-     uninstallation works correctly, even though it is required by the
-     GNU Coding Standards.
-
-  8. Some packages, particularly those that use Automake, provide `make
-     distcheck', which can by used by developers to test that all other
-     targets like `make install' and `make uninstall' work correctly.
-     This target is generally not run by end users.
-
-Compilers and Options
-=====================
-
-   Some systems require unusual options for compilation or linking that
-the `configure' script does not know about.  Run `./configure --help'
-for details on some of the pertinent environment variables.
-
-   You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment.  Here
-is an example:
-
-     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
-
-   *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
-   You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory.  To do this, you can use GNU `make'.  `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.  This
-is known as a "VPATH" build.
-
-   With a non-GNU `make', it is safer to compile the package for one
-architecture at a time in the source code directory.  After you have
-installed the package for one architecture, use `make distclean' before
-reconfiguring for another architecture.
-
-   On MacOS X 10.5 and later systems, you can create libraries and
-executables that work on multiple system types--known as "fat" or
-"universal" binaries--by specifying multiple `-arch' options to the
-compiler but only a single `-arch' option to the preprocessor.  Like
-this:
-
-     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
-                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
-                 CPP="gcc -E" CXXCPP="g++ -E"
-
-   This is not guaranteed to produce working output in all cases, you
-may have to build one architecture at a time and combine the results
-using the `lipo' tool if you have problems.
-
-Installation Names
-==================
-
-   By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc.  You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX', where PREFIX must be an
-absolute file name.
-
-   You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files.  If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
-PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files still use the regular prefix.
-
-   In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.  In general, the
-default for these options is expressed in terms of `${prefix}', so that
-specifying just `--prefix' will affect all of the other directory
-specifications that were not explicitly provided.
-
-   The most portable way to affect installation locations is to pass the
-correct locations to `configure'; however, many packages provide one or
-both of the following shortcuts of passing variable assignments to the
-`make install' command line to change installation locations without
-having to reconfigure or recompile.
-
-   The first method involves providing an override variable for each
-affected directory.  For example, `make install
-prefix=/alternate/directory' will choose an alternate location for all
-directory configuration variables that were expressed in terms of
-`${prefix}'.  Any directories that were specified during `configure',
-but not in terms of `${prefix}', must each be overridden at install
-time for the entire installation to be relocated.  The approach of
-makefile variable overrides for each directory variable is required by
-the GNU Coding Standards, and ideally causes no recompilation.
-However, some platforms have known limitations with the semantics of
-shared libraries that end up requiring recompilation when using this
-method, particularly noticeable in packages that use GNU Libtool.
-
-   The second method involves providing the `DESTDIR' variable.  For
-example, `make install DESTDIR=/alternate/directory' will prepend
-`/alternate/directory' before all installation names.  The approach of
-`DESTDIR' overrides is not required by the GNU Coding Standards, and
-does not work on platforms that have drive letters.  On the other hand,
-it does better at avoiding recompilation issues, and works well even
-when some directory options were not specified in terms of `${prefix}'
-at `configure' time.
-
-Optional Features
-=================
-
-   If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-   Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
-   For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-   Some packages offer the ability to configure how verbose the
-execution of `make' will be.  For these packages, running `./configure
---enable-silent-rules' sets the default to minimal output, which can be
-overridden with `make V=1'; while running `./configure
---disable-silent-rules' sets the default to verbose, which can be
-overridden with `make V=0'.
-
-Particular systems
-==================
-
-   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
-CC is not installed, it is recommended to use the following options in
-order to use an ANSI C compiler:
-
-     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
-
-and if that doesn't work, install pre-built binaries of GCC for HP-UX.
-
-   HP-UX `make' updates targets which have the same time stamps as
-their prerequisites, which makes it generally unusable when shipped
-generated files such as `configure' are involved.  Use GNU `make'
-instead.
-
-   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
-parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
-a workaround.  If GNU CC is not installed, it is therefore recommended
-to try
-
-     ./configure CC="cc"
-
-and if that doesn't work, try
-
-     ./configure CC="cc -nodtk"
-
-   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This
-directory contains several dysfunctional programs; working variants of
-these programs are available in `/usr/bin'.  So, if you need `/usr/ucb'
-in your `PATH', put it _after_ `/usr/bin'.
-
-   On Haiku, software installed for all users goes in `/boot/common',
-not `/usr/local'.  It is recommended to use the following options:
-
-     ./configure --prefix=/boot/common
-
-Specifying the System Type
-==========================
-
-   There may be some features `configure' cannot figure out
-automatically, but needs to determine by the type of machine the package
-will run on.  Usually, assuming the package is built to be run on the
-_same_ architectures, `configure' can figure that out, but if it prints
-a message saying it cannot guess the machine type, give it the
-`--build=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
-     CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
-     OS
-     KERNEL-OS
-
-   See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
-   If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
-produce code for.
-
-   If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
-   If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
-   Variables not defined in a site shell script can be set in the
-environment passed to `configure'.  However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost.  In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'.  For example:
-
-     ./configure CC=/usr/local2/bin/gcc
-
-causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).
-
-Unfortunately, this technique does not work for `CONFIG_SHELL' due to
-an Autoconf limitation.  Until the limitation is lifted, you can use
-this workaround:
-
-     CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
-
-`configure' Invocation
-======================
-
-   `configure' recognizes the following options to control how it
-operates.
-
-`--help'
-`-h'
-     Print a summary of all of the options to `configure', and exit.
-
-`--help=short'
-`--help=recursive'
-     Print a summary of the options unique to this package's
-     `configure', and exit.  The `short' variant lists options used
-     only in the top level, while the `recursive' variant lists options
-     also present in any nested packages.
-
-`--version'
-`-V'
-     Print the version of Autoconf used to generate the `configure'
-     script, and exit.
-
-`--cache-file=FILE'
-     Enable the cache: use and save the results of the tests in FILE,
-     traditionally `config.cache'.  FILE defaults to `/dev/null' to
-     disable caching.
-
-`--config-cache'
-`-C'
-     Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
-     Do not print messages saying which checks are being made.  To
-     suppress all normal output, redirect it to `/dev/null' (any error
-     messages will still be shown).
-
-`--srcdir=DIR'
-     Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
-
-`--prefix=DIR'
-     Use DIR as the installation prefix.  *note Installation Names::
-     for more details, including other options available for fine-tuning
-     the installation locations.
-
-`--no-create'
-`-n'
-     Run the configure checks, but stop before creating any output
-     files.
-
-`configure' also accepts some other, not widely useful, options.  Run
-`configure --help' for more details.
index e511a36..7e42185 100644 (file)
@@ -1,9 +1,16 @@
-include Makefile.am.inc
+EXTRA_DIST = README.md README.html
+EXTRA_DIST += config.h.win32
+EXTRA_DIST += Doxyfile
+EXTRA_DIST += issues_closed_for_0.13.md
+
+dist-hook:
+       test -d "$(distdir)/doc" || mkdir "$(distdir)/doc"
+       chmod -R u+w "$(distdir)/doc"
+       cd "$(distdir)" && doxygen
 
-EXTRA_DIST = README.html README-WIN32.html config.h.win32 doc json-c.vcproj
 SUBDIRS = . tests
 
-lib_LTLIBRARIES = libjson-c.la 
+lib_LTLIBRARIES = libjson-c.la
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = json-c.pc
@@ -14,24 +21,28 @@ libjson_cinclude_HEADERS = \
        bits.h \
        debug.h \
        json.h \
-       json_config.h \
        json_c_version.h \
+       json_config.h \
        json_inttypes.h \
        json_object.h \
        json_object_iterator.h \
-       json_object_private.h \
+       json_pointer.h \
        json_tokener.h \
        json_util.h \
+       json_visit.h \
        linkhash.h \
-       printbuf.h \
-       random_seed.h
+       printbuf.h
 
-#libjsonx_includedir = $(libdir)/json-c-@VERSION@
-#
-#libjsonx_include_HEADERS = \
-#      json_config.h
+noinst_HEADERS=\
+       json_object_private.h \
+       math_compat.h \
+       strdup_compat.h \
+       snprintf_compat.h \
+       vasprintf_compat.h \
+       random_seed.h \
+       strerror_override.h
 
-libjson_c_la_LDFLAGS = -version-info 2:2:0 -no-undefined @JSON_BSYMBOLIC_LDFLAGS@
+libjson_c_la_LDFLAGS = -version-info 3:1:0 -no-undefined @JSON_BSYMBOLIC_LDFLAGS@
 
 libjson_c_la_SOURCES = \
        arraylist.c \
@@ -39,20 +50,53 @@ libjson_c_la_SOURCES = \
        json_c_version.c \
        json_object.c \
        json_object_iterator.c \
+       json_pointer.c \
        json_tokener.c \
        json_util.c \
+       json_visit.c \
        linkhash.c \
        printbuf.c \
-       random_seed.c
+       random_seed.c \
+       strerror_override.c \
+       strerror_override_private.h
+
 
+DISTCLEANFILES=
+DISTCLEANFILES+= \
+       config.h \
+       json-c-uninstalled.pc \
+       json-c.pc \
+       json_config.h
 
 distclean-local:
        -rm -rf $(testsubdir)
-       -rm -rf config.h.in~ Makefile.in aclocal.m4 autom4te.cache/ config.guess config.sub depcomp install-sh ltmain.sh missing
-       -rm -f INSTALL test-driver tests/Makefile.in compile
 
-maintainer-clean-local:
-       -rm -rf configure
+JSON_CLEANFILES=
+JSON_CLEANFILES+= \
+       Makefile.in \
+       aclocal.m4 \
+       autom4te.cache/ \
+       compile \
+       config.guess \
+       config.h.in \
+       config.sub \
+       configure \
+       depcomp \
+       install-sh \
+       ltmain.sh \
+       missing \
+       test-driver \
+       tests/Makefile.in
+JSON_CLEANFILES+= \
+       libtool \
+       stamp-h1 \
+       stamp-h2
+
+# There's no built-in way to remove these after all the other
+# maintainer-clean steps happen, so do it explicitly here.
+really-clean:
+       $(MAKE) maintainer-clean
+       rm -rf ${JSON_CLEANFILES}
 
 uninstall-local:
        rm -rf "$(DESTDIR)@includedir@/json-c"
diff --git a/Makefile.am.inc b/Makefile.am.inc
deleted file mode 100644 (file)
index fec591b..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-AM_CFLAGS = -Wall -Werror -Wno-error=deprecated-declarations -Wextra -Wwrite-strings -Wno-unused-parameter -std=gnu99 -D_GNU_SOURCE -D_REENTRANT
-
index b4493b5..ce9e799 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 
 VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -91,13 +81,23 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 subdir = .
+DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \
+       $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+       $(top_srcdir)/configure $(am__configure_deps) \
+       $(srcdir)/config.h.in $(srcdir)/json_config.h.in \
+       $(srcdir)/json-c.pc.in $(srcdir)/json-c-uninstalled.pc.in \
+       depcomp $(libjson_cinclude_HEADERS) $(noinst_HEADERS) COPYING \
+       compile config.guess config.sub install-sh missing ltmain.sh
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__aclocal_m4_deps =  \
+       $(top_srcdir)/autoconf-archive/m4/ax_append_compile_flags.m4 \
+       $(top_srcdir)/autoconf-archive/m4/ax_append_flag.m4 \
+       $(top_srcdir)/autoconf-archive/m4/ax_check_compile_flag.m4 \
+       $(top_srcdir)/autoconf-archive/m4/ax_compile_check_sizeof.m4 \
+       $(top_srcdir)/autoconf-archive/m4/ax_require_defined.m4 \
+       $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
-       $(am__configure_deps) $(libjson_cinclude_HEADERS) \
-       $(am__DIST_COMMON)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
  configure.lineno config.status.lineno
 mkinstalldirs = $(install_sh) -d
@@ -136,8 +136,9 @@ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" \
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libjson_c_la_LIBADD =
 am_libjson_c_la_OBJECTS = arraylist.lo debug.lo json_c_version.lo \
-       json_object.lo json_object_iterator.lo json_tokener.lo \
-       json_util.lo linkhash.lo printbuf.lo random_seed.lo
+       json_object.lo json_object_iterator.lo json_pointer.lo \
+       json_tokener.lo json_util.lo json_visit.lo linkhash.lo \
+       printbuf.lo random_seed.lo strerror_override.lo
 libjson_c_la_OBJECTS = $(am_libjson_c_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -196,7 +197,7 @@ am__can_run_installinfo = \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
 DATA = $(pkgconfig_DATA)
-HEADERS = $(libjson_cinclude_HEADERS)
+HEADERS = $(libjson_cinclude_HEADERS) $(noinst_HEADERS)
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
   distclean-recursive maintainer-clean-recursive
 am__recursive_targets = \
@@ -227,11 +228,6 @@ ETAGS = etags
 CTAGS = ctags
 CSCOPE = cscope
 DIST_SUBDIRS = $(SUBDIRS)
-am__DIST_COMMON = $(srcdir)/Makefile.am.inc $(srcdir)/Makefile.in \
-       $(srcdir)/config.h.in $(srcdir)/json-c-uninstalled.pc.in \
-       $(srcdir)/json-c.pc.in $(srcdir)/json_config.h.in AUTHORS \
-       COPYING ChangeLog INSTALL NEWS README compile config.guess \
-       config.sub depcomp install-sh ltmain.sh missing
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
@@ -389,10 +385,10 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CFLAGS = -Wall -Werror -Wno-error=deprecated-declarations -Wextra -Wwrite-strings -Wno-unused-parameter -std=gnu99 -D_GNU_SOURCE -D_REENTRANT
-EXTRA_DIST = README.html README-WIN32.html config.h.win32 doc json-c.vcproj
+EXTRA_DIST = README.md README.html config.h.win32 Doxyfile \
+       issues_closed_for_0.13.md
 SUBDIRS = . tests
-lib_LTLIBRARIES = libjson-c.la 
+lib_LTLIBRARIES = libjson-c.la
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = json-c.pc
 libjson_cincludedir = $(includedir)/json-c
@@ -401,36 +397,50 @@ libjson_cinclude_HEADERS = \
        bits.h \
        debug.h \
        json.h \
-       json_config.h \
        json_c_version.h \
+       json_config.h \
        json_inttypes.h \
        json_object.h \
        json_object_iterator.h \
-       json_object_private.h \
+       json_pointer.h \
        json_tokener.h \
        json_util.h \
+       json_visit.h \
        linkhash.h \
-       printbuf.h \
-       random_seed.h
+       printbuf.h
 
-
-#libjsonx_includedir = $(libdir)/json-c-@VERSION@
-#
-#libjsonx_include_HEADERS = \
-#      json_config.h
-libjson_c_la_LDFLAGS = -version-info 2:2:0 -no-undefined @JSON_BSYMBOLIC_LDFLAGS@
+noinst_HEADERS = \
+       json_object_private.h \
+       math_compat.h \
+       strdup_compat.h \
+       snprintf_compat.h \
+       vasprintf_compat.h \
+       random_seed.h \
+       strerror_override.h
+
+libjson_c_la_LDFLAGS = -version-info 3:1:0 -no-undefined @JSON_BSYMBOLIC_LDFLAGS@
 libjson_c_la_SOURCES = \
        arraylist.c \
        debug.c \
        json_c_version.c \
        json_object.c \
        json_object_iterator.c \
+       json_pointer.c \
        json_tokener.c \
        json_util.c \
+       json_visit.c \
        linkhash.c \
        printbuf.c \
-       random_seed.c
-
+       random_seed.c \
+       strerror_override.c \
+       strerror_override_private.h
+
+DISTCLEANFILES = config.h json-c-uninstalled.pc json-c.pc \
+       json_config.h
+JSON_CLEANFILES = Makefile.in aclocal.m4 autom4te.cache/ compile \
+       config.guess config.h.in config.sub configure depcomp \
+       install-sh ltmain.sh missing test-driver tests/Makefile.in \
+       libtool stamp-h1 stamp-h2
 ANDROID_CFLAGS = -I$(top_srcdir) -DHAVE_CONFIG_H
 all: config.h json_config.h
        $(MAKE) $(AM_MAKEFLAGS) all-recursive
@@ -439,7 +449,7 @@ all: config.h json_config.h
 .SUFFIXES: .c .lo .o .obj
 am--refresh: Makefile
        @:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.am.inc $(am__configure_deps)
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        @for dep in $?; do \
          case '$(am__configure_deps)' in \
            *$$dep*) \
@@ -452,6 +462,7 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.am.inc $(am__co
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnu Makefile
+.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -461,7 +472,6 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
            echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
            cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
        esac;
-$(srcdir)/Makefile.am.inc $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        $(SHELL) ./config.status --recheck
@@ -548,11 +558,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_c_version.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_object.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_object_iterator.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_pointer.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_tokener.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_util.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_visit.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linkhash.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printbuf.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random_seed.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror_override.Plo@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -789,6 +802,9 @@ distdir: $(DISTFILES)
              || exit 1; \
          fi; \
        done
+       $(MAKE) $(AM_MAKEFLAGS) \
+         top_distdir="$(top_distdir)" distdir="$(distdir)" \
+         dist-hook
        -test -n "$(am__skip_mode_fix)" \
        || find "$(distdir)" -type d ! -perm -755 \
                -exec chmod u+rwx,go+rx {} \; -o \
@@ -813,15 +829,15 @@ dist-xz: distdir
        $(am__post_remove_distdir)
 
 dist-tarZ: distdir
-       @echo WARNING: "Support for distribution archives compressed with" \
-                      "legacy program 'compress' is deprecated." >&2
+       @echo WARNING: "Support for shar distribution archives is" \
+                      "deprecated." >&2
        @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
        tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
        $(am__post_remove_distdir)
 
 dist-shar: distdir
-       @echo WARNING: "Support for shar distribution archives is" \
-                      "deprecated." >&2
+       @echo WARNING: "Support for distribution archives compressed with" \
+                      "legacy program 'compress' is deprecated." >&2
        @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
        shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
        $(am__post_remove_distdir)
@@ -857,17 +873,17 @@ distcheck: dist
        esac
        chmod -R a-w $(distdir)
        chmod u+w $(distdir)
-       mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+       mkdir $(distdir)/_build $(distdir)/_inst
        chmod a-w $(distdir)
        test -d $(distdir)/_build || exit 0; \
        dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
          && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
          && am__cwd=`pwd` \
-         && $(am__cd) $(distdir)/_build/sub \
-         && ../../configure \
+         && $(am__cd) $(distdir)/_build \
+         && ../configure \
            $(AM_DISTCHECK_CONFIGURE_FLAGS) \
            $(DISTCHECK_CONFIGURE_FLAGS) \
-           --srcdir=../.. --prefix="$$dc_install_base" \
+           --srcdir=.. --prefix="$$dc_install_base" \
          && $(MAKE) $(AM_MAKEFLAGS) \
          && $(MAKE) $(AM_MAKEFLAGS) dvi \
          && $(MAKE) $(AM_MAKEFLAGS) check \
@@ -955,6 +971,7 @@ clean-generic:
 distclean-generic:
        -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
        -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
        @echo "This command is intended for maintainers to use"
@@ -1016,8 +1033,7 @@ maintainer-clean: maintainer-clean-recursive
        -rm -rf $(top_srcdir)/autom4te.cache
        -rm -rf ./$(DEPDIR)
        -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic \
-       maintainer-clean-local
+maintainer-clean-am: distclean-am maintainer-clean-generic
 
 mostlyclean: mostlyclean-recursive
 
@@ -1041,9 +1057,9 @@ uninstall-am: uninstall-libLTLIBRARIES \
 .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
        am--refresh check check-am clean clean-cscope clean-generic \
        clean-libLTLIBRARIES clean-libtool cscope cscopelist-am ctags \
-       ctags-am dist dist-all dist-bzip2 dist-gzip dist-lzip \
-       dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \
-       distclean-compile distclean-generic distclean-hdr \
+       ctags-am dist dist-all dist-bzip2 dist-gzip dist-hook \
+       dist-lzip dist-shar dist-tarZ dist-xz dist-zip distcheck \
+       distclean distclean-compile distclean-generic distclean-hdr \
        distclean-libtool distclean-local distclean-tags \
        distcleancheck distdir distuninstallcheck dvi dvi-am html \
        html-am info info-am install install-am install-data \
@@ -1054,22 +1070,26 @@ uninstall-am: uninstall-libLTLIBRARIES \
        install-pdf-am install-pkgconfigDATA install-ps install-ps-am \
        install-strip installcheck installcheck-am installdirs \
        installdirs-am maintainer-clean maintainer-clean-generic \
-       maintainer-clean-local mostlyclean mostlyclean-compile \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES \
+       mostlyclean mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+       uninstall-am uninstall-libLTLIBRARIES \
        uninstall-libjson_cincludeHEADERS uninstall-local \
        uninstall-pkgconfigDATA
 
-.PRECIOUS: Makefile
 
+dist-hook:
+       test -d "$(distdir)/doc" || mkdir "$(distdir)/doc"
+       chmod -R u+w "$(distdir)/doc"
+       cd "$(distdir)" && doxygen
 
 distclean-local:
        -rm -rf $(testsubdir)
-       -rm -rf config.h.in~ Makefile.in aclocal.m4 autom4te.cache/ config.guess config.sub depcomp install-sh ltmain.sh missing
-       -rm -f INSTALL test-driver tests/Makefile.in compile
 
-maintainer-clean-local:
-       -rm -rf configure
+# There's no built-in way to remove these after all the other
+# maintainer-clean steps happen, so do it explicitly here.
+really-clean:
+       $(MAKE) maintainer-clean
+       rm -rf ${JSON_CLEANFILES}
 
 uninstall-local:
        rm -rf "$(DESTDIR)@includedir@/json-c"
diff --git a/NEWS b/NEWS
index e69de29..5798fb4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -0,0 +1 @@
+See the git repo.
diff --git a/README b/README
index 8c7301f..e257745 100644 (file)
--- a/README
+++ b/README
@@ -1,45 +1 @@
-Building on Unix with git, gcc and autotools
-
-Home page for json-c:
-  https://github.com/json-c/json-c/wiki
-
-  Caution: do NOT use sources from svn.metaparadigm.com, they are old.
-
-Prerequisites:
-       gcc (or another C compiler)
-       libtool
-
-       If you're not using a release tarball, you'll also need:
-       autoconf (autoreconf)
-       automake
-       Make sure you have a complete libtool install, including libtoolize
-
-Github repo for json-c:
-  https://github.com/json-c/json-c
-
-    $ git clone https://github.com/json-c/json-c.git
-    $ cd json-c
-    $ sh autogen.sh
-
-Then 
-
-    $ ./configure
-    $ make
-    $ make install
-
-To build and run the test programs run 
-
-    $ make check
-
-Linking to libjson-c
-
-If your system has pkgconfig then you can just add this to your makefile
-
-CFLAGS += $(shell pkg-config --cflags json-c)
-LDFLAGS += $(shell pkg-config --libs json-c)
-
-Without pkgconfig, you would do something like this:
-
-JSON_C_DIR=/path/to/json_c/install
-CFLAGS += -I$(JSON_C_DIR)/include/json-c
-LDFLAGS+= -L$(JSON_C_DIR)/lib -ljson-c
+See README.md or README.html
diff --git a/README-WIN32.html b/README-WIN32.html
deleted file mode 100644 (file)
index abdb39e..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\r
-       <head>\r
-               <title>JSON-C - A JSON implementation in C - Win32 specific notes</title>\r
-               <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
-       </head>\r
-       <body>\r
-               <h2>Windows specific notes for JSON-C</h2>\r
-               <p>Please send Win32 bug reports to <a href="mailto:christopher.watford@gmail.com">christopher.watford@gmail.com</a></p>\r
-               <p><b>Win32 Specific Changes:</b></p>\r
-               <ul>\r
-                       <li>\r
-                               Various functions have been redefined to their Win32 version (i.e. <tt>open</tt>\r
-                               on win32 is <tt>_open</tt>)</li>\r
-                       <li>\r
-                               Implemented missing functions from MS's libc (i.e. <tt>vasprintf</tt>)</li>\r
-                       <li>\r
-                               Added code to allow Win64 support without integer resizing issues, this \r
-                               probably makes it much nicer on 64bit machines everywhere (i.e. using <tt>ptrdiff_t</tt>\r
-                               for pointer math)</li>\r
-               </ul>\r
-               <p><b>Porting Changelog:</b></p>\r
-               <dl>\r
-                       <dt><tt>printbuf.c</tt> - C. Watford (christopher.watford@gmail.com)</dt>\r
-                       <dd>\r
-                               Added a Win32/Win64 compliant implementation of <tt>vasprintf</tt></dd>\r
-                       <dt><tt>debug.c</tt> - C. Watford (christopher.watford@gmail.com)</dt>\r
-                       <dd>\r
-                               Removed usage of <tt>vsyslog</tt> on Win32/Win64 systems, needs to be handled \r
-                               by a configure script</dd>\r
-                       <dt><tt>json_object.c</tt> - C. Watford (christopher.watford@gmail.com)</dt>\r
-                       <dd>\r
-                               Added scope operator to wrap usage of <tt>json_object_object_foreach</tt>, this needs to be\r
-                               rethought to be more ANSI C friendly</dd>\r
-                       <dt><tt>json_object.h</tt> - C. Watford (christopher.watford@gmail.com)</dt>\r
-                       <dd>\r
-                               Added Microsoft C friendly version of <tt>json_object_object_foreach</tt></dd>\r
-                       <dt><tt>json_tokener.c</tt> - C. Watford (christopher.watford@gmail.com)</dt>\r
-                       <dd>\r
-                               Added a Win32/Win64 compliant implementation of <tt>strndup</tt></dd>\r
-                       <dt><tt>json_util.c</tt> - C. Watford (christopher.watford@gmail.com)</dt>\r
-                       <dd>\r
-                               Added cast and mask to suffice <tt>size_t</tt> v. <tt>unsigned int</tt>\r
-                               conversion correctness</dd>\r
-               </dl>\r
-               <p>This program is free software; you can redistribute it and/or modify it under \r
-                       the terms of the MIT License. See COPYING for details.</p>\r
-               <hr />\r
-       </body>\r
-</html>\r
index dc696af..d361569 100644 (file)
                <h3>Overview</h3>
                <p>JSON-C implements a reference counting object model that allows you to easily 
                construct JSON objects in C, output them as JSON formatted strings and parse 
-               JSON formatted strings back into the C representation of JSON objects.</p>
+               JSON formatted strings back into the C representation of JSON objects.
+               It aims to conform to <a href="https://tools.ietf.org/html/rfc7159">RFC 7159</a>.
+               </p>
 
                <h3>Building</h3>
                <p>To setup JSON-C to build on your system please run <tt>configure</tt> and <tt>make</tt>.</p>
-               <p>If you are on Win32 and are not using the VS project file, be sure 
-               to rename <tt>config.h.win32</tt> to <tt>config.h</tt> before building.</p>
+               <p>If you are on Win32 cmake is required, generally:</p>
+               <ul>
+               <li>mkdir build</li>
+               <li>cd build</li>
+               <li>cmake ..</li>
+               <li>msbuild "json-c.vcxproj" /m /verbosity:normal /p:OutDir=lib\</li>
+               <li>Or, open the project in Visual Studio</li>
+               </ul>
 
                <h3>Documentation</h3>
                <P>Doxygen generated documentation exists <a href="doc/html/json__object_8h.html">here</a>
@@ -28,7 +36,7 @@
                 <pi>Send email to <strong><code>json-c <i>&lt;at&gt;</i> googlegroups <i>&lt;dot&gt;</i> com</code></strong></p>
 
                <h3><a href="COPYING">License</a></h3>
-               <p>This program is free software; you can redistribute it and/or modify it under the terms of the MIT License..</p>
+               <p>This program is free software; you can redistribute it and/or modify it under the terms of the MIT License.</p>
                <hr/>
        </body>
 </html>
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..1441e93
--- /dev/null
+++ b/README.md
@@ -0,0 +1,173 @@
+`json-c`                       {#mainpage}
+========
+
+1. [Overview and Build Status](#overview)
+2. [Building on Unix](#buildunix)
+3. [Install Prerequisites](#installprereq)
+4. [Building with partial threading support](#buildthreaded)
+5. [Linking to libjson-c](#linking)
+6. [Using json-c](#using)
+
+JSON-C - A JSON implementation in C <a name="overview"></a>
+-----------------------------------
+
+Build Status
+* [AppVeyor Build](https://ci.appveyor.com/project/hawicz/json-c) ![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/json-c/json-c?branch=master&svg=true)
+* [Travis Build](https://travis-ci.org/json-c/json-c) ![Travis Build Status](https://travis-ci.org/json-c/json-c.svg?branch=master)
+
+JSON-C implements a reference counting object model that allows you to easily 
+construct JSON objects in C, output them as JSON formatted strings and parse 
+JSON formatted strings back into the C representation of JSON objects.
+It aims to conform to [RFC 7159](https://tools.ietf.org/html/rfc7159).
+
+
+Building on Unix with `git`, `gcc` and `autotools` <a name="buildunix"></a>
+--------------------------------------------------
+
+Home page for json-c: https://github.com/json-c/json-c/wiki
+
+### Prerequisites:
+
+See also the "Installing prerequisites" section below.
+
+ - `gcc`, `clang`, or another C compiler
+ - `libtool>=2.2.6b`
+
+If you're not using a release tarball, you'll also need:
+
+ - `autoconf>=2.64` (`autoreconf`)
+ - `automake>=1.13`
+
+Make sure you have a complete `libtool` install, including `libtoolize`.
+
+To generate docs (e.g. as part of make distcheck) you'll also need:
+ - `doxygen>=1.8.13`
+
+### Build instructions:
+
+`json-c` GitHub repo: https://github.com/json-c/json-c
+
+```sh
+$ git clone https://github.com/json-c/json-c.git
+$ cd json-c
+$ sh autogen.sh
+```
+
+followed by
+
+```sh
+$ ./configure  # --enable-threading
+$ make
+$ make install
+```
+
+To build and run the test programs:
+
+```sh
+$ make check
+$ make USE_VALGRIND=0 check   # optionally skip using valgrind
+```
+
+Install prerequisites <a name="installprereq"></a>
+-----------------------
+
+If you are on a relatively modern system, you'll likely be able to install
+the prerequisites using your OS's packaging system.  
+
+### Install using apt (e.g. Ubuntu 16.04.2 LTS)
+```sh
+sudo apt install git
+sudo apt install autoconf automake libtool
+sudo apt install valgrind # optional
+```
+
+Then start from the "git clone" command, above.
+
+### Manually install and build autoconf, automake and libtool
+
+For older OS's that don't have up-to-date version of the packages will
+require a bit more work. For example, CentOS release 5.11, etc...
+
+```sh
+curl -O http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
+curl -O http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz
+curl -O http://ftp.gnu.org/gnu/libtool/libtool-2.2.6b.tar.gz
+
+tar xzf autoconf-2.69.tar.gz
+tar xzf automake-1.15.tar.gz
+tar xzf libtool-2.2.6b.tar.gz
+
+export PATH=${HOME}/ac_install/bin:$PATH
+
+(cd autoconf-2.69 && \
+  ./configure --prefix ${HOME}/ac_install && \
+  make && \
+  make install)
+
+(cd automake-1.15 && \
+  ./configure --prefix ${HOME}/ac_install && \
+  make && \
+  make install)
+
+(cd libtool-2.2.6b && \
+  ./configure --prefix ${HOME}/ac_install && \
+  make && \
+  make install)
+```
+
+
+Building with partial threading support <a name="buildthreaded"></a>
+----------------------------------------
+
+Although json-c does not support fully multi-threaded access to
+object trees, it has some code to help make use in threaded programs
+a bit safer.  Currently, this is limited to using atomic operations for
+json_object_get() and json_object_put().
+
+Since this may have a performance impact, of at least 3x slower
+according to https://stackoverflow.com/a/11609063, it is disabled by
+default.  You may turn it on by adjusting your configure command with:
+   --enable-threading
+
+Separately, the default hash function used for object field keys,
+lh_char_hash, uses a compare-and-swap operation to ensure the randomly
+seed is only generated once.  Because this is a one-time operation, it
+is always compiled in when the compare-and-swap operation is available.
+
+
+Linking to `libjson-c` <a name="linking">
+----------------------
+
+If your system has `pkgconfig`,
+then you can just add this to your `makefile`:
+
+```make
+CFLAGS += $(shell pkg-config --cflags json-c)
+LDFLAGS += $(shell pkg-config --libs json-c)
+```
+
+Without `pkgconfig`, you would do something like this:
+
+```make
+JSON_C_DIR=/path/to/json_c/install
+CFLAGS += -I$(JSON_C_DIR)/include/json-c
+LDFLAGS+= -L$(JSON_C_DIR)/lib -ljson-c
+```
+
+
+Using json-c <a name="using">
+------------
+
+To use json-c you can either include json.h, or preferrably, one of the
+following more specific header files:
+
+* json_object.h  - Core types and methods.
+* json_tokener.h - Methods for parsing and serializing json-c object trees.
+* json_pointer.h - JSON Pointer (RFC 6901) implementation for retrieving
+                   objects from a json-c object tree.
+* json_object_iterator.h - Methods for iterating over single json_object instances.
+* json_visit.h   - Methods for walking a tree of json-c objects.
+* json_util.h    - Miscelleanous utility functions.
+
+For a full list of headers see [files.html](files.html)
+
index 0bb2b77..28cb973 100644 (file)
@@ -1,13 +1,15 @@
 
 Release checklist:
 
-release=0.12
+release=0.13
 git clone https://github.com/json-c/json-c json-c-${release}
 cd json-c-${release}
 
 Check that the compile works on Linux
 Check that the compile works on NetBSD
 Check that the compile works on Windows
+Run "make distcheck" and fix any problems
+        (e.g. adding new files to SOURCES variables in Makefile.am)
 Check ChangeLog to see if anything should be added.
 Make any fixes/changes *before* branching.
 
@@ -18,7 +20,8 @@ Make any fixes/changes *before* branching.
 
 Update the version in json_c_version.h
 Update the version in Doxyfile
-Update the version in configure.in
+Update the version in configure.ac
+Update the version in CMakeLists.txt
        Use ${release}.
 
 Update the libjson_la_LDFLAGS line in Makefile.am to the new version.
@@ -31,7 +34,7 @@ Update the libjson_la_LDFLAGS line in Makefile.am to the new version.
 
 Generate the configure script and other files:
   sh autogen.sh
-  git add -f Makefile.in aclocal.m4 config.guess \
+  git add -f Makefile.in aclocal.m4 config.guess config.h.in \
        config.sub configure depcomp install-sh \
        ltmain.sh missing tests/Makefile.in \
        INSTALL
@@ -85,7 +88,8 @@ git checkout master
 Add new section to ChangeLog
 Update the version in json_c_version.h
 Update the version in Doxyfile
-Update the version in configure.in
+Update the version in configure.ac
+Update the version in CMakeLists.txt
     Use ${release}.99 to indicate a version "newer" than anything on the branch.
 
 Leave the libjson_la_LDFLAGS line in Makefile.am alone.
@@ -111,6 +115,21 @@ git commit
 vi index.html
     Add/change links to current release.
 
+git commit index.html
+
+git push
+
+------------
+
+Update checksums on wiki page.
+
+cd ..
+openssl sha -sha256 json-c*gz
+openssl md5 json-c*gz
+
+Copy and paste this output into the wiki page at:
+       https://github.com/json-c/json-c/wiki
+
 ------------
 
 Send an email to the mailing list.
diff --git a/STYLE.txt b/STYLE.txt
new file mode 100755 (executable)
index 0000000..e5acd14
--- /dev/null
+++ b/STYLE.txt
@@ -0,0 +1,31 @@
+In general:\r
+For minor changes to a function, copy the existing formatting.\r
+When changing the style, commit that separately from other changes.\r
+For new code and major changes to a function, switch to the official json-c style.\r
+\r
+Official json-c style:\r
+Aim for readability, not strict conformance to fixed style rules.\r
+These rules are not comprehensive.  Look to existing code for guidelines.\r
+Indentation is tab based, with continuations of long lines starting with tabs then spaces for alignment.\r
+Try to line up components of continuation lines with corresponding part of the line above (i.e. "indent -lp" effect), but avoid excessive identation tha causes extra line wraps. \r
+ e.g. (T=tab, S=space):\r
+TTTTsome_long_func_call(arg1, arg2,\r
+TTTTSSSSSSSSSSSSSSSSSSSarg3, arg4);\r
+TTTTsome_reallly_really_long_func_name(arg1,\r
+TTTTTarg2, arg3, arg4);\r
+There should be a space between "if"/"while" and the following parenthesis.\r
+"case" lines are indented at the same level as the "switch" statement.\r
+Commas are followed by a single space.\r
+Include spaces around most non-unary, non-postfix operators, "=", "==', "&", "||", etc...\r
+Function calls have no space between the name and the parenthesis.\r
+Curly braces go on their own line.\r
+Curly braces may be omitted.\r
+\r
+Naming:\r
+Words within function and variable names are separated with underscores.  Avoid camel case.\r
+Prefer longer, more descriptive names, but not excessively so.  No single letter variable names.\r
+\r
+Other:\r
+Variables should be defined for the smallest scope needed.\r
+Functions should be defined static when possible.\r
+When possible, avoid exposing internals in the public API.\r
index b1a1c06..e9374cc 100644 (file)
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.15 -*- Autoconf -*-
+# generated automatically by aclocal 1.14.1 -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1326,7 +1326,7 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
   # Find out which ABI we are using.
   echo 'int i;' > conftest.$ac_ext
@@ -1338,9 +1338,19 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
            LD="${LD-ld} -m elf_i386_fbsd"
            ;;
          x86_64-*linux*)
-           LD="${LD-ld} -m elf_i386"
+           case `/usr/bin/file conftest.o` in
+             *x86-64*)
+               LD="${LD-ld} -m elf32_x86_64"
+               ;;
+             *)
+               LD="${LD-ld} -m elf_i386"
+               ;;
+           esac
+           ;;
+         powerpc64le-*)
+           LD="${LD-ld} -m elf32lppclinux"
            ;;
-         ppc64-*linux*|powerpc64-*linux*)
+         powerpc64-*)
            LD="${LD-ld} -m elf32ppclinux"
            ;;
          s390x-*linux*)
@@ -1359,7 +1369,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
          x86_64-*linux*)
            LD="${LD-ld} -m elf_x86_64"
            ;;
-         ppc*-*linux*|powerpc*-*linux*)
+         powerpcle-*)
+           LD="${LD-ld} -m elf64lppc"
+           ;;
+         powerpc-*)
            LD="${LD-ld} -m elf64ppc"
            ;;
          s390*-*linux*|s390*-*tpf*)
@@ -1702,7 +1715,8 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     ;;
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
@@ -2526,17 +2540,6 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
@@ -2653,7 +2656,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
@@ -2698,6 +2701,18 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu)
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
@@ -3257,10 +3272,6 @@ freebsd* | dragonfly*)
   fi
   ;;
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
 haiku*)
   lt_cv_deplibs_check_method=pass_all
   ;;
@@ -3299,11 +3310,11 @@ irix5* | irix6* | nonstopux*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-netbsd*)
+netbsd* | netbsdelf*-gnu)
   if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
   else
@@ -4051,7 +4062,7 @@ m4_if([$1], [CXX], [
            ;;
        esac
        ;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
        case $cc_basename in
          KCC*)
            # KAI C++ Compiler
@@ -4115,7 +4126,7 @@ m4_if([$1], [CXX], [
            ;;
        esac
        ;;
-      netbsd*)
+      netbsd* | netbsdelf*-gnu)
        ;;
       *qnx* | *nto*)
         # QNX uses GNU C++, but need to define -shared option too, otherwise
@@ -4350,7 +4361,7 @@ m4_if([$1], [CXX], [
       _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -4592,6 +4603,9 @@ m4_if([$1], [CXX], [
       ;;
     esac
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
   *)
     _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
     ;;
@@ -4654,6 +4668,9 @@ dnl Note also adjust exclude_expsyms for C++ above.
   openbsd*)
     with_gnu_ld=no
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
   esac
 
   _LT_TAGVAR(ld_shlibs, $1)=yes
@@ -4875,7 +4892,7 @@ _LT_EOF
       fi
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
        wlarc=
@@ -5052,6 +5069,7 @@ _LT_EOF
        if test "$aix_use_runtimelinking" = yes; then
          shared_flag="$shared_flag "'${wl}-G'
        fi
+       _LT_TAGVAR(link_all_deplibs, $1)=no
       else
        # not using gcc
        if test "$host_cpu" = ia64; then
@@ -5356,7 +5374,7 @@ _LT_EOF
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
       else
@@ -6232,9 +6250,6 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=yes
         ;;
 
-      gnu*)
-        ;;
-
       haiku*)
         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
@@ -6396,7 +6411,7 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(inherit_rpath, $1)=yes
         ;;
 
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
         case $cc_basename in
           KCC*)
            # Kuck and Associates, Inc. (KAI) C++ Compiler
@@ -8607,7 +8622,7 @@ m4_ifndef([_LT_PROG_F77],         [AC_DEFUN([_LT_PROG_F77])])
 m4_ifndef([_LT_PROG_FC],               [AC_DEFUN([_LT_PROG_FC])])
 m4_ifndef([_LT_PROG_CXX],              [AC_DEFUN([_LT_PROG_CXX])])
 
-# Copyright (C) 2002-2014 Free Software Foundation, Inc.
+# Copyright (C) 2002-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -8619,10 +8634,10 @@ m4_ifndef([_LT_PROG_CXX],               [AC_DEFUN([_LT_PROG_CXX])])
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.15'
+[am__api_version='1.14'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.15], [],
+m4_if([$1], [1.14.1], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -8638,14 +8653,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.15])dnl
+[AM_AUTOMAKE_VERSION([1.14.1])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -8697,7 +8712,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+# Copyright (C) 1997-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -8728,7 +8743,7 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -8919,7 +8934,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -8995,7 +9010,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9085,8 +9100,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
-# We need awk for the "check" target (and possibly the TAP driver).  The
-# system "awk" is bad on some platforms.
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
 AC_REQUIRE([AC_PROG_AWK])dnl
 AC_REQUIRE([AC_PROG_MAKE_SET])dnl
 AC_REQUIRE([AM_SET_LEADING_DOT])dnl
@@ -9160,9 +9175,6 @@ END
     AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
   fi
 fi
-dnl The trailing newline in this macro's definition is deliberate, for
-dnl backward compatibility and to allow trailing 'dnl'-style comments
-dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
 ])
 
 dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
@@ -9192,7 +9204,7 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9203,7 +9215,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co
 # Define $install_sh.
 AC_DEFUN([AM_PROG_INSTALL_SH],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh+set}" != xset; then
+if test x"${install_sh}" != xset; then
   case $am_aux_dir in
   *\ * | *\    *)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -9213,7 +9225,7 @@ if test x"${install_sh+set}" != xset; then
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2014 Free Software Foundation, Inc.
+# Copyright (C) 2003-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9234,7 +9246,7 @@ AC_SUBST([am__leading_dot])])
 
 # Check to see how 'make' treats includes.                 -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9284,7 +9296,7 @@ rm -f confinc confmf
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+# Copyright (C) 1997-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9323,7 +9335,7 @@ fi
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9352,7 +9364,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9399,7 +9411,7 @@ AC_LANG_POP([C])])
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9418,7 +9430,7 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9499,7 +9511,7 @@ AC_CONFIG_COMMANDS_PRE(
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2014 Free Software Foundation, Inc.
+# Copyright (C) 2009-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9559,7 +9571,7 @@ AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9587,7 +9599,7 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2014 Free Software Foundation, Inc.
+# Copyright (C) 2006-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9606,7 +9618,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2014 Free Software Foundation, Inc.
+# Copyright (C) 2004-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9737,3 +9749,8 @@ AC_SUBST([am__tar])
 AC_SUBST([am__untar])
 ]) # _AM_PROG_TAR
 
+m4_include([autoconf-archive/m4/ax_append_compile_flags.m4])
+m4_include([autoconf-archive/m4/ax_append_flag.m4])
+m4_include([autoconf-archive/m4/ax_check_compile_flag.m4])
+m4_include([autoconf-archive/m4/ax_compile_check_sizeof.m4])
+m4_include([autoconf-archive/m4/ax_require_defined.m4])
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644 (file)
index 0000000..72b1331
--- /dev/null
@@ -0,0 +1,39 @@
+version: '{branch}.{build}'\r
+os: Windows Server 2012 R2\r
+\r
+configuration:\r
+- Debug\r
+- Release\r
+platform: x64\r
+environment:\r
+  matrix:\r
+  - PlatformToolset: v140\r
+  - PlatformToolset: v120\r
+  - PlatformToolset: Windows7.1SDK\r
+\r
+build_script:\r
+- cmake .\r
+- >\r
+  msbuild "json-c.vcxproj" /m /verbosity:normal\r
+  /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"\r
+  /p:PlatformToolset=%PlatformToolset% /p:OutDir=lib\\r
+\r
+after_build:\r
+- md include\json-c\r
+- copy json.h include\json-c\*\r
+- copy debug.h include\json-c\*\r
+- copy linkhash.h include\json-c\*\r
+- copy arraylist.h include\json-c\*\r
+- copy json_util.h include\json-c\*\r
+- copy json_object.h include\json-c\*\r
+- copy json_tokener.h include\json-c\*\r
+- copy json_object_iterator.h include\json-c\*\r
+- copy json_c_version.h include\json-c\*\r
+- copy json_inttypes.h include\json-c\*\r
+- copy include\json_config.h include\json-c\*\r
+- copy json_object_private.h include\json-c\*\r
+- 7z a json-c.lib.zip lib\json-c.dll include\json-c\*.h\r
+\r
+artifacts:\r
+- path: json-c.lib.zip\r
+  name: json-c.lib.zip\r
index 81b6fa2..ddeb8d4 100644 (file)
@@ -11,6 +11,8 @@
 
 #include "config.h"
 
+#include <limits.h>
+
 #ifdef STDC_HEADERS
 # include <stdlib.h>
 # include <string.h>
 # include <strings.h>
 #endif /* HAVE_STRINGS_H */
 
-#include "bits.h"
+#ifndef SIZE_T_MAX
+#if SIZEOF_SIZE_T == SIZEOF_INT
+#define SIZE_T_MAX UINT_MAX
+#elif SIZEOF_SIZE_T == SIZEOF_LONG
+#define SIZE_T_MAX ULONG_MAX
+#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG
+#define SIZE_T_MAX ULLONG_MAX
+#else
+#error Unable to determine size of size_t
+#endif
+#endif
+
 #include "arraylist.h"
 
 struct array_list*
@@ -43,7 +56,7 @@ array_list_new(array_list_free_fn *free_fn)
 extern void
 array_list_free(struct array_list *arr)
 {
-  int i;
+  size_t i;
   for(i = 0; i < arr->length; i++)
     if(arr->array[i]) arr->free_fn(arr->array[i]);
   free(arr->array);
@@ -51,20 +64,29 @@ array_list_free(struct array_list *arr)
 }
 
 void*
-array_list_get_idx(struct array_list *arr, int i)
+array_list_get_idx(struct array_list *arr, size_t i)
 {
   if(i >= arr->length) return NULL;
   return arr->array[i];
 }
 
-static int array_list_expand_internal(struct array_list *arr, int max)
+static int array_list_expand_internal(struct array_list *arr, size_t max)
 {
   void *t;
-  int new_size;
+  size_t new_size;
 
   if(max < arr->size) return 0;
-  new_size = json_max(arr->size << 1, max);
-  if(!(t = realloc(arr->array, new_size*sizeof(void*)))) return -1;
+  /* Avoid undefined behaviour on size_t overflow */
+  if( arr->size >= SIZE_T_MAX / 2 )
+    new_size = max;
+  else
+  {
+    new_size = arr->size << 1;
+    if (new_size < max)
+      new_size = max;
+  }
+  if (new_size > (~((size_t)0)) / sizeof(void*)) return -1;
+  if (!(t = realloc(arr->array, new_size*sizeof(void*)))) return -1;
   arr->array = (void**)t;
   (void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*));
   arr->size = new_size;
@@ -72,10 +94,12 @@ static int array_list_expand_internal(struct array_list *arr, int max)
 }
 
 int
-array_list_put_idx(struct array_list *arr, int idx, void *data)
+array_list_put_idx(struct array_list *arr, size_t idx, void *data)
 {
+  if (idx > SIZE_T_MAX - 1 ) return -1;
   if(array_list_expand_internal(arr, idx+1)) return -1;
-  if(arr->array[idx]) arr->free_fn(arr->array[idx]);
+  if(idx < arr->length && arr->array[idx])
+    arr->free_fn(arr->array[idx]);
   arr->array[idx] = data;
   if(arr->length <= idx) arr->length = idx + 1;
   return 0;
@@ -90,12 +114,33 @@ array_list_add(struct array_list *arr, void *data)
 void
 array_list_sort(struct array_list *arr, int(*sort_fn)(const void *, const void *))
 {
-  qsort(arr->array, arr->length, sizeof(arr->array[0]),
-       (int (*)(const void *, const void *))sort_fn);
+  qsort(arr->array, arr->length, sizeof(arr->array[0]), sort_fn);
 }
 
-int
+void* array_list_bsearch(const void **key, struct array_list *arr,
+               int (*sort_fn)(const void *, const void *))
+{
+       return bsearch(key, arr->array, arr->length, sizeof(arr->array[0]),
+                       sort_fn);
+}
+
+size_t
 array_list_length(struct array_list *arr)
 {
   return arr->length;
 }
+
+int
+array_list_del_idx( struct array_list *arr, size_t idx, size_t count )
+{
+       size_t i, stop;
+
+       stop = idx + count;
+       if ( idx >= arr->length || stop > arr->length ) return -1;
+       for ( i = idx; i < stop; ++i ) {
+               if ( arr->array[i] ) arr->free_fn( arr->array[i] );
+       }
+       memmove( arr->array + idx, arr->array + stop, (arr->length - stop) * sizeof(void*) );
+       arr->length -= count;
+       return 0;
+}
index 4f3113c..38603e8 100644 (file)
@@ -9,6 +9,12 @@
  *
  */
 
+/**
+ * @file
+ * @brief Internal methods for working with json_type_array objects.
+ *        Although this is exposed by the json_object_get_array() method,
+ *        it is not recommended for direct use.
+ */
 #ifndef _arraylist_h_
 #define _arraylist_h_
 
@@ -23,10 +29,11 @@ typedef void (array_list_free_fn) (void *data);
 struct array_list
 {
   void **array;
-  int length;
-  int size;
+  size_t length;
+  size_t size;
   array_list_free_fn *free_fn;
 };
+typedef struct array_list array_list;
 
 extern struct array_list*
 array_list_new(array_list_free_fn *free_fn);
@@ -35,20 +42,27 @@ extern void
 array_list_free(struct array_list *al);
 
 extern void*
-array_list_get_idx(struct array_list *al, int i);
+array_list_get_idx(struct array_list *al, size_t i);
 
 extern int
-array_list_put_idx(struct array_list *al, int i, void *data);
+array_list_put_idx(struct array_list *al, size_t i, void *data);
 
 extern int
 array_list_add(struct array_list *al, void *data);
 
-extern int
+extern size_t
 array_list_length(struct array_list *al);
 
 extern void
 array_list_sort(struct array_list *arr, int(*compar)(const void *, const void *));
 
+extern void* array_list_bsearch(const void **key,
+               struct array_list *arr,
+               int (*sort_fn)(const void *, const void *));
+
+extern int 
+array_list_del_idx(struct array_list *arr, size_t idx, size_t count);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/autoconf-archive/README.txt b/autoconf-archive/README.txt
new file mode 100644 (file)
index 0000000..936582a
--- /dev/null
@@ -0,0 +1,8 @@
+
+Autoconf Archive fetched from:
+
+http://gnu.mirror.iweb.com/autoconf-archive/autoconf-archive-2015.09.25.tar.xz
+
+Grabbed the minimum files needed for the AX_APPEND_COMPILE_FLAGS and
+AX_COMPILE_CHECK_SIZEOF macros.
+
diff --git a/autoconf-archive/m4/ax_append_compile_flags.m4 b/autoconf-archive/m4/ax_append_compile_flags.m4
new file mode 100644 (file)
index 0000000..dc7b866
--- /dev/null
@@ -0,0 +1,65 @@
+# ===========================================================================
+#  http://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS])
+#
+# DESCRIPTION
+#
+#   For every FLAG1, FLAG2 it is checked whether the compiler works with the
+#   flag.  If it does, the flag is added FLAGS-VARIABLE
+#
+#   If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
+#   CFLAGS) is used.  During the check the flag is always added to the
+#   current language's flags.
+#
+#   If EXTRA-FLAGS is defined, it is added to the current language's default
+#   flags (e.g. CFLAGS) when the check is done.  The check is thus made with
+#   the flags: "CFLAGS EXTRA-FLAGS FLAG".  This can for example be used to
+#   force the compiler to issue an error when a bad flag is given.
+#
+#   NOTE: This macro depends on the AX_APPEND_FLAG and
+#   AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with
+#   AX_APPEND_LINK_FLAGS.
+#
+# LICENSE
+#
+#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 4
+
+AC_DEFUN([AX_APPEND_COMPILE_FLAGS],
+[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG])
+AX_REQUIRE_DEFINED([AX_APPEND_FLAG])
+for flag in $1; do
+  AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3])
+done
+])dnl AX_APPEND_COMPILE_FLAGS
diff --git a/autoconf-archive/m4/ax_append_flag.m4 b/autoconf-archive/m4/ax_append_flag.m4
new file mode 100644 (file)
index 0000000..08f2e07
--- /dev/null
@@ -0,0 +1,71 @@
+# ===========================================================================
+#      http://www.gnu.org/software/autoconf-archive/ax_append_flag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE])
+#
+# DESCRIPTION
+#
+#   FLAG is appended to the FLAGS-VARIABLE shell variable, with a space
+#   added in between.
+#
+#   If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
+#   CFLAGS) is used.  FLAGS-VARIABLE is not changed if it already contains
+#   FLAG.  If FLAGS-VARIABLE is unset in the shell, it is set to exactly
+#   FLAG.
+#
+#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 6
+
+AC_DEFUN([AX_APPEND_FLAG],
+[dnl
+AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF
+AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])
+AS_VAR_SET_IF(FLAGS,[
+  AS_CASE([" AS_VAR_GET(FLAGS) "],
+    [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])],
+    [
+     AS_VAR_APPEND(FLAGS,[" $1"])
+     AC_RUN_LOG([: FLAGS="$FLAGS"])
+    ])
+  ],
+  [
+  AS_VAR_SET(FLAGS,[$1])
+  AC_RUN_LOG([: FLAGS="$FLAGS"])
+  ])
+AS_VAR_POPDEF([FLAGS])dnl
+])dnl AX_APPEND_FLAG
diff --git a/autoconf-archive/m4/ax_check_compile_flag.m4 b/autoconf-archive/m4/ax_check_compile_flag.m4
new file mode 100644 (file)
index 0000000..ca36397
--- /dev/null
@@ -0,0 +1,74 @@
+# ===========================================================================
+#   http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
+#
+# DESCRIPTION
+#
+#   Check whether the given FLAG works with the current language's compiler
+#   or gives an error.  (Warnings, however, are ignored)
+#
+#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
+#   success/failure.
+#
+#   If EXTRA-FLAGS is defined, it is added to the current language's default
+#   flags (e.g. CFLAGS) when the check is done.  The check is thus made with
+#   the flags: "CFLAGS EXTRA-FLAGS FLAG".  This can for example be used to
+#   force the compiler to issue an error when a bad flag is given.
+#
+#   INPUT gives an alternative input source to AC_COMPILE_IFELSE.
+#
+#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
+#   macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 4
+
+AC_DEFUN([AX_CHECK_COMPILE_FLAG],
+[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
+AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
+AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
+  ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
+  _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
+  AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
+    [AS_VAR_SET(CACHEVAR,[yes])],
+    [AS_VAR_SET(CACHEVAR,[no])])
+  _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
+AS_VAR_IF(CACHEVAR,yes,
+  [m4_default([$2], :)],
+  [m4_default([$3], :)])
+AS_VAR_POPDEF([CACHEVAR])dnl
+])dnl AX_CHECK_COMPILE_FLAGS
diff --git a/autoconf-archive/m4/ax_compile_check_sizeof.m4 b/autoconf-archive/m4/ax_compile_check_sizeof.m4
new file mode 100644 (file)
index 0000000..00d0bcc
--- /dev/null
@@ -0,0 +1,114 @@
+# ===========================================================================
+#  http://www.gnu.org/software/autoconf-archive/ax_compile_check_sizeof.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_COMPILE_CHECK_SIZEOF(TYPE [, HEADERS [, EXTRA_SIZES...]])
+#
+# DESCRIPTION
+#
+#   This macro checks for the size of TYPE using compile checks, not run
+#   checks. You can supply extra HEADERS to look into. the check will cycle
+#   through 1 2 4 8 16 and any EXTRA_SIZES the user supplies. If a match is
+#   found, it will #define SIZEOF_`TYPE' to that value. Otherwise it will
+#   emit a configure time error indicating the size of the type could not be
+#   determined.
+#
+#   The trick is that C will not allow duplicate case labels. While this is
+#   valid C code:
+#
+#     switch (0) case 0: case 1:;
+#
+#   The following is not:
+#
+#     switch (0) case 0: case 0:;
+#
+#   Thus, the AC_TRY_COMPILE will fail if the currently tried size does not
+#   match.
+#
+#   Here is an example skeleton configure.in script, demonstrating the
+#   macro's usage:
+#
+#     AC_PROG_CC
+#     AC_CHECK_HEADERS(stddef.h unistd.h)
+#     AC_TYPE_SIZE_T
+#     AC_CHECK_TYPE(ssize_t, int)
+#
+#     headers='#ifdef HAVE_STDDEF_H
+#     #include <stddef.h>
+#     #endif
+#     #ifdef HAVE_UNISTD_H
+#     #include <unistd.h>
+#     #endif
+#     '
+#
+#     AX_COMPILE_CHECK_SIZEOF(char)
+#     AX_COMPILE_CHECK_SIZEOF(short)
+#     AX_COMPILE_CHECK_SIZEOF(int)
+#     AX_COMPILE_CHECK_SIZEOF(long)
+#     AX_COMPILE_CHECK_SIZEOF(unsigned char *)
+#     AX_COMPILE_CHECK_SIZEOF(void *)
+#     AX_COMPILE_CHECK_SIZEOF(size_t, $headers)
+#     AX_COMPILE_CHECK_SIZEOF(ssize_t, $headers)
+#     AX_COMPILE_CHECK_SIZEOF(ptrdiff_t, $headers)
+#     AX_COMPILE_CHECK_SIZEOF(off_t, $headers)
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Kaveh Ghazi <ghazi@caip.rutgers.edu>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 5
+
+AU_ALIAS([AC_COMPILE_CHECK_SIZEOF], [AX_COMPILE_CHECK_SIZEOF])
+AC_DEFUN([AX_COMPILE_CHECK_SIZEOF],
+[changequote(<<, >>)dnl
+dnl The name to #define.
+define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
+dnl The cache variable name.
+define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
+changequote([, ])dnl
+AC_MSG_CHECKING(size of $1)
+AC_CACHE_VAL(AC_CV_NAME,
+[for ac_size in 4 8 1 2 16 $3 ; do # List sizes in rough order of prevalence.
+  AC_TRY_COMPILE([#include "confdefs.h"
+#include <sys/types.h>
+$2
+], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size)
+  if test x$AC_CV_NAME != x ; then break; fi
+done
+])
+if test x$AC_CV_NAME = x ; then
+  AC_MSG_ERROR([cannot determine a size for $1])
+fi
+AC_MSG_RESULT($AC_CV_NAME)
+AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1])
+undefine([AC_TYPE_NAME])dnl
+undefine([AC_CV_NAME])dnl
+])
diff --git a/autoconf-archive/m4/ax_require_defined.m4 b/autoconf-archive/m4/ax_require_defined.m4
new file mode 100644 (file)
index 0000000..cae1111
--- /dev/null
@@ -0,0 +1,37 @@
+# ===========================================================================
+#    http://www.gnu.org/software/autoconf-archive/ax_require_defined.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_REQUIRE_DEFINED(MACRO)
+#
+# DESCRIPTION
+#
+#   AX_REQUIRE_DEFINED is a simple helper for making sure other macros have
+#   been defined and thus are available for use.  This avoids random issues
+#   where a macro isn't expanded.  Instead the configure script emits a
+#   non-fatal:
+#
+#     ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found
+#
+#   It's like AC_REQUIRE except it doesn't expand the required macro.
+#
+#   Here's an example:
+#
+#     AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
+#
+# LICENSE
+#
+#   Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved. This file is offered as-is, without any
+#   warranty.
+
+#serial 1
+
+AC_DEFUN([AX_REQUIRE_DEFINED], [dnl
+  m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])])
+])dnl AX_REQUIRE_DEFINED
diff --git a/bits.h b/bits.h
index c8cbbc8..14c1c13 100644 (file)
--- a/bits.h
+++ b/bits.h
@@ -1,4 +1,8 @@
-/*
+/**
+ * @file
+ * @brief Do not use, only contains deprecated defines.
+ * @deprecated Use json_util.h instead.
+ *
  * $Id: bits.h,v 1.10 2006/01/30 23:07:57 mclark Exp $
  *
  * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
 #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
-
+/**
+ * @deprecated
+ */
 #define hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x) & 7) + 9)
+/**
+ * @deprecated
+ */
 #define error_ptr(error) ((void*)error)
-#define error_description(error)  (json_tokener_errors[error])
+/**
+ * @deprecated
+ */
+#define error_description(error)  (json_tokener_get_error(error))
+/**
+ * @deprecated
+ */
 #define is_error(ptr) (ptr == NULL)
 
 #endif
index d622a44..1f5c50c 100755 (executable)
@@ -1,14 +1,12 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011, 2012 Free Software Foundation, Inc.
+#   Copyright 1992-2014 Free Software Foundation, Inc.
 
-timestamp='2012-02-10'
+timestamp='2014-03-23'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
 # This program is distributed in the hope that it will be useful, but
@@ -22,19 +20,17 @@ timestamp='2012-02-10'
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner.  Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
 #
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
+# Originally written by Per Bothner.
 #
 # You can get the latest version of this script from:
 # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+#
+# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+
 
 me=`echo "$0" | sed -e 's,.*/,,'`
 
@@ -54,9 +50,7 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-Free Software Foundation, Inc.
+Copyright 1992-2014 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -138,6 +132,27 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
 UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
 UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+       # If the system lacks a compiler, then just pick glibc.
+       # We could probably try harder.
+       LIBC=gnu
+
+       eval $set_cc_for_build
+       cat <<-EOF > $dummy.c
+       #include <features.h>
+       #if defined(__UCLIBC__)
+       LIBC=uclibc
+       #elif defined(__dietlibc__)
+       LIBC=dietlibc
+       #else
+       LIBC=gnu
+       #endif
+       EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+       ;;
+esac
+
 # Note: order is significant - the case branches are not exclusive.
 
 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
@@ -200,6 +215,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
        echo "${machine}-${os}${release}"
        exit ;;
+    *:Bitrig:*:*)
+       UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+       echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+       exit ;;
     *:OpenBSD:*:*)
        UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
        echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
@@ -302,7 +321,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
        echo arm-acorn-riscix${UNAME_RELEASE}
        exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
        echo arm-unknown-riscos
        exit ;;
     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
@@ -801,10 +820,13 @@ EOF
     i*:CYGWIN*:*)
        echo ${UNAME_MACHINE}-pc-cygwin
        exit ;;
+    *:MINGW64*:*)
+       echo ${UNAME_MACHINE}-pc-mingw64
+       exit ;;
     *:MINGW*:*)
        echo ${UNAME_MACHINE}-pc-mingw32
        exit ;;
-    i*:MSYS*:*)
+    *:MSYS*:*)
        echo ${UNAME_MACHINE}-pc-msys
        exit ;;
     i*:windows32*:*)
@@ -852,21 +874,21 @@ EOF
        exit ;;
     *:GNU:*:*)
        # the GNU system
-       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
        exit ;;
     *:GNU/*:*:*)
        # other systems with GNU libc and userland
-       echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+       echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
        exit ;;
     i*86:Minix:*:*)
        echo ${UNAME_MACHINE}-pc-minix
        exit ;;
     aarch64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     aarch64_be:Linux:*:*)
        UNAME_MACHINE=aarch64_be
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     alpha:Linux:*:*)
        case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
@@ -879,59 +901,54 @@ EOF
          EV68*) UNAME_MACHINE=alphaev68 ;;
        esac
        objdump --private-headers /bin/sh | grep -q ld.so.1
-       if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-       echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+       if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+       exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     arm*:Linux:*:*)
        eval $set_cc_for_build
        if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
            | grep -q __ARM_EABI__
        then
-           echo ${UNAME_MACHINE}-unknown-linux-gnu
+           echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        else
            if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
                | grep -q __ARM_PCS_VFP
            then
-               echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+               echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
            else
-               echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
+               echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
            fi
        fi
        exit ;;
     avr32*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     cris:Linux:*:*)
-       echo ${UNAME_MACHINE}-axis-linux-gnu
+       echo ${UNAME_MACHINE}-axis-linux-${LIBC}
        exit ;;
     crisv32:Linux:*:*)
-       echo ${UNAME_MACHINE}-axis-linux-gnu
+       echo ${UNAME_MACHINE}-axis-linux-${LIBC}
        exit ;;
     frv:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     hexagon:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     i*86:Linux:*:*)
-       LIBC=gnu
-       eval $set_cc_for_build
-       sed 's/^        //' << EOF >$dummy.c
-       #ifdef __dietlibc__
-       LIBC=dietlibc
-       #endif
-EOF
-       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-       echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+       echo ${UNAME_MACHINE}-pc-linux-${LIBC}
        exit ;;
     ia64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     m32r*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     m68*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     mips:Linux:*:* | mips64:Linux:*:*)
        eval $set_cc_for_build
@@ -950,54 +967,63 @@ EOF
        #endif
 EOF
        eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-       test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+       test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
        ;;
-    or32:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+    openrisc*:Linux:*:*)
+       echo or1k-unknown-linux-${LIBC}
+       exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     padre:Linux:*:*)
-       echo sparc-unknown-linux-gnu
+       echo sparc-unknown-linux-${LIBC}
        exit ;;
     parisc64:Linux:*:* | hppa64:Linux:*:*)
-       echo hppa64-unknown-linux-gnu
+       echo hppa64-unknown-linux-${LIBC}
        exit ;;
     parisc:Linux:*:* | hppa:Linux:*:*)
        # Look for CPU level
        case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-         PA7*) echo hppa1.1-unknown-linux-gnu ;;
-         PA8*) echo hppa2.0-unknown-linux-gnu ;;
-         *)    echo hppa-unknown-linux-gnu ;;
+         PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+         PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+         *)    echo hppa-unknown-linux-${LIBC} ;;
        esac
        exit ;;
     ppc64:Linux:*:*)
-       echo powerpc64-unknown-linux-gnu
+       echo powerpc64-unknown-linux-${LIBC}
        exit ;;
     ppc:Linux:*:*)
-       echo powerpc-unknown-linux-gnu
+       echo powerpc-unknown-linux-${LIBC}
+       exit ;;
+    ppc64le:Linux:*:*)
+       echo powerpc64le-unknown-linux-${LIBC}
+       exit ;;
+    ppcle:Linux:*:*)
+       echo powerpcle-unknown-linux-${LIBC}
        exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
-       echo ${UNAME_MACHINE}-ibm-linux
+       echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
        exit ;;
     sh64*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     sh*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     sparc:Linux:*:* | sparc64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     tile*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     vax:Linux:*:*)
-       echo ${UNAME_MACHINE}-dec-linux-gnu
+       echo ${UNAME_MACHINE}-dec-linux-${LIBC}
        exit ;;
     x86_64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     xtensa*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     i*86:DYNIX/ptx:4*:*)
        # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
@@ -1201,6 +1227,9 @@ EOF
     BePC:Haiku:*:*)    # Haiku running on Intel PC compatible.
        echo i586-pc-haiku
        exit ;;
+    x86_64:Haiku:*:*)
+       echo x86_64-unknown-haiku
+       exit ;;
     SX-4:SUPER-UX:*:*)
        echo sx4-nec-superux${UNAME_RELEASE}
        exit ;;
@@ -1227,19 +1256,31 @@ EOF
        exit ;;
     *:Darwin:*:*)
        UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-       case $UNAME_PROCESSOR in
-           i386)
-               eval $set_cc_for_build
-               if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-                 if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-                     (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-                     grep IS_64BIT_ARCH >/dev/null
-                 then
-                     UNAME_PROCESSOR="x86_64"
-                 fi
-               fi ;;
-           unknown) UNAME_PROCESSOR=powerpc ;;
-       esac
+       eval $set_cc_for_build
+       if test "$UNAME_PROCESSOR" = unknown ; then
+           UNAME_PROCESSOR=powerpc
+       fi
+       if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+           if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+               if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+                   (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+                   grep IS_64BIT_ARCH >/dev/null
+               then
+                   case $UNAME_PROCESSOR in
+                       i386) UNAME_PROCESSOR=x86_64 ;;
+                       powerpc) UNAME_PROCESSOR=powerpc64 ;;
+                   esac
+               fi
+           fi
+       elif test "$UNAME_PROCESSOR" = i386 ; then
+           # Avoid executing cc on OS X 10.9, as it ships with a stub
+           # that puts up a graphical alert prompting to install
+           # developer tools.  Any system running Mac OS X 10.7 or
+           # later (Darwin 11 and later) is required to have a 64-bit
+           # processor. This is not true of the ARM version of Darwin
+           # that Apple uses in portable devices.
+           UNAME_PROCESSOR=x86_64
+       fi
        echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
        exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
@@ -1256,7 +1297,7 @@ EOF
     NEO-?:NONSTOP_KERNEL:*:*)
        echo neo-tandem-nsk${UNAME_RELEASE}
        exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
+    NSE-*:NONSTOP_KERNEL:*:*)
        echo nse-tandem-nsk${UNAME_RELEASE}
        exit ;;
     NSR-?:NONSTOP_KERNEL:*:*)
@@ -1330,157 +1371,6 @@ EOF
        exit ;;
 esac
 
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-       "4"
-#else
-       ""
-#endif
-       ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-       printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-       printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-       { echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-       echo c1-convex-bsd
-       exit ;;
-    c2*)
-       if getsysinfo -f scalar_acc
-       then echo c32-convex-bsd
-       else echo c2-convex-bsd
-       fi
-       exit ;;
-    c34*)
-       echo c34-convex-bsd
-       exit ;;
-    c38*)
-       echo c38-convex-bsd
-       exit ;;
-    c4*)
-       echo c4-convex-bsd
-       exit ;;
-    esac
-fi
-
 cat >&2 <<EOF
 $0: unable to guess system type
 
index 0dcab1a..363eb34 100644 (file)
@@ -1,11 +1,17 @@
 /* config.h.in.  Generated from configure.ac by autoheader.  */
 
-/* Enable RDRANR Hardware RNG Hash Seed */
+/* Enable RDRAND Hardware RNG Hash Seed */
 #undef ENABLE_RDRAND
 
+/* Enable partial threading support */
+#undef ENABLE_THREADING
+
 /* Define if .gnu.warning accepts long strings. */
 #undef HAS_GNU_WARNING_LONG
 
+/* Has atomic builtins */
+#undef HAVE_ATOMIC_BUILTINS
+
 /* Define to 1 if you have the declaration of `INFINITY', and to 0 if you
    don't. */
 #undef HAVE_DECL_INFINITY
 /* Define to 1 if you have the <locale.h> header file. */
 #undef HAVE_LOCALE_H
 
-/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
-   to 0 otherwise. */
-#undef HAVE_MALLOC
-
 /* Define to 1 if you have the <memory.h> header file. */
 #undef HAVE_MEMORY_H
 
 /* Define to 1 if you have the `open' function. */
 #undef HAVE_OPEN
 
-/* Define to 1 if your system has a GNU libc compatible `realloc' function,
-   and to 0 otherwise. */
+/* Define to 1 if you have the `realloc' function. */
 #undef HAVE_REALLOC
 
 /* Define to 1 if you have the `setlocale' function. */
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
+/* Define to 1 if you have the `uselocale' function. */
+#undef HAVE_USELOCALE
+
 /* Define to 1 if you have the `vasprintf' function. */
 #undef HAVE_VASPRINTF
 
 /* Define to 1 if you have the `vsyslog' function. */
 #undef HAVE_VSYSLOG
 
+/* Define to 1 if you have the <xlocale.h> header file. */
+#undef HAVE_XLOCALE_H
+
+/* Have __thread */
+#undef HAVE___THREAD
+
 /* Public define for json_inttypes.h */
 #undef JSON_C_HAVE_INTTYPES_H
 
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
+/* The number of bytes in type int */
+#undef SIZEOF_INT
+
+/* The number of bytes in type int64_t */
+#undef SIZEOF_INT64_T
+
+/* The number of bytes in type long */
+#undef SIZEOF_LONG
+
+/* The number of bytes in type long long */
+#undef SIZEOF_LONG_LONG
+
+/* The number of bytes in type size_t */
+#undef SIZEOF_SIZE_T
+
+/* Specifier for __thread */
+#undef SPEC___THREAD
+
 /* Define to 1 if you have the ANSI C header files. */
 #undef STDC_HEADERS
 
 /* 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
index ec3a84a..fc4c4b0 100644 (file)
@@ -1,26 +1,50 @@
-/*
- * $Id: config.h.win32,v 1.2 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.
- *
- */
-
-/* config.h.win32  Generated by configure.  */
-
-#define PACKAGE_STRING "JSON C Library 0.2"
-#define PACKAGE_BUGREPORT "json-c@googlegroups.com"
-#define PACKAGE_NAME "JSON C Library"
-#define PACKAGE_TARNAME "json-c"
-#define PACKAGE_VERSION "0.2"
-\r
 /* config.h.in.  Generated from configure.ac by autoheader.  */\r
 \r
+/* Enable RDRANR Hardware RNG Hash Seed */\r
+#undef ENABLE_RDRAND\r
+\r
+/* Define if .gnu.warning accepts long strings. */\r
+#undef HAS_GNU_WARNING_LONG\r
+\r
+/* Define to 1 if you have the declaration of `INFINITY', and to 0 if you\r
+   don't. */\r
+#if (defined(_MSC_VER) && _MSC_VER >= 1800) || defined(__MINGW32__)\r
+#define HAVE_DECL_INFINITY 1\r
+#endif\r
+\r
+/* Define to 1 if you have the declaration of `isinf', and to 0 if you don't.\r
+   */\r
+#if (defined(_MSC_VER) && _MSC_VER >= 1800) || defined(__MINGW32__)\r
+#define HAVE_DECL_ISINF 1\r
+#endif\r
+\r
+/* Define to 1 if you have the declaration of `isnan', and to 0 if you don't.\r
+   */\r
+#if (defined(_MSC_VER) && _MSC_VER >= 1800) || defined(__MINGW32__)\r
+#define HAVE_DECL_ISNAN 1\r
+#endif\r
+\r
+/* Define to 1 if you have the declaration of `nan', and to 0 if you don't. */\r
+#if (defined(_MSC_VER) && _MSC_VER >= 1800) || defined(__MINGW32__)\r
+#define HAVE_DECL_NAN 1\r
+#endif\r
+\r
+/* Define to 1 if you have the declaration of `_finite', and to 0 if you\r
+   don't. */\r
+#define HAVE_DECL__FINITE 1\r
+\r
+/* Define to 1 if you have the declaration of `_isnan', and to 0 if you don't.\r
+   */\r
+#define HAVE_DECL__ISNAN 1\r
+\r
+/* Define to 1 if you have the <dlfcn.h> header file. */\r
+#define HAVE_DLFCN_H 1\r
+\r
 /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */\r
-/* #undef HAVE_DOPRNT */\r
+#define HAVE_DOPRNT 1\r
+\r
+/* Define to 1 if you have the <endian.h> header file. */\r
+#undef HAVE_ENDIAN_H\r
 \r
 /* Define to 1 if you have the <fcntl.h> header file. */\r
 #define HAVE_FCNTL_H 1\r
@@ -31,6 +55,9 @@
 /* Define to 1 if you have the <limits.h> header file. */\r
 #define HAVE_LIMITS_H 1\r
 \r
+/* Define to 1 if you have the <locale.h> header file. */\r
+#define HAVE_LOCALE_H 1\r
+\r
 /* Define to 1 if your system has a GNU libc compatible `malloc' function, and\r
    to 0 otherwise. */\r
 #define HAVE_MALLOC 1\r
 #define HAVE_MEMORY_H 1\r
 \r
 /* Define to 1 if you have the `open' function. */\r
-#undef HAVE_OPEN\r
+#define HAVE_OPEN 1\r
 \r
 /* Define to 1 if your system has a GNU libc compatible `realloc' function,\r
    and to 0 otherwise. */\r
-#define HAVE_REALLOC 1
-
+#define HAVE_REALLOC 1\r
+\r
+/* Define to 1 if you have the `setlocale' function. */\r
+#define HAVE_SETLOCALE 1\r
+\r
+/* Define to 1 if you have the `snprintf' function. */\r
+#if defined(__MINGW32__)\r
+#define HAVE_SNPRINTF 1\r
+#else\r
+#undef HAVE_SNPRINTF\r
+#endif\r
+\r
+/* Define to 1 if you have the <stdarg.h> header file. */\r
+#define HAVE_STDARG_H 1\r
+\r
 /* Define to 1 if you have the <stdint.h> header file. */\r
 #define HAVE_STDINT_H 1\r
 \r
 /* Define to 1 if you have the <stdlib.h> header file. */\r
 #define HAVE_STDLIB_H 1\r
 \r
-/* Define to 1 if you have the `strdup' function. */\r
-#undef HAVE_STRNDUP\r
+/* Define to 1 if you have the `strcasecmp' function. */\r
+#define HAVE_STRCASECMP 1\r
 \r
-/* Define to 1 if you have the <stdarg.h> header file. */\r
-#define HAVE_STDARG_H 1\r
+/* Define to 1 if you have the `strdup' function. */\r
+#define HAVE_STRDUP 0\r
 \r
 /* Define to 1 if you have the `strerror' function. */\r
 #define HAVE_STRERROR 1\r
 /* Define to 1 if you have the <string.h> header file. */\r
 #define HAVE_STRING_H 1\r
 \r
+/* Define to 1 if you have the `strncasecmp' function. */\r
+#if defined(__MINGW32__)\r
+#define HAVE_STRNCASECMP 1\r
+#else\r
+#undef HAVE_STRNCASECMP\r
+#endif\r
+\r
+#cmakedefine HAVE_STRTOLL\r
+#cmakedefine strtoll @cmake_strtoll@\r
+\r
 /* Define to 1 if you have the <syslog.h> header file. */\r
 #undef HAVE_SYSLOG_H\r
 \r
+/* Define to 1 if you have the <sys/cdefs.h> header file. */\r
+#define HAVE_SYS_CDEFS_H 1\r
+\r
 /* Define to 1 if you have the <sys/param.h> header file. */\r
+#if defined(__MINGW32__)\r
+#define HAVE_SYS_PARAM_H 1\r
+#else\r
 #undef HAVE_SYS_PARAM_H\r
+#endif\r
 \r
 /* Define to 1 if you have the <sys/stat.h> header file. */\r
 #define HAVE_SYS_STAT_H 1\r
 #define HAVE_SYS_TYPES_H 1\r
 \r
 /* Define to 1 if you have the <unistd.h> header file. */\r
+#if defined(__MINGW32__)\r
+#define HAVE_UNISTD_H 1\r
+#else\r
 #undef HAVE_UNISTD_H\r
+#endif\r
+\r
+/* Define to 1 if you have the `vasprintf' function. */\r
+#if defined(__MINGW32__)\r
+#define HAVE_VASPRINTF 1\r
+#else\r
+#undef HAVE_VASPRINTF\r
+#endif\r
 \r
 /* Define to 1 if you have the `vprintf' function. */\r
-#undef HAVE_VPRINTF\r
+#define HAVE_VPRINTF 1\r
+\r
+/* Define to 1 if you have the `vsnprintf' function. */\r
+#define HAVE_VSNPRINTF 1\r
 \r
 /* Define to 1 if you have the `vsyslog' function. */\r
 #undef HAVE_VSYSLOG\r
 \r
-/* Define to 1 if you have the `strncasecmp' function. */\r
-#undef HAVE_STRNCASECMP\r
+/* Define to the sub-directory in which libtool stores uninstalled libraries.\r
+   */\r
+#undef LT_OBJDIR\r
+\r
+/* Define to 1 if your C compiler doesn't accept -c and -o together. */\r
+/* #undef NO_MINUS_C_MINUS_O */\r
+\r
+/* Name of package */\r
+#define PACKAGE "json-c"\r
+\r
+/* Define to the address where bug reports for this package should be sent. */\r
+#define PACKAGE_BUGREPORT "json-c@googlegroups.com"\r
+\r
+/* Define to the full name of this package. */\r
+#define PACKAGE_NAME "JSON C Library"\r
+\r
+/* Define to the full name and version of this package. */\r
+#define PACKAGE_STRING "JSON C Library 0.13"\r
+\r
+/* Define to the one symbol short name of this package. */\r
+#define PACKAGE_TARNAME "json-c"\r
+\r
+/* Define to the home page for this package. */\r
+#define PACKAGE_URL "https://github.com/json-c/json-c"\r
+\r
+/* Define to the version of this package. */\r
+#define PACKAGE_VERSION "0.13"\r
 \r
 /* Define to 1 if you have the ANSI C header files. */\r
-#define STDC_HEADERS 1
+#define STDC_HEADERS 1\r
+\r
+/* Version number of package */\r
+#define VERSION "0.13"\r
+\r
+/* Define to empty if `const' does not conform to ANSI C. */\r
+/* #undef const */\r
+\r
+/* Define to rpl_malloc if the replacement function should be used. */\r
+/* #undef malloc */\r
+\r
+/* Define to rpl_realloc if the replacement function should be used. */\r
+/* #undef realloc */\r
+\r
+/* Define to `unsigned int' if <sys/types.h> does not define. */\r
+/* #undef size_t */\r
index 59bb593..bba4efb 100755 (executable)
@@ -1,24 +1,18 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011, 2012 Free Software Foundation, Inc.
+#   Copyright 1992-2014 Free Software Foundation, Inc.
 
-timestamp='2012-04-18'
+timestamp='2014-09-11'
 
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, see <http://www.gnu.org/licenses/>.
@@ -26,11 +20,12 @@ timestamp='2012-04-18'
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
+# Please send patches with a ChangeLog entry to config-patches@gnu.org.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
@@ -73,9 +68,7 @@ Report bugs and patches to <config-patches@gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-Free Software Foundation, Inc.
+Copyright 1992-2014 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -123,7 +116,7 @@ esac
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
-  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
   knetbsd*-gnu* | netbsd*-gnu* | \
   kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
@@ -156,7 +149,7 @@ case $os in
        -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
        -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
        -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-       -apple | -axis | -knuth | -cray | -microblaze)
+       -apple | -axis | -knuth | -cray | -microblaze*)
                os=
                basic_machine=$1
                ;;
@@ -259,10 +252,12 @@ case $basic_machine in
        | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
        | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
        | am33_2.0 \
-       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-        | be32 | be64 \
+       | arc | arceb \
+       | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+       | avr | avr32 \
+       | be32 | be64 \
        | bfin \
-       | c4x | clipper \
+       | c4x | c8051 | clipper \
        | d10v | d30v | dlx | dsp16xx \
        | epiphany \
        | fido | fr30 | frv \
@@ -270,10 +265,11 @@ case $basic_machine in
        | hexagon \
        | i370 | i860 | i960 | ia64 \
        | ip2k | iq2000 \
+       | k1om \
        | le32 | le64 \
        | lm32 \
        | m32c | m32r | m32rle | m68000 | m68k | m88k \
-       | maxq | mb | microblaze | mcore | mep | metag \
+       | maxq | mb | microblaze | microblazeel | mcore | mep | metag \
        | mips | mipsbe | mipseb | mipsel | mipsle \
        | mips16 \
        | mips64 | mips64el \
@@ -287,23 +283,26 @@ case $basic_machine in
        | mips64vr5900 | mips64vr5900el \
        | mipsisa32 | mipsisa32el \
        | mipsisa32r2 | mipsisa32r2el \
+       | mipsisa32r6 | mipsisa32r6el \
        | mipsisa64 | mipsisa64el \
        | mipsisa64r2 | mipsisa64r2el \
+       | mipsisa64r6 | mipsisa64r6el \
        | mipsisa64sb1 | mipsisa64sb1el \
        | mipsisa64sr71k | mipsisa64sr71kel \
+       | mipsr5900 | mipsr5900el \
        | mipstx39 | mipstx39el \
        | mn10200 | mn10300 \
        | moxie \
        | mt \
        | msp430 \
        | nds32 | nds32le | nds32be \
-       | nios | nios2 \
+       | nios | nios2 | nios2eb | nios2el \
        | ns16k | ns32k \
-       | open8 \
-       | or32 \
+       | open8 | or1k | or1knd | or32 \
        | pdp10 | pdp11 | pj | pjl \
        | powerpc | powerpc64 | powerpc64le | powerpcle \
        | pyramid \
+       | riscv32 | riscv64 \
        | rl78 | rx \
        | score \
        | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
@@ -328,7 +327,7 @@ case $basic_machine in
        c6x)
                basic_machine=tic6x-unknown
                ;;
-       m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+       m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
                basic_machine=$basic_machine-unknown
                os=-none
                ;;
@@ -370,13 +369,13 @@ case $basic_machine in
        | aarch64-* | aarch64_be-* \
        | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
        | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
        | arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
        | avr-* | avr32-* \
        | be32-* | be64-* \
        | bfin-* | bs2000-* \
        | c[123]* | c30-* | [cjt]90-* | c4x-* \
-       | clipper-* | craynv-* | cydra-* \
+       | c8051-* | clipper-* | craynv-* | cydra-* \
        | d10v-* | d30v-* | dlx-* \
        | elxsi-* \
        | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
@@ -385,11 +384,13 @@ case $basic_machine in
        | hexagon-* \
        | i*86-* | i860-* | i960-* | ia64-* \
        | ip2k-* | iq2000-* \
+       | k1om-* \
        | le32-* | le64-* \
        | lm32-* \
        | m32c-* | m32r-* | m32rle-* \
        | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-       | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+       | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+       | microblaze-* | microblazeel-* \
        | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
        | mips16-* \
        | mips64-* | mips64el-* \
@@ -403,18 +404,22 @@ case $basic_machine in
        | mips64vr5900-* | mips64vr5900el-* \
        | mipsisa32-* | mipsisa32el-* \
        | mipsisa32r2-* | mipsisa32r2el-* \
+       | mipsisa32r6-* | mipsisa32r6el-* \
        | mipsisa64-* | mipsisa64el-* \
        | mipsisa64r2-* | mipsisa64r2el-* \
+       | mipsisa64r6-* | mipsisa64r6el-* \
        | mipsisa64sb1-* | mipsisa64sb1el-* \
        | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+       | mipsr5900-* | mipsr5900el-* \
        | mipstx39-* | mipstx39el-* \
        | mmix-* \
        | mt-* \
        | msp430-* \
        | nds32-* | nds32le-* | nds32be-* \
-       | nios-* | nios2-* \
+       | nios-* | nios2-* | nios2eb-* | nios2el-* \
        | none-* | np1-* | ns16k-* | ns32k-* \
        | open8-* \
+       | or1k*-* \
        | orion-* \
        | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
        | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
@@ -788,11 +793,15 @@ case $basic_machine in
                basic_machine=ns32k-utek
                os=-sysv
                ;;
-       microblaze)
+       microblaze*)
                basic_machine=microblaze-xilinx
                ;;
+       mingw64)
+               basic_machine=x86_64-pc
+               os=-mingw64
+               ;;
        mingw32)
-               basic_machine=i386-pc
+               basic_machine=i686-pc
                os=-mingw32
                ;;
        mingw32ce)
@@ -820,6 +829,10 @@ case $basic_machine in
                basic_machine=powerpc-unknown
                os=-morphos
                ;;
+       moxiebox)
+               basic_machine=moxie-unknown
+               os=-moxiebox
+               ;;
        msdos)
                basic_machine=i386-pc
                os=-msdos
@@ -828,7 +841,7 @@ case $basic_machine in
                basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
                ;;
        msys)
-               basic_machine=i386-pc
+               basic_machine=i686-pc
                os=-msys
                ;;
        mvs)
@@ -1019,7 +1032,11 @@ case $basic_machine in
                basic_machine=i586-unknown
                os=-pw32
                ;;
-       rdos)
+       rdos | rdos64)
+               basic_machine=x86_64-pc
+               os=-rdos
+               ;;
+       rdos32)
                basic_machine=i386-pc
                os=-rdos
                ;;
@@ -1346,29 +1363,29 @@ case $os in
        -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
              | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
              | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-             | -sym* | -kopensolaris* \
+             | -sym* | -kopensolaris* | -plan9* \
              | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
              | -aos* | -aros* \
              | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
              | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
              | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-             | -openbsd* | -solidbsd* \
+             | -bitrig* | -openbsd* | -solidbsd* \
              | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
              | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
              | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
              | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
              | -chorusos* | -chorusrdb* | -cegcc* \
              | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-             | -mingw32* | -linux-gnu* | -linux-android* \
-             | -linux-newlib* | -linux-uclibc* \
-             | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+             | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+             | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
              | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
              | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
              | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
              | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
              | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
              | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-             | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+             | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
        # Remember, each alternative MUST END IN *, to match a version number.
                ;;
        -qnx*)
@@ -1492,9 +1509,6 @@ case $os in
        -aros*)
                os=-aros
                ;;
-       -kaos*)
-               os=-kaos
-               ;;
        -zvmoe)
                os=-zvmoe
                ;;
@@ -1543,6 +1557,12 @@ case $basic_machine in
        c4x-* | tic4x-*)
                os=-coff
                ;;
+       c8051-*)
+               os=-elf
+               ;;
+       hexagon-*)
+               os=-elf
+               ;;
        tic54x-*)
                os=-coff
                ;;
index 0347bf1..88b9e4b 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for json-c 0.12.1.
+# Generated by GNU Autoconf 2.69 for json-c 0.13.
 #
 # Report bugs to <json-c@googlegroups.com>.
 #
@@ -590,8 +590,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='json-c'
 PACKAGE_TARNAME='json-c'
-PACKAGE_VERSION='0.12.1'
-PACKAGE_STRING='json-c 0.12.1'
+PACKAGE_VERSION='0.13'
+PACKAGE_STRING='json-c 0.13'
 PACKAGE_BUGREPORT='json-c@googlegroups.com'
 PACKAGE_URL=''
 
@@ -653,14 +653,6 @@ DUMPBIN
 LD
 FGREP
 SED
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
 LIBTOOL
 LIBOBJS
 EGREP
@@ -683,6 +675,14 @@ CPPFLAGS
 LDFLAGS
 CFLAGS
 CC
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
 AM_BACKSLASH
 AM_DEFAULT_VERBOSITY
 AM_DEFAULT_V
@@ -752,6 +752,7 @@ ac_subst_files=''
 ac_user_opts='
 enable_option_checking
 enable_silent_rules
+enable_threading
 enable_rdrand
 enable_dependency_tracking
 enable_shared
@@ -1312,7 +1313,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures json-c 0.12.1 to adapt to many kinds of systems.
+\`configure' configures json-c 0.13 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1382,7 +1383,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of json-c 0.12.1:";;
+     short | recursive ) echo "Configuration of json-c 0.13:";;
    esac
   cat <<\_ACEOF
 
@@ -1392,6 +1393,7 @@ Optional Features:
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
   --enable-silent-rules   less verbose build output (undo: "make V=1")
   --disable-silent-rules  verbose build output (undo: "make V=0")
+  --enable-threading      Enable code to support partly multi-threaded use
   --enable-rdrand         Enable RDRAND Hardware RNG Hash Seed generation on
                           supported x86/x64 platforms.
   --enable-dependency-tracking
@@ -1490,7 +1492,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-json-c configure 0.12.1
+json-c configure 0.13
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1959,7 +1961,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by json-c $as_me 0.12.1, which was
+It was created by json-c $as_me 0.13, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2308,7 +2310,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
-am__api_version='1.15'
+am__api_version='1.14'
 
 ac_aux_dir=
 for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
@@ -2529,7 +2531,7 @@ else
 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
 fi
 
-if test x"${install_sh+set}" != xset; then
+if test x"${install_sh}" != xset; then
   case $am_aux_dir in
   *\ * | *\    *)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -2823,7 +2825,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='json-c'
- VERSION='0.12.1'
+ VERSION='0.13'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -2857,8 +2859,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 mkdir_p='$(MKDIR_P)'
 
-# We need awk for the "check" target (and possibly the TAP driver).  The
-# system "awk" is bad on some platforms.
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
 # Always define AMTAR for backward compatibility.  Yes, it's still used
 # in the wild :-(  We should find a proper way to deprecate it ...
 AMTAR='$${TAR-tar}'
@@ -2917,6 +2919,8 @@ END
 fi
 
 
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
 set x ${MAKE-make}
@@ -2949,6 +2953,97 @@ $as_echo "no" >&6; }
 fi
 
 
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+# Check whether --enable-threading was given.
+if test "${enable_threading+set}" = set; then :
+  enableval=$enable_threading; if test x$enableval = xyes; then
+  enable_threading=yes
+
+$as_echo "#define ENABLE_THREADING 1" >>confdefs.h
+
+fi
+fi
+
+
+if test "x$enable_threading" = "xyes"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: Partial multi-threaded support enabled." >&5
+$as_echo "Partial multi-threaded support enabled." >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: Multi-threaded support disabled. Use --enable-threading to enable." >&5
+$as_echo "Multi-threaded support disabled. Use --enable-threading to enable." >&6; }
+fi
+
 # Check whether --enable-rdrand was given.
 if test "${enable_rdrand+set}" = set; then :
   enableval=$enable_rdrand; if test x$enableval = xyes; then
@@ -2968,6 +3063,47 @@ else
 $as_echo "RDRAND Hardware RNG Hash Seed disabled. Use --enable-rdrand to enable" >&6; }
 fi
 
+# enable silent build by default
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=0;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+       @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+
 # Checks for programs.
 
 # Checks for libraries.
@@ -4013,6 +4149,183 @@ fi
 
 
 
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5
+$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
+if ${ac_cv_prog_cc_c99+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
+
+// Check varargs macros.  These examples are taken from C99 6.10.3.5.
+#define debug(...) fprintf (stderr, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+  int x = 1234;
+  int y = 5678;
+  debug ("Flag");
+  debug ("X = %d\n", x);
+  showlist (The first, second, and third items.);
+  report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+  your preprocessor is broken;
+#endif
+#if BIG_OK
+#else
+  your preprocessor is broken;
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+  int datasize;
+  double data[];
+};
+
+struct named_init {
+  int number;
+  const wchar_t *name;
+  double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+  // See if C++-style comments work.
+  // Iterate through items via the restricted pointer.
+  // Also check for declarations in for loops.
+  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
+    continue;
+  return 0;
+}
+
+// Check varargs and va_copy.
+static void
+test_varargs (const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  va_list args_copy;
+  va_copy (args_copy, args);
+
+  const char *str;
+  int number;
+  float fnumber;
+
+  while (*format)
+    {
+      switch (*format++)
+       {
+       case 's': // string
+         str = va_arg (args_copy, const char *);
+         break;
+       case 'd': // int
+         number = va_arg (args_copy, int);
+         break;
+       case 'f': // float
+         fnumber = va_arg (args_copy, double);
+         break;
+       default:
+         break;
+       }
+    }
+  va_end (args_copy);
+  va_end (args);
+}
+
+int
+main ()
+{
+
+  // Check bool.
+  _Bool success = false;
+
+  // Check restrict.
+  if (test_restrict ("String literal") == 0)
+    success = true;
+  char *restrict newvar = "Another string";
+
+  // Check varargs.
+  test_varargs ("s, d' f .", "string", 65, 34.234);
+  test_varargs_macros ();
+
+  // Check flexible array members.
+  struct incomplete_array *ia =
+    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+  ia->datasize = 10;
+  for (int i = 0; i < ia->datasize; ++i)
+    ia->data[i] = i * 1.234;
+
+  // Check named initializers.
+  struct named_init ni = {
+    .number = 34,
+    .name = L"Test wide string",
+    .average = 543.34343,
+  };
+
+  ni.number = 58;
+
+  int dynamic_array[ni.number];
+  dynamic_array[ni.number - 1] = 543;
+
+  // work around unused variable warnings
+  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
+         || dynamic_array[ni.number - 1] != 543);
+
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c99" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c99"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c99" != xno; then :
+
+fi
+
+
 ac_config_headers="$ac_config_headers config.h"
 
 ac_config_headers="$ac_config_headers json_config.h"
@@ -4415,7 +4728,7 @@ fi
 done
 
 
-for ac_header in fcntl.h limits.h strings.h syslog.h unistd.h sys/cdefs.h sys/param.h stdarg.h locale.h endian.h
+for ac_header in fcntl.h limits.h strings.h syslog.h unistd.h sys/cdefs.h sys/param.h stdarg.h locale.h xlocale.h endian.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -4531,6 +4844,44 @@ _ACEOF
 fi
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __thread support" >&5
+$as_echo_n "checking for __thread support... " >&6; }
+if ${ac_cv___thread+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#undef __thread
+static __thread int a; int foo (int b) { return a + b; }
+int
+main ()
+{
+exit (foo (0));
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv___thread=yes
+else
+  ac_cv___thread=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv___thread" >&5
+$as_echo "$ac_cv___thread" >&6; }
+if test "x$ac_cv___thread" != xno; then :
+
+$as_echo "#define HAVE___THREAD 1" >>confdefs.h
+
+
+$as_echo "#define SPEC___THREAD __thread" >>confdefs.h
+
+
+fi
+
 # Checks for library functions.
 for ac_func in vprintf
 do :
@@ -4613,156 +4964,33 @@ test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in
 esac
 
 
-for ac_header in stdlib.h
+for ac_func in realloc
 do :
-  ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
-if test "x$ac_cv_header_stdlib_h" = xyes; then :
+  ac_fn_c_check_func "$LINENO" "realloc" "ac_cv_func_realloc"
+if test "x$ac_cv_func_realloc" = xyes; then :
   cat >>confdefs.h <<_ACEOF
-#define HAVE_STDLIB_H 1
+#define HAVE_REALLOC 1
 _ACEOF
 
 fi
+done
+
+for ac_func in strcasecmp strdup strerror snprintf vsnprintf vasprintf open vsyslog strncasecmp setlocale
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
 
+fi
 done
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5
-$as_echo_n "checking for GNU libc compatible malloc... " >&6; }
-if ${ac_cv_func_malloc_0_nonnull+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ac_cv_func_malloc_0_nonnull=no
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#if defined STDC_HEADERS || defined HAVE_STDLIB_H
-# include <stdlib.h>
-#else
-char *malloc ();
-#endif
-
-int
-main ()
-{
-return ! malloc (0);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_func_malloc_0_nonnull=yes
-else
-  ac_cv_func_malloc_0_nonnull=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5
-$as_echo "$ac_cv_func_malloc_0_nonnull" >&6; }
-if test $ac_cv_func_malloc_0_nonnull = yes; then :
-
-$as_echo "#define HAVE_MALLOC 1" >>confdefs.h
-
-else
-  $as_echo "#define HAVE_MALLOC 0" >>confdefs.h
-
-   case " $LIBOBJS " in
-  *" malloc.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS malloc.$ac_objext"
- ;;
-esac
-
-
-$as_echo "#define malloc rpl_malloc" >>confdefs.h
-
-fi
-
-
-for ac_header in stdlib.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
-if test "x$ac_cv_header_stdlib_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STDLIB_H 1
-_ACEOF
-
-fi
-
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5
-$as_echo_n "checking for GNU libc compatible realloc... " >&6; }
-if ${ac_cv_func_realloc_0_nonnull+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ac_cv_func_realloc_0_nonnull=no
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#if defined STDC_HEADERS || defined HAVE_STDLIB_H
-# include <stdlib.h>
-#else
-char *realloc ();
-#endif
-
-int
-main ()
-{
-return ! realloc (0, 0);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_func_realloc_0_nonnull=yes
-else
-  ac_cv_func_realloc_0_nonnull=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5
-$as_echo "$ac_cv_func_realloc_0_nonnull" >&6; }
-if test $ac_cv_func_realloc_0_nonnull = yes; then :
-
-$as_echo "#define HAVE_REALLOC 1" >>confdefs.h
-
-else
-  $as_echo "#define HAVE_REALLOC 0" >>confdefs.h
-
-   case " $LIBOBJS " in
-  *" realloc.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS realloc.$ac_objext"
- ;;
-esac
-
-
-$as_echo "#define realloc rpl_realloc" >>confdefs.h
-
-fi
-
-
-for ac_func in strcasecmp strdup strerror snprintf vsnprintf vasprintf open vsyslog strncasecmp setlocale
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-ac_fn_c_check_decl "$LINENO" "INFINITY" "ac_cv_have_decl_INFINITY" "#include <math.h>
-"
-if test "x$ac_cv_have_decl_INFINITY" = xyes; then :
-  ac_have_decl=1
+ac_fn_c_check_decl "$LINENO" "INFINITY" "ac_cv_have_decl_INFINITY" "#include <math.h>
+"
+if test "x$ac_cv_have_decl_INFINITY" = xyes; then :
+  ac_have_decl=1
 else
   ac_have_decl=0
 fi
@@ -4831,6 +5059,82 @@ cat >>confdefs.h <<_ACEOF
 #define HAVE_DECL__FINITE $ac_have_decl
 _ACEOF
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GCC atomic builtins" >&5
+$as_echo_n "checking for GCC atomic builtins... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+   int main() {
+      volatile unsigned int val = 1;
+      /* Note: __sync_val_compare_and_swap isn't checked here
+       * because it's protected by __GCC_HAVE_SYNC_COMPARE_AND_SWAP_<n>,
+       * which is automatically defined by gcc.
+       */
+      __sync_add_and_fetch(&val, 1);
+      __sync_sub_and_fetch(&val, 1);
+      return 0;
+   }
+
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_ATOMIC_BUILTINS 1" >>confdefs.h
+
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: json-c will be built without atomic refcounts because atomic builtins are missing" >&5
+$as_echo "$as_me: WARNING: json-c will be built without atomic refcounts because atomic builtins are missing" >&2;}
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+case "${host_os}" in
+       linux*)
+               for ac_func in uselocale
+do :
+  ac_fn_c_check_func "$LINENO" "uselocale" "ac_cv_func_uselocale"
+if test "x$ac_cv_func_uselocale" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_USELOCALE 1
+_ACEOF
+
+fi
+done
+
+               ;;
+       *)      # Nothing
+               ;;
+esac
+
+if test "$ac_cv_have_decl_isnan" = "yes" ; then
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+int
+main ()
+{
+float f = 0.0; return isnan(f)
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+  LIBS="$LIBS -lm"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
 
 #check if .section.gnu.warning accepts long strings (for __warn_references)
 ac_ext=c
@@ -4900,77 +5204,6 @@ macro_revision='1.3337'
 
 ltmain="$ac_aux_dir/ltmain.sh"
 
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
 # Backslashify metacharacters that are still active within
 # double-quoted strings.
 sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
@@ -5630,7 +5863,8 @@ else
     ;;
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
@@ -6031,10 +6265,6 @@ freebsd* | dragonfly*)
   fi
   ;;
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
 haiku*)
   lt_cv_deplibs_check_method=pass_all
   ;;
@@ -6073,11 +6303,11 @@ irix5* | irix6* | nonstopux*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-netbsd*)
+netbsd* | netbsdelf*-gnu)
   if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
   else
@@ -7154,7 +7384,7 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
   # Find out which ABI we are using.
   echo 'int i;' > conftest.$ac_ext
@@ -7170,9 +7400,19 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
            LD="${LD-ld} -m elf_i386_fbsd"
            ;;
          x86_64-*linux*)
-           LD="${LD-ld} -m elf_i386"
+           case `/usr/bin/file conftest.o` in
+             *x86-64*)
+               LD="${LD-ld} -m elf32_x86_64"
+               ;;
+             *)
+               LD="${LD-ld} -m elf_i386"
+               ;;
+           esac
+           ;;
+         powerpc64le-*)
+           LD="${LD-ld} -m elf32lppclinux"
            ;;
-         ppc64-*linux*|powerpc64-*linux*)
+         powerpc64-*)
            LD="${LD-ld} -m elf32ppclinux"
            ;;
          s390x-*linux*)
@@ -7191,7 +7431,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
          x86_64-*linux*)
            LD="${LD-ld} -m elf_x86_64"
            ;;
-         ppc*-*linux*|powerpc*-*linux*)
+         powerpcle-*)
+           LD="${LD-ld} -m elf64lppc"
+           ;;
+         powerpc-*)
            LD="${LD-ld} -m elf64ppc"
            ;;
          s390*-*linux*|s390*-*tpf*)
@@ -8728,7 +8971,7 @@ lt_prog_compiler_static=
       lt_prog_compiler_static='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -9206,6 +9449,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   openbsd*)
     with_gnu_ld=no
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
   esac
 
   ld_shlibs=yes
@@ -9427,7 +9673,7 @@ _LT_EOF
       fi
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
        wlarc=
@@ -9604,6 +9850,7 @@ _LT_EOF
        if test "$aix_use_runtimelinking" = yes; then
          shared_flag="$shared_flag "'${wl}-G'
        fi
+       link_all_deplibs=no
       else
        # not using gcc
        if test "$host_cpu" = ia64; then
@@ -10057,7 +10304,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       link_all_deplibs=yes
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
       else
@@ -10894,17 +11141,6 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
@@ -11021,7 +11257,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
@@ -12106,6 +12354,433 @@ if test "x$enable_Bsymbolic" = "xyes"; then :
 fi
 
 
+
+
+
+
+for flag in -Wall -Werror -Wcast-qual -Wno-error=deprecated-declarations; do
+  as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
+$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
+if eval \${$as_CACHEVAR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+  ax_check_save_flags=$CFLAGS
+  CFLAGS="$CFLAGS  $flag"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$as_CACHEVAR=yes"
+else
+  eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  CFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then :
+
+if ${CFLAGS+:} false; then :
+
+  case " $CFLAGS " in #(
+  *" $flag "*) :
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5
+  (: CFLAGS already contains $flag) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } ;; #(
+  *) :
+
+     as_fn_append CFLAGS " $flag"
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5
+  (: CFLAGS="$CFLAGS") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+     ;;
+esac
+
+else
+
+  CFLAGS=$flag
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5
+  (: CFLAGS="$CFLAGS") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+
+fi
+
+else
+  :
+fi
+
+done
+
+
+
+
+
+for flag in -Wextra -Wwrite-string -Wno-unused-parameter; do
+  as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
+$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
+if eval \${$as_CACHEVAR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+  ax_check_save_flags=$CFLAGS
+  CFLAGS="$CFLAGS  $flag"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$as_CACHEVAR=yes"
+else
+  eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  CFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then :
+
+if ${CFLAGS+:} false; then :
+
+  case " $CFLAGS " in #(
+  *" $flag "*) :
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5
+  (: CFLAGS already contains $flag) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } ;; #(
+  *) :
+
+     as_fn_append CFLAGS " $flag"
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5
+  (: CFLAGS="$CFLAGS") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+     ;;
+esac
+
+else
+
+  CFLAGS=$flag
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5
+  (: CFLAGS="$CFLAGS") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+
+fi
+
+else
+  :
+fi
+
+done
+
+
+
+
+
+for flag in -D_GNU_SOURCE -D_REENTRANT; do
+  as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
+$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
+if eval \${$as_CACHEVAR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+  ax_check_save_flags=$CFLAGS
+  CFLAGS="$CFLAGS  $flag"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$as_CACHEVAR=yes"
+else
+  eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  CFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then :
+
+if ${CFLAGS+:} false; then :
+
+  case " $CFLAGS " in #(
+  *" $flag "*) :
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5
+  (: CFLAGS already contains $flag) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } ;; #(
+  *) :
+
+     as_fn_append CFLAGS " $flag"
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5
+  (: CFLAGS="$CFLAGS") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+     ;;
+esac
+
+else
+
+  CFLAGS=$flag
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5
+  (: CFLAGS="$CFLAGS") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+
+fi
+
+else
+  :
+fi
+
+done
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
+$as_echo_n "checking size of int... " >&6; }
+if ${ac_cv_sizeof_int+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  for ac_size in 4 8 1 2 16  ; do # List sizes in rough order of prevalence.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include "confdefs.h"
+#include <sys/types.h>
+
+
+int
+main ()
+{
+switch (0) case 0: case (sizeof (int) == $ac_size):;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sizeof_int=$ac_size
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  if test x$ac_cv_sizeof_int != x ; then break; fi
+done
+
+fi
+
+if test x$ac_cv_sizeof_int = x ; then
+  as_fn_error $? "cannot determine a size for int" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
+$as_echo "$ac_cv_sizeof_int" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
+$as_echo_n "checking size of long... " >&6; }
+if ${ac_cv_sizeof_long+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  for ac_size in 4 8 1 2 16  ; do # List sizes in rough order of prevalence.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include "confdefs.h"
+#include <sys/types.h>
+
+
+int
+main ()
+{
+switch (0) case 0: case (sizeof (long) == $ac_size):;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sizeof_long=$ac_size
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  if test x$ac_cv_sizeof_long != x ; then break; fi
+done
+
+fi
+
+if test x$ac_cv_sizeof_long = x ; then
+  as_fn_error $? "cannot determine a size for long" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
+$as_echo "$ac_cv_sizeof_long" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
+$as_echo_n "checking size of long long... " >&6; }
+if ${ac_cv_sizeof_long_long+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  for ac_size in 4 8 1 2 16  ; do # List sizes in rough order of prevalence.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include "confdefs.h"
+#include <sys/types.h>
+
+
+int
+main ()
+{
+switch (0) case 0: case (sizeof (long long) == $ac_size):;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sizeof_long_long=$ac_size
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  if test x$ac_cv_sizeof_long_long != x ; then break; fi
+done
+
+fi
+
+if test x$ac_cv_sizeof_long_long = x ; then
+  as_fn_error $? "cannot determine a size for long long" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
+$as_echo "$ac_cv_sizeof_long_long" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
+_ACEOF
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5
+$as_echo_n "checking size of size_t... " >&6; }
+if ${ac_cv_sizeof_size_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  for ac_size in 4 8 1 2 16  ; do # List sizes in rough order of prevalence.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include "confdefs.h"
+#include <sys/types.h>
+#include <stdint.h>
+
+int
+main ()
+{
+switch (0) case 0: case (sizeof (size_t) == $ac_size):;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sizeof_size_t=$ac_size
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  if test x$ac_cv_sizeof_size_t != x ; then break; fi
+done
+
+fi
+
+if test x$ac_cv_sizeof_size_t = x ; then
+  as_fn_error $? "cannot determine a size for size_t" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5
+$as_echo "$ac_cv_sizeof_size_t" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t
+_ACEOF
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int64_t" >&5
+$as_echo_n "checking size of int64_t... " >&6; }
+if ${ac_cv_sizeof_int64_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  for ac_size in 4 8 1 2 16  ; do # List sizes in rough order of prevalence.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include "confdefs.h"
+#include <sys/types.h>
+#include <stdint.h>
+
+int
+main ()
+{
+switch (0) case 0: case (sizeof (int64_t) == $ac_size):;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sizeof_int64_t=$ac_size
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  if test x$ac_cv_sizeof_int64_t != x ; then break; fi
+done
+
+fi
+
+if test x$ac_cv_sizeof_int64_t = x ; then
+  as_fn_error $? "cannot determine a size for int64_t" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int64_t" >&5
+$as_echo "$ac_cv_sizeof_int64_t" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT64_T $ac_cv_sizeof_int64_t
+_ACEOF
+
+
+
 ac_config_files="$ac_config_files Makefile json-c.pc tests/Makefile json-c-uninstalled.pc"
 
 
@@ -12639,7 +13314,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by json-c $as_me 0.12.1, which was
+This file was extended by json-c $as_me 0.13, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -12705,7 +13380,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-json-c config.status 0.12.1
+json-c config.status 0.13
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
index 4c5af94..024c5aa 100644 (file)
@@ -1,18 +1,36 @@
-AC_PREREQ(2.52)
+AC_PREREQ(2.64)
 
 # Process this file with autoconf to produce a configure script.
-AC_INIT([json-c], 0.12.1, [json-c@googlegroups.com])
+AC_INIT([json-c], 0.13, [json-c@googlegroups.com])
 
 AM_INIT_AUTOMAKE
 
+AC_CONFIG_MACRO_DIRS([autoconf-archive/m4])
+
 AC_PROG_MAKE_SET
 
+AC_CANONICAL_HOST
+
+AC_ARG_ENABLE(threading,
+ AS_HELP_STRING([--enable-threading],
+   [Enable code to support partly multi-threaded use]),
+[if test x$enableval = xyes; then
+  enable_threading=yes
+  AC_DEFINE(ENABLE_THREADING, 1, [Enable partial threading support])
+fi])
+
+if test "x$enable_threading" = "xyes"; then
+  AC_MSG_RESULT([Partial multi-threaded support enabled.])
+else
+  AC_MSG_RESULT([Multi-threaded support disabled. Use --enable-threading to enable.])
+fi
+
 AC_ARG_ENABLE(rdrand,
  AS_HELP_STRING([--enable-rdrand],
    [Enable RDRAND Hardware RNG Hash Seed generation on supported x86/x64 platforms.]),
 [if test x$enableval = xyes; then
   enable_rdrand=yes
-  AC_DEFINE(ENABLE_RDRAND, 1, [Enable RDRANR Hardware RNG Hash Seed])
+  AC_DEFINE(ENABLE_RDRAND, 1, [Enable RDRAND Hardware RNG Hash Seed])
 fi])
 
 if test "x$enable_rdrand" = "xyes"; then
@@ -21,27 +39,42 @@ else
   AC_MSG_RESULT([RDRAND Hardware RNG Hash Seed disabled. Use --enable-rdrand to enable])
 fi
 
+# enable silent build by default
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+
 # Checks for programs.
 
 # Checks for libraries.
 
 # Checks for header files.
 AM_PROG_CC_C_O
+AC_PROG_CC_C99
 AC_CONFIG_HEADER(config.h)
 AC_CONFIG_HEADER(json_config.h)
 AC_HEADER_STDC
-AC_CHECK_HEADERS(fcntl.h limits.h strings.h syslog.h unistd.h [sys/cdefs.h] [sys/param.h] stdarg.h locale.h endian.h)
+AC_CHECK_HEADERS(fcntl.h limits.h strings.h syslog.h unistd.h [sys/cdefs.h] [sys/param.h] stdarg.h locale.h xlocale.h endian.h)
 AC_CHECK_HEADER(inttypes.h,[AC_DEFINE([JSON_C_HAVE_INTTYPES_H],[1],[Public define for json_inttypes.h])])
 
 # Checks for typedefs, structures, and compiler characteristics.
 AC_C_CONST
 AC_TYPE_SIZE_T
 
+AC_CACHE_CHECK([for __thread support], ac_cv___thread, [dnl
+AC_LINK_IFELSE([dnl
+AC_LANG_PROGRAM([[#undef __thread
+static __thread int a; int foo (int b) { return a + b; }]],
+               [[exit (foo (0));]])],
+              ac_cv___thread=yes, ac_cv___thread=no)
+])
+AS_IF([test "x$ac_cv___thread" != xno],
+[AC_DEFINE(HAVE___THREAD, 1, [Have __thread])
+ AC_DEFINE(SPEC___THREAD, [__thread], [Specifier for __thread])]
+)
+
 # Checks for library functions.
 AC_FUNC_VPRINTF
 AC_FUNC_MEMCMP
-AC_FUNC_MALLOC
-AC_FUNC_REALLOC
+AC_CHECK_FUNCS([realloc])
 AC_CHECK_FUNCS(strcasecmp strdup strerror snprintf vsnprintf vasprintf open vsyslog strncasecmp setlocale)
 AC_CHECK_DECLS([INFINITY], [], [], [[#include <math.h>]])
 AC_CHECK_DECLS([nan], [], [], [[#include <math.h>]])
@@ -49,6 +82,42 @@ AC_CHECK_DECLS([isnan], [], [], [[#include <math.h>]])
 AC_CHECK_DECLS([isinf], [], [], [[#include <math.h>]])
 AC_CHECK_DECLS([_isnan], [], [], [[#include <float.h>]])
 AC_CHECK_DECLS([_finite], [], [], [[#include <float.h>]])
+AC_MSG_CHECKING(for GCC atomic builtins)
+AC_LINK_IFELSE(
+[
+ AC_LANG_SOURCE([[
+   int main() {
+      volatile unsigned int val = 1;
+      /* Note: __sync_val_compare_and_swap isn't checked here
+       * because it's protected by __GCC_HAVE_SYNC_COMPARE_AND_SWAP_<n>,
+       * which is automatically defined by gcc.
+       */
+      __sync_add_and_fetch(&val, 1);
+      __sync_sub_and_fetch(&val, 1);
+      return 0;
+   }
+ ]])
+],
+[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE([HAVE_ATOMIC_BUILTINS],[1],[Has atomic builtins])
+],
+[
+ AC_MSG_RESULT([no])
+ AC_MSG_WARN([json-c will be built without atomic refcounts because atomic builtins are missing])
+])
+
+case "${host_os}" in
+       linux*)
+               AC_CHECK_FUNCS([uselocale])
+               ;;
+       *)      # Nothing
+               ;;
+esac
+
+if test "$ac_cv_have_decl_isnan" = "yes" ; then
+   AC_TRY_LINK([#include <math.h>], [float f = 0.0; return isnan(f)], [], [LIBS="$LIBS -lm"])
+fi
 
 #check if .section.gnu.warning accepts long strings (for __warn_references)
 AC_LANG_PUSH([C])
@@ -68,7 +137,7 @@ int main(int c,char* v) {return 0;}
 
 AC_LANG_POP([C])
 
-AM_PROG_LIBTOOL
+LT_INIT
 
 # Check for the -Bsymbolic-functions linker flag
 AC_ARG_ENABLE([Bsymbolic],
@@ -96,6 +165,16 @@ AS_IF([test "x$enable_Bsymbolic" = "xcheck"],
 AS_IF([test "x$enable_Bsymbolic" = "xyes"], [JSON_BSYMBOLIC_LDFLAGS=-Wl[,]-Bsymbolic-functions])
 AC_SUBST(JSON_BSYMBOLIC_LDFLAGS)
 
+AX_APPEND_COMPILE_FLAGS([-Wall -Werror -Wcast-qual -Wno-error=deprecated-declarations])
+AX_APPEND_COMPILE_FLAGS([-Wextra -Wwrite-string -Wno-unused-parameter])
+AX_APPEND_COMPILE_FLAGS([-D_GNU_SOURCE -D_REENTRANT])
+
+AX_COMPILE_CHECK_SIZEOF(int)
+AX_COMPILE_CHECK_SIZEOF(long)
+AX_COMPILE_CHECK_SIZEOF(long long)
+AX_COMPILE_CHECK_SIZEOF(size_t, [#include <stdint.h>])
+AX_COMPILE_CHECK_SIZEOF(int64_t, [#include <stdint.h>])
+
 AC_CONFIG_FILES([
 Makefile
 json-c.pc
diff --git a/debug.c b/debug.c
index 3b64b59..4b5140a 100644 (file)
--- a/debug.c
+++ b/debug.c
@@ -76,7 +76,7 @@ void mc_info(const char *msg, ...)
 #if HAVE_VSYSLOG
     if(_syslog) {
                vsyslog(LOG_INFO, msg, ap);
-       } else 
+       } else
 #endif
                vfprintf(stderr, msg, ap);
   va_end(ap);
diff --git a/debug.h b/debug.h
index 80ca3e4..07fcc38 100644 (file)
--- a/debug.h
+++ b/debug.h
  *
  */
 
+/**
+ * @file
+ * @brief Do not use, json-c internal, may be changed or removed at any time.
+ */
 #ifndef _DEBUG_H_
 #define _DEBUG_H_
 
diff --git a/doc/html/README_8md.html b/doc/html/README_8md.html
new file mode 100644 (file)
index 0000000..09c589b
--- /dev/null
@@ -0,0 +1,53 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>json-c: README.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">json-c
+   &#160;<span id="projectnumber">0.13</span>
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">README.md File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
index d92e346..9263f56 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Data Structures</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
@@ -64,9 +59,9 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 10:06:46 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 272beac..1ca054a 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: arraylist.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
@@ -52,6 +47,9 @@
 <div class="title">arraylist.h File Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
+
+<p>Internal methods for working with json_type_array objects. Although this is exposed by the <a class="el" href="json__object_8h.html#a23d20e3f886c1638a7116be66b7b5ec2">json_object_get_array()</a> method, it is not recommended for direct use.  
+<a href="#details">More...</a></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
 Data Structures</h2></td></tr>
@@ -65,28 +63,38 @@ Macros</h2></td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
 Typedefs</h2></td></tr>
-<tr class="memitem:a41e5f51b1befa448b861e61a2c352bd6"><td class="memItemLeft" align="right" valign="top">typedef void(&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#a41e5f51b1befa448b861e61a2c352bd6">array_list_free_fn</a>) (void *data)</td></tr>
-<tr class="separator:a41e5f51b1befa448b861e61a2c352bd6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a90d2ce204a483fa38f5514bad67222aa"><td class="memItemLeft" align="right" valign="top">typedef void()&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#a90d2ce204a483fa38f5514bad67222aa">array_list_free_fn</a>(void *data)</td></tr>
+<tr class="separator:a90d2ce204a483fa38f5514bad67222aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6d6d32d8b026ea2025df519b9e90f44a"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structarray__list.html">array_list</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#a6d6d32d8b026ea2025df519b9e90f44a">array_list</a></td></tr>
+<tr class="separator:a6d6d32d8b026ea2025df519b9e90f44a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:a0d4bfac055dfd98e17296142abf4d894"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structarray__list.html">array_list</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#a0d4bfac055dfd98e17296142abf4d894">array_list_new</a> (<a class="el" href="arraylist_8h.html#a41e5f51b1befa448b861e61a2c352bd6">array_list_free_fn</a> *free_fn)</td></tr>
+<tr class="memitem:a0d4bfac055dfd98e17296142abf4d894"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structarray__list.html">array_list</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#a0d4bfac055dfd98e17296142abf4d894">array_list_new</a> (<a class="el" href="arraylist_8h.html#a90d2ce204a483fa38f5514bad67222aa">array_list_free_fn</a> *free_fn)</td></tr>
 <tr class="separator:a0d4bfac055dfd98e17296142abf4d894"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:acd00fb70f7ca82f23b48b812c3498f67"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#acd00fb70f7ca82f23b48b812c3498f67">array_list_free</a> (struct <a class="el" href="structarray__list.html">array_list</a> *al)</td></tr>
 <tr class="separator:acd00fb70f7ca82f23b48b812c3498f67"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aa16207e545b6c1265299abcfa418dc2b"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#aa16207e545b6c1265299abcfa418dc2b">array_list_get_idx</a> (struct <a class="el" href="structarray__list.html">array_list</a> *al, int i)</td></tr>
-<tr class="separator:aa16207e545b6c1265299abcfa418dc2b"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a21b8e4c59e52fbc5a9a5a098e3f96e76"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#a21b8e4c59e52fbc5a9a5a098e3f96e76">array_list_put_idx</a> (struct <a class="el" href="structarray__list.html">array_list</a> *al, int i, void *data)</td></tr>
-<tr class="separator:a21b8e4c59e52fbc5a9a5a098e3f96e76"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a114f1af5b20b76a3dbb2d1d055006df8"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#a114f1af5b20b76a3dbb2d1d055006df8">array_list_get_idx</a> (struct <a class="el" href="structarray__list.html">array_list</a> *al, size_t i)</td></tr>
+<tr class="separator:a114f1af5b20b76a3dbb2d1d055006df8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9f92076e9d8229f8a07e536dc286f811"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#a9f92076e9d8229f8a07e536dc286f811">array_list_put_idx</a> (struct <a class="el" href="structarray__list.html">array_list</a> *al, size_t i, void *data)</td></tr>
+<tr class="separator:a9f92076e9d8229f8a07e536dc286f811"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a6e995608aa464244ff3184fb43574dc8"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#a6e995608aa464244ff3184fb43574dc8">array_list_add</a> (struct <a class="el" href="structarray__list.html">array_list</a> *al, void *data)</td></tr>
 <tr class="separator:a6e995608aa464244ff3184fb43574dc8"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aa8393b4aa3dc447660371530439ab70f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#aa8393b4aa3dc447660371530439ab70f">array_list_length</a> (struct <a class="el" href="structarray__list.html">array_list</a> *al)</td></tr>
-<tr class="separator:aa8393b4aa3dc447660371530439ab70f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa3bf90f47aa210032304b14e7ad09ef7"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#aa3bf90f47aa210032304b14e7ad09ef7">array_list_length</a> (struct <a class="el" href="structarray__list.html">array_list</a> *al)</td></tr>
+<tr class="separator:aa3bf90f47aa210032304b14e7ad09ef7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:afb67cc8e2e5c9be41c3e644536079169"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#afb67cc8e2e5c9be41c3e644536079169">array_list_sort</a> (struct <a class="el" href="structarray__list.html">array_list</a> *arr, int(*compar)(const void *, const void *))</td></tr>
 <tr class="separator:afb67cc8e2e5c9be41c3e644536079169"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8dae21354e818f13dbe4e952daec2669"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#a8dae21354e818f13dbe4e952daec2669">array_list_bsearch</a> (const void **key, struct <a class="el" href="structarray__list.html">array_list</a> *arr, int(*sort_fn)(const void *, const void *))</td></tr>
+<tr class="separator:a8dae21354e818f13dbe4e952daec2669"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aecedd8601ee96e2fd8eff5d83fda89ab"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#aecedd8601ee96e2fd8eff5d83fda89ab">array_list_del_idx</a> (struct <a class="el" href="structarray__list.html">array_list</a> *arr, size_t idx, size_t count)</td></tr>
+<tr class="separator:aecedd8601ee96e2fd8eff5d83fda89ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
-<h2 class="groupheader">Macro Definition Documentation</h2>
-<a class="anchor" id="acd30d910b398421574eb1f59e78617f5"></a>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Internal methods for working with json_type_array objects. Although this is exposed by the <a class="el" href="json__object_8h.html#a23d20e3f886c1638a7116be66b7b5ec2">json_object_get_array()</a> method, it is not recommended for direct use. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="acd30d910b398421574eb1f59e78617f5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd30d910b398421574eb1f59e78617f5">&#9670;&nbsp;</a></span>ARRAY_LIST_DEFAULT_SIZE</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -99,12 +107,28 @@ Functions</h2></td></tr>
 </div>
 </div>
 <h2 class="groupheader">Typedef Documentation</h2>
-<a class="anchor" id="a41e5f51b1befa448b861e61a2c352bd6"></a>
+<a id="a6d6d32d8b026ea2025df519b9e90f44a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6d6d32d8b026ea2025df519b9e90f44a">&#9670;&nbsp;</a></span>array_list</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef void( array_list_free_fn) (void *data)</td>
+          <td class="memname">typedef struct <a class="el" href="structarray__list.html">array_list</a> <a class="el" href="structarray__list.html">array_list</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a90d2ce204a483fa38f5514bad67222aa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a90d2ce204a483fa38f5514bad67222aa">&#9670;&nbsp;</a></span>array_list_free_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void() array_list_free_fn(void *data)</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -112,7 +136,9 @@ Functions</h2></td></tr>
 </div>
 </div>
 <h2 class="groupheader">Function Documentation</h2>
-<a class="anchor" id="a6e995608aa464244ff3184fb43574dc8"></a>
+<a id="a6e995608aa464244ff3184fb43574dc8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6e995608aa464244ff3184fb43574dc8">&#9670;&nbsp;</a></span>array_list_add()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -138,7 +164,77 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="acd00fb70f7ca82f23b48b812c3498f67"></a>
+<a id="a8dae21354e818f13dbe4e952daec2669"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8dae21354e818f13dbe4e952daec2669">&#9670;&nbsp;</a></span>array_list_bsearch()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* array_list_bsearch </td>
+          <td>(</td>
+          <td class="paramtype">const void **&#160;</td>
+          <td class="paramname"><em>key</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structarray__list.html">array_list</a> *&#160;</td>
+          <td class="paramname"><em>arr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int(*)(const void *, const void *)&#160;</td>
+          <td class="paramname"><em>sort_fn</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aecedd8601ee96e2fd8eff5d83fda89ab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aecedd8601ee96e2fd8eff5d83fda89ab">&#9670;&nbsp;</a></span>array_list_del_idx()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int array_list_del_idx </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structarray__list.html">array_list</a> *&#160;</td>
+          <td class="paramname"><em>arr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>idx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>count</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="acd00fb70f7ca82f23b48b812c3498f67"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd00fb70f7ca82f23b48b812c3498f67">&#9670;&nbsp;</a></span>array_list_free()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -154,7 +250,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="aa16207e545b6c1265299abcfa418dc2b"></a>
+<a id="a114f1af5b20b76a3dbb2d1d055006df8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a114f1af5b20b76a3dbb2d1d055006df8">&#9670;&nbsp;</a></span>array_list_get_idx()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -167,7 +265,7 @@ Functions</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">int&#160;</td>
+          <td class="paramtype">size_t&#160;</td>
           <td class="paramname"><em>i</em>&#160;</td>
         </tr>
         <tr>
@@ -180,12 +278,14 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="aa8393b4aa3dc447660371530439ab70f"></a>
+<a id="aa3bf90f47aa210032304b14e7ad09ef7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa3bf90f47aa210032304b14e7ad09ef7">&#9670;&nbsp;</a></span>array_list_length()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int array_list_length </td>
+          <td class="memname">size_t array_list_length </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structarray__list.html">array_list</a> *&#160;</td>
           <td class="paramname"><em>al</em></td><td>)</td>
@@ -196,14 +296,16 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a0d4bfac055dfd98e17296142abf4d894"></a>
+<a id="a0d4bfac055dfd98e17296142abf4d894"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0d4bfac055dfd98e17296142abf4d894">&#9670;&nbsp;</a></span>array_list_new()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
           <td class="memname">struct <a class="el" href="structarray__list.html">array_list</a>* array_list_new </td>
           <td>(</td>
-          <td class="paramtype"><a class="el" href="arraylist_8h.html#a41e5f51b1befa448b861e61a2c352bd6">array_list_free_fn</a> *&#160;</td>
+          <td class="paramtype"><a class="el" href="arraylist_8h.html#a90d2ce204a483fa38f5514bad67222aa">array_list_free_fn</a> *&#160;</td>
           <td class="paramname"><em>free_fn</em></td><td>)</td>
           <td></td>
         </tr>
@@ -212,7 +314,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a21b8e4c59e52fbc5a9a5a098e3f96e76"></a>
+<a id="a9f92076e9d8229f8a07e536dc286f811"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9f92076e9d8229f8a07e536dc286f811">&#9670;&nbsp;</a></span>array_list_put_idx()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -225,7 +329,7 @@ Functions</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">int&#160;</td>
+          <td class="paramtype">size_t&#160;</td>
           <td class="paramname"><em>i</em>, </td>
         </tr>
         <tr>
@@ -244,7 +348,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="afb67cc8e2e5c9be41c3e644536079169"></a>
+<a id="afb67cc8e2e5c9be41c3e644536079169"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afb67cc8e2e5c9be41c3e644536079169">&#9670;&nbsp;</a></span>array_list_sort()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -273,9 +379,9 @@ Functions</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 12:33:58 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
diff --git a/doc/html/arrowdown.png b/doc/html/arrowdown.png
deleted file mode 100644 (file)
index 0b63f6d..0000000
Binary files a/doc/html/arrowdown.png and /dev/null differ
diff --git a/doc/html/arrowright.png b/doc/html/arrowright.png
deleted file mode 100644 (file)
index c6ee22f..0000000
Binary files a/doc/html/arrowright.png and /dev/null differ
index 61d10f4..9cf544a 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: bits.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
 <div class="title">bits.h File Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
+
+<p>Do not use, only contains deprecated defines.  
+<a href="#details">More...</a></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
 Macros</h2></td></tr>
-<tr class="memitem:a3dde282dc23d0eaa3c4840df8dc262d4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bits_8h.html#a3dde282dc23d0eaa3c4840df8dc262d4">json_min</a>(a,  b)&#160;&#160;&#160;((a) &lt; (b) ? (a) : (b))</td></tr>
-<tr class="separator:a3dde282dc23d0eaa3c4840df8dc262d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a57d63d199d4b9ea40359253618951300"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bits_8h.html#a57d63d199d4b9ea40359253618951300">json_max</a>(a,  b)&#160;&#160;&#160;((a) &gt; (b) ? (a) : (b))</td></tr>
-<tr class="separator:a57d63d199d4b9ea40359253618951300"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a1cf38b22d3a118ad48d9282c32c048aa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bits_8h.html#a1cf38b22d3a118ad48d9282c32c048aa">hexdigit</a>(x)&#160;&#160;&#160;(((x) &lt;= '9') ? (x) - '0' : ((x) &amp; 7) + 9)</td></tr>
 <tr class="separator:a1cf38b22d3a118ad48d9282c32c048aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a863a898e607f8c2ff87b7052e326740f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bits_8h.html#a863a898e607f8c2ff87b7052e326740f">error_ptr</a>(error)&#160;&#160;&#160;((void*)error)</td></tr>
 <tr class="separator:a863a898e607f8c2ff87b7052e326740f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a45afe86501cd57ee2beeef9d67a4d40c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bits_8h.html#a45afe86501cd57ee2beeef9d67a4d40c">error_description</a>(error)&#160;&#160;&#160;(json_tokener_errors[error])</td></tr>
+<tr class="memitem:a45afe86501cd57ee2beeef9d67a4d40c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bits_8h.html#a45afe86501cd57ee2beeef9d67a4d40c">error_description</a>(error)&#160;&#160;&#160;(<a class="el" href="json__tokener_8h.html#af5d7ffd95a0f6e5d5bb5994d233b4197">json_tokener_get_error</a>(error))</td></tr>
 <tr class="separator:a45afe86501cd57ee2beeef9d67a4d40c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a4a887e5fb7cde221bcab9c6f39d93fc1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bits_8h.html#a4a887e5fb7cde221bcab9c6f39d93fc1">is_error</a>(ptr)&#160;&#160;&#160;(ptr == NULL)</td></tr>
 <tr class="separator:a4a887e5fb7cde221bcab9c6f39d93fc1"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
-<h2 class="groupheader">Macro Definition Documentation</h2>
-<a class="anchor" id="a45afe86501cd57ee2beeef9d67a4d40c"></a>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Do not use, only contains deprecated defines. </p>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>Use <a class="el" href="json__util_8h.html" title="Miscllaneous utility functions and macros. ">json_util.h</a> instead.</dd></dl>
+<dl class="section rcs"><dt>Id</dt><dd><a class="el" href="bits_8h.html" title="Do not use, only contains deprecated defines. ">bits.h</a>,v 1.10 2006/01/30 23:07:57 mclark Exp </dd></dl>
+<p>Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. Michael Clark <a href="#" onclick="location.href='mai'+'lto:'+'mic'+'ha'+'el@'+'me'+'tap'+'ar'+'adi'+'gm'+'.co'+'m'; return false;">micha<span style="display: none;">.nosp@m.</span>el@m<span style="display: none;">.nosp@m.</span>etapa<span style="display: none;">.nosp@m.</span>radi<span style="display: none;">.nosp@m.</span>gm.co<span style="display: none;">.nosp@m.</span>m</a></p>
+<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. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a45afe86501cd57ee2beeef9d67a4d40c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a45afe86501cd57ee2beeef9d67a4d40c">&#9670;&nbsp;</a></span>error_description</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -75,14 +77,17 @@ Macros</h2></td></tr>
           <td>(</td>
           <td class="paramtype">&#160;</td>
           <td class="paramname">error</td><td>)</td>
-          <td>&#160;&#160;&#160;(json_tokener_errors[error])</td>
+          <td>&#160;&#160;&#160;(<a class="el" href="json__tokener_8h.html#af5d7ffd95a0f6e5d5bb5994d233b4197">json_tokener_get_error</a>(error))</td>
         </tr>
       </table>
 </div><div class="memdoc">
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000004">Deprecated:</a></b></dt><dd></dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="a863a898e607f8c2ff87b7052e326740f"></a>
+<a id="a863a898e607f8c2ff87b7052e326740f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a863a898e607f8c2ff87b7052e326740f">&#9670;&nbsp;</a></span>error_ptr</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -95,10 +100,13 @@ Macros</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000003">Deprecated:</a></b></dt><dd></dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="a1cf38b22d3a118ad48d9282c32c048aa"></a>
+<a id="a1cf38b22d3a118ad48d9282c32c048aa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1cf38b22d3a118ad48d9282c32c048aa">&#9670;&nbsp;</a></span>hexdigit</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -111,10 +119,13 @@ Macros</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd></dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="a4a887e5fb7cde221bcab9c6f39d93fc1"></a>
+<a id="a4a887e5fb7cde221bcab9c6f39d93fc1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4a887e5fb7cde221bcab9c6f39d93fc1">&#9670;&nbsp;</a></span>is_error</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -127,67 +138,16 @@ Macros</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-
-</div>
-</div>
-<a class="anchor" id="a57d63d199d4b9ea40359253618951300"></a>
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">#define json_max</td>
-          <td>(</td>
-          <td class="paramtype">&#160;</td>
-          <td class="paramname">a, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">&#160;</td>
-          <td class="paramname">b&#160;</td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td>&#160;&#160;&#160;((a) &gt; (b) ? (a) : (b))</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-
-</div>
-</div>
-<a class="anchor" id="a3dde282dc23d0eaa3c4840df8dc262d4"></a>
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">#define json_min</td>
-          <td>(</td>
-          <td class="paramtype">&#160;</td>
-          <td class="paramname">a, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">&#160;</td>
-          <td class="paramname">b&#160;</td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td>&#160;&#160;&#160;((a) &lt; (b) ? (a) : (b))</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000005">Deprecated:</a></b></dt><dd></dd></dl>
 
 </div>
 </div>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 02:04:38 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 687d4b6..ba882df 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Data Structure Index</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
 <div class="title">Data Structure Index</div>  </div>
 </div><!--header-->
 <div class="contents">
-<div class="qindex"><a class="qindex" href="#letter_A">A</a>&#160;|&#160;<a class="qindex" href="#letter_D">D</a>&#160;|&#160;<a class="qindex" href="#letter_J">J</a>&#160;|&#160;<a class="qindex" href="#letter_L">L</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a></div>
-<table style="margin: 10px; white-space: nowrap;" align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
+<div class="qindex"><a class="qindex" href="#letter_a">a</a>&#160;|&#160;<a class="qindex" href="#letter_d">d</a>&#160;|&#160;<a class="qindex" href="#letter_j">j</a>&#160;|&#160;<a class="qindex" href="#letter_l">l</a>&#160;|&#160;<a class="qindex" href="#letter_p">p</a></div>
+<table class="classindex">
 <tr><td rowspan="2" valign="bottom"><a name="letter_a"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;a&#160;&#160;</div></td></tr></table>
 </td><td rowspan="2" valign="bottom"><a name="letter_j"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;j&#160;&#160;</div></td></tr></table>
 </td><td valign="top"><a class="el" href="structjson__object__iterator.html">json_object_iterator</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structlh__table.html">lh_table</a>&#160;&#160;&#160;</td><td></td></tr>
 <tr><td valign="top"><a class="el" href="unionjson__object_1_1data.html">json_object::data</a>&#160;&#160;&#160;</td><td></td><td valign="top"><a class="el" href="structlh__entry.html">lh_entry</a>&#160;&#160;&#160;</td><td></td><td></td></tr>
 <tr><td></td><td></td><td></td><td></td><td></td></tr>
 </table>
-<div class="qindex"><a class="qindex" href="#letter_A">A</a>&#160;|&#160;<a class="qindex" href="#letter_D">D</a>&#160;|&#160;<a class="qindex" href="#letter_J">J</a>&#160;|&#160;<a class="qindex" href="#letter_L">L</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a></div>
+<div class="qindex"><a class="qindex" href="#letter_a">a</a>&#160;|&#160;<a class="qindex" href="#letter_d">d</a>&#160;|&#160;<a class="qindex" href="#letter_j">j</a>&#160;|&#160;<a class="qindex" href="#letter_l">l</a>&#160;|&#160;<a class="qindex" href="#letter_p">p</a></div>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 19:34:14 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index cea7cff..38c4a19 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: debug.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
@@ -50,6 +45,9 @@
 <div class="title">debug.h File Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
+
+<p>Do not use, json-c internal, may be changed or removed at any time.  
+<a href="#details">More...</a></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
 Macros</h2></td></tr>
@@ -85,8 +83,12 @@ Functions</h2></td></tr>
 <tr class="memitem:acbb92996a994e316ff65ed3a026e12a4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#acbb92996a994e316ff65ed3a026e12a4">mc_info</a> (const char *msg,...)</td></tr>
 <tr class="separator:acbb92996a994e316ff65ed3a026e12a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
-<h2 class="groupheader">Macro Definition Documentation</h2>
-<a class="anchor" id="a375c4dc9f0fb338999de81aab826f9d6"></a>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Do not use, json-c internal, may be changed or removed at any time. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a375c4dc9f0fb338999de81aab826f9d6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a375c4dc9f0fb338999de81aab826f9d6">&#9670;&nbsp;</a></span>__STRING</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -102,7 +104,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a8ca29550d5b1b73948f4a7bce53f2385"></a>
+<a id="a8ca29550d5b1b73948f4a7bce53f2385"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8ca29550d5b1b73948f4a7bce53f2385">&#9670;&nbsp;</a></span>JASSERT</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -118,7 +122,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="afda355b35d18bf2e6a2a22d5c8eef42c"></a>
+<a id="afda355b35d18bf2e6a2a22d5c8eef42c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afda355b35d18bf2e6a2a22d5c8eef42c">&#9670;&nbsp;</a></span>MC_DEBUG</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -144,7 +150,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a11ba39cecbe449af5b86fa2f78e9da9d"></a>
+<a id="a11ba39cecbe449af5b86fa2f78e9da9d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a11ba39cecbe449af5b86fa2f78e9da9d">&#9670;&nbsp;</a></span>MC_ERROR</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -170,7 +178,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="acb272a4b4444b69cd995236f167f90ba"></a>
+<a id="acb272a4b4444b69cd995236f167f90ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acb272a4b4444b69cd995236f167f90ba">&#9670;&nbsp;</a></span>MC_GET_DEBUG</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -185,7 +195,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a5ef640ce1e9e61c5f6632aefbbfa0041"></a>
+<a id="a5ef640ce1e9e61c5f6632aefbbfa0041"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5ef640ce1e9e61c5f6632aefbbfa0041">&#9670;&nbsp;</a></span>MC_INFO</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -211,7 +223,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a50f21a239fa040a10ad4cfdb4278b02b"></a>
+<a id="a50f21a239fa040a10ad4cfdb4278b02b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a50f21a239fa040a10ad4cfdb4278b02b">&#9670;&nbsp;</a></span>MC_SET_DEBUG</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -227,7 +241,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="acf1e895cb5eb7f334cbe51901e6bb918"></a>
+<a id="acf1e895cb5eb7f334cbe51901e6bb918"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acf1e895cb5eb7f334cbe51901e6bb918">&#9670;&nbsp;</a></span>MC_SET_SYSLOG</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -244,7 +260,9 @@ Functions</h2></td></tr>
 </div>
 </div>
 <h2 class="groupheader">Function Documentation</h2>
-<a class="anchor" id="a600cf4cbbe19c0c15ca3710210e35aba"></a>
+<a id="a600cf4cbbe19c0c15ca3710210e35aba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a600cf4cbbe19c0c15ca3710210e35aba">&#9670;&nbsp;</a></span>mc_debug()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -270,7 +288,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="abf22ea3a331c7ff21c23da91a07c7cb2"></a>
+<a id="abf22ea3a331c7ff21c23da91a07c7cb2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf22ea3a331c7ff21c23da91a07c7cb2">&#9670;&nbsp;</a></span>mc_error()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -296,7 +316,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a3b3ab3ae8b438384fb109a2e38646b6e"></a>
+<a id="a3b3ab3ae8b438384fb109a2e38646b6e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3b3ab3ae8b438384fb109a2e38646b6e">&#9670;&nbsp;</a></span>mc_get_debug()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -312,7 +334,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="acbb92996a994e316ff65ed3a026e12a4"></a>
+<a id="acbb92996a994e316ff65ed3a026e12a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acbb92996a994e316ff65ed3a026e12a4">&#9670;&nbsp;</a></span>mc_info()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -338,7 +362,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="af65a73617b71476020a005b20bf02726"></a>
+<a id="af65a73617b71476020a005b20bf02726"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af65a73617b71476020a005b20bf02726">&#9670;&nbsp;</a></span>mc_set_debug()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -354,7 +380,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="aadb888da410116384e75a00db30da705"></a>
+<a id="aadb888da410116384e75a00db30da705"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aadb888da410116384e75a00db30da705">&#9670;&nbsp;</a></span>mc_set_syslog()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -373,9 +401,9 @@ Functions</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 16:05:10 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index bae840e..adac0e8 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Deprecated List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
 </div><!--header-->
 <div class="contents">
 <div class="textblock"><dl class="reflist">
-<dt><a class="anchor" id="_deprecated000001"></a>globalScope&gt; Global <a class="el" href="json__object_8h.html#a1345aaf3ee46e9b6185355b733ec362d">THIS_FUNCTION_IS_DEPRECATED</a>  (extern struct <a class="el" href="structjson__object.html">json_object</a> *json_object_object_get(struct <a class="el" href="structjson__object.html">json_object</a> *obj, const char *key))</dt>
-<dd>Please use json_object_object_get_ex  </dd>
-<dt><a class="anchor" id="_deprecated000002"></a>globalScope&gt; Global <a class="el" href="linkhash_8h.html#a849aa0ce9fe550c16ce81a215b1765ad">THIS_FUNCTION_IS_DEPRECATED</a>  (extern const void *lh_table_lookup(struct <a class="el" href="structlh__table.html">lh_table</a> *t, const void *k))</dt>
-<dd>Use lh_table_lookup_ex instead. </dd>
+<dt><a class="anchor" id="_deprecated000009"></a>Global <a class="el" href="linkhash_8h.html#a77c5cddef96e6f1ab036ccf911783456">_LH_INLINE</a>  </dt>
+<dd>Don't use this outside of <a class="el" href="linkhash_8h.html" title="Internal methods for working with json_type_object objects. Although this is exposed by the json_obje...">linkhash.h</a>:  </dd>
+<dt><a class="anchor" id="_deprecated000010"></a>Global <a class="el" href="linkhash_8h.html#afb856ed4a9bcfd090dde5151fa3ad9ae">_LH_UNCONST</a>  (a)</dt>
+<dd>Don't use this outside of <a class="el" href="linkhash_8h.html" title="Internal methods for working with json_type_object objects. Although this is exposed by the json_obje...">linkhash.h</a>:  </dd>
+<dt><a class="anchor" id="_deprecated000001"></a>File <a class="el" href="bits_8h.html">bits.h</a>  </dt>
+<dd>Use <a class="el" href="json__util_8h.html" title="Miscllaneous utility functions and macros. ">json_util.h</a> instead. </dd>
+<dt><a class="anchor" id="_deprecated000004"></a>Global <a class="el" href="bits_8h.html#a45afe86501cd57ee2beeef9d67a4d40c">error_description</a>  (error)</dt>
+<dd></dd>
+<dt><a class="anchor" id="_deprecated000003"></a>Global <a class="el" href="bits_8h.html#a863a898e607f8c2ff87b7052e326740f">error_ptr</a>  (error)</dt>
+<dd></dd>
+<dt><a class="anchor" id="_deprecated000002"></a>Global <a class="el" href="bits_8h.html#a1cf38b22d3a118ad48d9282c32c048aa">hexdigit</a>  (x)</dt>
+<dd></dd>
+<dt><a class="anchor" id="_deprecated000005"></a>Global <a class="el" href="bits_8h.html#a4a887e5fb7cde221bcab9c6f39d93fc1">is_error</a>  (ptr)</dt>
+<dd></dd>
+<dt><a class="anchor" id="_deprecated000006"></a>Global <a class="el" href="json__tokener_8h.html#a4dd5e5b65aee7f376f529f86b210ff49">json_tokener</a>  </dt>
+<dd>Unused in json-c code  </dd>
+<dt><a class="anchor" id="_deprecated000008"></a>Global <a class="el" href="linkhash_8h.html#a1294160fa0e80cee04cd745a401f43a4">lh_abort</a>  (const char *msg,...)</dt>
+<dd>Since it is not a good idea to exit the entire program because of an internal library failure, json-c will no longer use this function internally. However, because its interface is public, it will remain part of the API on the off chance of legacy software using it externally.  </dd>
+<dt><a class="anchor" id="_deprecated000007"></a>Global <a class="el" href="linkhash_8h.html#a49c27f18a174eaf126d1b7953df13cb1">lh_table_lookup</a>  (struct <a class="el" href="structlh__table.html">lh_table</a> *t, const void *k)</dt>
+<dd>Use <a class="el" href="linkhash_8h.html#a81c270bb0dd9d5c8a3e7ae20bc4d67f3">lh_table_lookup_ex()</a> instead. </dd>
 </dl>
 </div></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 16:35:02 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index a000833..4f1ab91 100644 (file)
@@ -1,9 +1,13 @@
-/* The standard CSS for doxygen 1.8.9.1 */
+/* The standard CSS for doxygen 1.8.13 */
 
 body, table, div, p, dl {
        font: 400 14px/22px Roboto,sans-serif;
 }
 
+p.reference, p.definition {
+       font: 400 14px/22px Roboto,sans-serif;
+}
+
 /* @group Heading Levels */
 
 h1.groupheader {
@@ -173,7 +177,7 @@ pre.fragment {
 }
 
 div.fragment {
-        padding: 4px 6px;
+        padding: 0px;
         margin: 4px 8px 4px 2px;
        background-color: #FBFCFD;
        border: 1px solid #C4CFE5;
@@ -206,6 +210,11 @@ div.line {
        transition-duration: 0.5s;
 }
 
+div.line:after {
+    content:"\000A";
+    white-space: pre;
+}
+
 div.line.glow {
        background-color: cyan;
        box-shadow: 0 0 10px cyan;
@@ -227,6 +236,15 @@ span.lineno a:hover {
        background-color: #C8C8C8;
 }
 
+.lineno {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+       -khtml-user-select: none;
+       -moz-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
 div.ah, span.ah {
        background-color: black;
        font-weight: bold;
@@ -242,7 +260,7 @@ div.ah, span.ah {
        -webkit-box-shadow: 2px 2px 3px #999;
        -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
        background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
-       background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+       background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%);
 }
 
 div.classindex ul {
@@ -496,6 +514,29 @@ table.memberdecls {
 
 /* Styles for detailed member documentation */
 
+.memtitle {
+       padding: 8px;
+       border-top: 1px solid #A8B8D9;
+       border-left: 1px solid #A8B8D9;
+       border-right: 1px solid #A8B8D9;
+       border-top-right-radius: 4px;
+       border-top-left-radius: 4px;
+       margin-bottom: -1px;
+       background-image: url('nav_f.png');
+       background-repeat: repeat-x;
+       background-color: #E2E8F2;
+       line-height: 1.25;
+       font-weight: 300;
+       float:left;
+}
+
+.permalink
+{
+        font-size: 65%;
+        display: inline-block;
+        vertical-align: middle;
+}
+
 .memtemplate {
        font-size: 80%;
        color: #4665A2;
@@ -534,7 +575,7 @@ table.memberdecls {
 }
 
 .memname {
-        font-weight: bold;
+        font-weight: 400;
         margin-left: 6px;
 }
 
@@ -550,24 +591,24 @@ table.memberdecls {
         color: #253555;
         font-weight: bold;
         text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
-        background-image:url('nav_f.png');
-        background-repeat:repeat-x;
-        background-color: #E2E8F2;
+        background-color: #DFE5F1;
         /* opera specific markup */
         box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
         border-top-right-radius: 4px;
-        border-top-left-radius: 4px;
         /* firefox specific markup */
         -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
         -moz-border-radius-topright: 4px;
-        -moz-border-radius-topleft: 4px;
         /* webkit specific markup */
         -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
         -webkit-border-top-right-radius: 4px;
-        -webkit-border-top-left-radius: 4px;
 
 }
 
+.overload {
+        font-family: "courier new",courier,monospace;
+       font-size: 65%;
+}
+
 .memdoc, dl.reflist dd {
         border-bottom: 1px solid #A8B8D9;      
         border-left: 1px solid #A8B8D9;      
@@ -832,6 +873,10 @@ address {
        color: #2A3D61;
 }
 
+table.doxtable caption {
+       caption-side: top;
+}
+
 table.doxtable {
        border-collapse:collapse;
         margin-top: 4px;
@@ -905,6 +950,7 @@ table.fieldtable {
         padding-bottom: 4px;
         padding-top: 5px;
         text-align:left;
+        font-weight: 400;
         -moz-border-radius-topleft: 4px;
         -moz-border-radius-topright: 4px;
         -webkit-border-top-left-radius: 4px;
@@ -997,6 +1043,18 @@ div.summary a
        white-space: nowrap;
 }
 
+table.classindex
+{
+        margin: 10px;
+        white-space: nowrap;
+        margin-left: 3%;
+        margin-right: 3%;
+        width: 94%;
+        border: 0;
+        border-spacing: 0; 
+        padding: 0;
+}
+
 div.ingroups
 {
        font-size: 8pt;
@@ -1108,6 +1166,11 @@ dl.section dd {
        border: 0px none;
 }
  
+#projectalign
+{
+        vertical-align: middle;
+}
+
 #projectname
 {
        font: 300% Tahoma, Arial,sans-serif;
@@ -1152,6 +1215,11 @@ dl.section dd {
         text-align: center;
 }
 
+.plantumlgraph
+{
+        text-align: center;
+}
+
 .diagraph
 {
         text-align: center;
@@ -1191,7 +1259,7 @@ div.toc {
         border-radius: 7px 7px 7px 7px;
         float: right;
         height: auto;
-        margin: 0 20px 10px 10px;
+        margin: 0 8px 10px 10px;
         width: 200px;
 }
 
@@ -1447,3 +1515,82 @@ tr.heading h2 {
   }
 }
 
+/* @group Markdown */
+
+/*
+table.markdownTable {
+       border-collapse:collapse;
+        margin-top: 4px;
+        margin-bottom: 4px;
+}
+
+table.markdownTable td, table.markdownTable th {
+       border: 1px solid #2D4068;
+       padding: 3px 7px 2px;
+}
+
+table.markdownTableHead tr {
+}
+
+table.markdownTableBodyLeft td, table.markdownTable th {
+       border: 1px solid #2D4068;
+       padding: 3px 7px 2px;
+}
+
+th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone {
+       background-color: #374F7F;
+       color: #FFFFFF;
+       font-size: 110%;
+       padding-bottom: 4px;
+       padding-top: 5px;
+}
+
+th.markdownTableHeadLeft {
+       text-align: left
+}
+
+th.markdownTableHeadRight {
+       text-align: right
+}
+
+th.markdownTableHeadCenter {
+       text-align: center
+}
+*/
+
+table.markdownTable {
+       border-collapse:collapse;
+        margin-top: 4px;
+        margin-bottom: 4px;
+}
+
+table.markdownTable td, table.markdownTable th {
+       border: 1px solid #2D4068;
+       padding: 3px 7px 2px;
+}
+
+table.markdownTable tr {
+}
+
+th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
+       background-color: #374F7F;
+       color: #FFFFFF;
+       font-size: 110%;
+       padding-bottom: 4px;
+       padding-top: 5px;
+}
+
+th.markdownTableHeadLeft, td.markdownTableBodyLeft {
+       text-align: left
+}
+
+th.markdownTableHeadRight, td.markdownTableBodyRight {
+       text-align: right
+}
+
+th.markdownTableHeadCenter, td.markdownTableBodyCenter {
+       text-align: center
+}
+
+
+/* @end */
index 63afabd..a8fbc73 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: File List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
 <div class="contents">
 <div class="textblock">Here is a list of all files with brief descriptions:</div><div class="directory">
 <table class="directory">
-<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="arraylist_8h.html" target="_self">arraylist.h</a></td><td class="desc"></td></tr>
-<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="bits_8h.html" target="_self">bits.h</a></td><td class="desc"></td></tr>
-<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="debug_8h.html" target="_self">debug.h</a></td><td class="desc"></td></tr>
-<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json_8h.html" target="_self">json.h</a></td><td class="desc"></td></tr>
-<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__c__version_8h.html" target="_self">json_c_version.h</a></td><td class="desc"></td></tr>
-<tr id="row_5_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__inttypes_8h.html" target="_self">json_inttypes.h</a></td><td class="desc"></td></tr>
-<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__object_8h.html" target="_self">json_object.h</a></td><td class="desc"></td></tr>
-<tr id="row_7_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__object__iterator_8h.html" target="_self">json_object_iterator.h</a></td><td class="desc">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 </td></tr>
-<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__object__private_8h.html" target="_self">json_object_private.h</a></td><td class="desc"></td></tr>
-<tr id="row_9_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__tokener_8h.html" target="_self">json_tokener.h</a></td><td class="desc"></td></tr>
-<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__util_8h.html" target="_self">json_util.h</a></td><td class="desc"></td></tr>
-<tr id="row_11_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="linkhash_8h.html" target="_self">linkhash.h</a></td><td class="desc"></td></tr>
-<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="math__compat_8h.html" target="_self">math_compat.h</a></td><td class="desc"></td></tr>
-<tr id="row_13_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="printbuf_8h.html" target="_self">printbuf.h</a></td><td class="desc"></td></tr>
-<tr id="row_14_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="random__seed_8h.html" target="_self">random_seed.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="arraylist_8h.html" target="_self">arraylist.h</a></td><td class="desc">Internal methods for working with json_type_array objects. Although this is exposed by the <a class="el" href="json__object_8h.html#a23d20e3f886c1638a7116be66b7b5ec2">json_object_get_array()</a> method, it is not recommended for direct use </td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="bits_8h.html" target="_self">bits.h</a></td><td class="desc">Do not use, only contains deprecated defines </td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="debug_8h.html" target="_self">debug.h</a></td><td class="desc">Do not use, json-c internal, may be changed or removed at any time </td></tr>
+<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json_8h.html" target="_self">json.h</a></td><td class="desc">A convenience header that may be included instead of other individual ones </td></tr>
+<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__c__version_8h.html" target="_self">json_c_version.h</a></td><td class="desc">Methods for retrieving the json-c version </td></tr>
+<tr id="row_5_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__inttypes_8h.html" target="_self">json_inttypes.h</a></td><td class="desc">Do not use, json-c internal, may be changed or removed at any time </td></tr>
+<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__object_8h.html" target="_self">json_object.h</a></td><td class="desc">Core json-c API. Start here, or with <a class="el" href="json__tokener_8h.html" title="Methods to parse an input string into a tree of json_object objects. ">json_tokener.h</a> </td></tr>
+<tr id="row_7_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__object__iterator_8h.html" target="_self">json_object_iterator.h</a></td><td class="desc">An API for iterating over json_type_object objects, styled to be familiar to C++ programmers. Unlike <a class="el" href="json__object_8h.html#acf5f514a9e0061c10fc08055762639ee">json_object_object_foreach()</a> and <a class="el" href="json__object_8h.html#a71f07006c12d78f7bbf4cb716a5af3a6">json_object_object_foreachC()</a>, this avoids the need to expose json-c internals like <a class="el" href="structlh__entry.html">lh_entry</a> </td></tr>
+<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__object__private_8h.html" target="_self">json_object_private.h</a></td><td class="desc">Do not use, json-c internal, may be changed or removed at any time </td></tr>
+<tr id="row_9_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__pointer_8h.html" target="_self">json_pointer.h</a></td><td class="desc">JSON Pointer (RFC 6901) implementation for retrieving objects from a json-c object tree </td></tr>
+<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__tokener_8h.html" target="_self">json_tokener.h</a></td><td class="desc">Methods to parse an input string into a tree of <a class="el" href="structjson__object.html">json_object</a> objects </td></tr>
+<tr id="row_11_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__util_8h.html" target="_self">json_util.h</a></td><td class="desc">Miscllaneous utility functions and macros </td></tr>
+<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="json__visit_8h.html" target="_self">json_visit.h</a></td><td class="desc">Methods for walking a tree of objects </td></tr>
+<tr id="row_13_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="linkhash_8h.html" target="_self">linkhash.h</a></td><td class="desc">Internal methods for working with json_type_object objects. Although this is exposed by the <a class="el" href="json__object_8h.html#a2caa52ae1863bd073444f3737138a4db">json_object_get_object()</a> function and within the <a class="el" href="structjson__object__iter.html">json_object_iter</a> type, it is not recommended for direct use </td></tr>
+<tr id="row_14_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="math__compat_8h.html" target="_self">math_compat.h</a></td><td class="desc">Do not use, json-c internal, may be changed or removed at any time </td></tr>
+<tr id="row_15_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="printbuf_8h.html" target="_self">printbuf.h</a></td><td class="desc">Internal string buffer handing. Unless you're writing a json_object_to_json_string_fn implementation for use with <a class="el" href="json__object_8h.html#a889345512a214b8f78f6a73561523c7c">json_object_set_serializer()</a> direct use of this is not recommended </td></tr>
+<tr id="row_16_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="random__seed_8h.html" target="_self">random_seed.h</a></td><td class="desc">Do not use, json-c internal, may be changed or removed at any time </td></tr>
+<tr id="row_17_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snprintf__compat_8h.html" target="_self">snprintf_compat.h</a></td><td class="desc">Do not use, json-c internal, may be changed or removed at any time </td></tr>
+<tr id="row_18_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="strdup__compat_8h.html" target="_self">strdup_compat.h</a></td><td class="desc">Do not use, json-c internal, may be changed or removed at any time </td></tr>
+<tr id="row_19_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="strerror__override_8h.html" target="_self">strerror_override.h</a></td><td class="desc">Do not use, json-c internal, may be changed or removed at any time </td></tr>
+<tr id="row_20_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="strerror__override__private_8h.html" target="_self">strerror_override_private.h</a></td><td class="desc">Do not use, json-c internal, may be changed or removed at any time </td></tr>
+<tr id="row_21_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="vasprintf__compat_8h.html" target="_self">vasprintf_compat.h</a></td><td class="desc">Do not use, json-c internal, may be changed or removed at any time </td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 15:09:43 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
diff --git a/doc/html/ftv2blank.png b/doc/html/ftv2blank.png
deleted file mode 100644 (file)
index 63c605b..0000000
Binary files a/doc/html/ftv2blank.png and /dev/null differ
diff --git a/doc/html/ftv2cl.png b/doc/html/ftv2cl.png
deleted file mode 100644 (file)
index 132f657..0000000
Binary files a/doc/html/ftv2cl.png and /dev/null differ
diff --git a/doc/html/ftv2doc.png b/doc/html/ftv2doc.png
deleted file mode 100644 (file)
index 17edabf..0000000
Binary files a/doc/html/ftv2doc.png and /dev/null differ
diff --git a/doc/html/ftv2folderclosed.png b/doc/html/ftv2folderclosed.png
deleted file mode 100644 (file)
index bb8ab35..0000000
Binary files a/doc/html/ftv2folderclosed.png and /dev/null differ
diff --git a/doc/html/ftv2folderopen.png b/doc/html/ftv2folderopen.png
deleted file mode 100644 (file)
index d6c7f67..0000000
Binary files a/doc/html/ftv2folderopen.png and /dev/null differ
diff --git a/doc/html/ftv2lastnode.png b/doc/html/ftv2lastnode.png
deleted file mode 100644 (file)
index 63c605b..0000000
Binary files a/doc/html/ftv2lastnode.png and /dev/null differ
diff --git a/doc/html/ftv2link.png b/doc/html/ftv2link.png
deleted file mode 100644 (file)
index 17edabf..0000000
Binary files a/doc/html/ftv2link.png and /dev/null differ
diff --git a/doc/html/ftv2mlastnode.png b/doc/html/ftv2mlastnode.png
deleted file mode 100644 (file)
index 0b63f6d..0000000
Binary files a/doc/html/ftv2mlastnode.png and /dev/null differ
diff --git a/doc/html/ftv2mnode.png b/doc/html/ftv2mnode.png
deleted file mode 100644 (file)
index 0b63f6d..0000000
Binary files a/doc/html/ftv2mnode.png and /dev/null differ
diff --git a/doc/html/ftv2mo.png b/doc/html/ftv2mo.png
deleted file mode 100644 (file)
index 4bfb80f..0000000
Binary files a/doc/html/ftv2mo.png and /dev/null differ
diff --git a/doc/html/ftv2node.png b/doc/html/ftv2node.png
deleted file mode 100644 (file)
index 63c605b..0000000
Binary files a/doc/html/ftv2node.png and /dev/null differ
diff --git a/doc/html/ftv2ns.png b/doc/html/ftv2ns.png
deleted file mode 100644 (file)
index 72e3d71..0000000
Binary files a/doc/html/ftv2ns.png and /dev/null differ
diff --git a/doc/html/ftv2plastnode.png b/doc/html/ftv2plastnode.png
deleted file mode 100644 (file)
index c6ee22f..0000000
Binary files a/doc/html/ftv2plastnode.png and /dev/null differ
diff --git a/doc/html/ftv2pnode.png b/doc/html/ftv2pnode.png
deleted file mode 100644 (file)
index c6ee22f..0000000
Binary files a/doc/html/ftv2pnode.png and /dev/null differ
diff --git a/doc/html/ftv2splitbar.png b/doc/html/ftv2splitbar.png
deleted file mode 100644 (file)
index fe895f2..0000000
Binary files a/doc/html/ftv2splitbar.png and /dev/null differ
diff --git a/doc/html/ftv2vertline.png b/doc/html/ftv2vertline.png
deleted file mode 100644 (file)
index 63c605b..0000000
Binary files a/doc/html/ftv2vertline.png and /dev/null differ
index aa481ec..222dd69 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Data Fields</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="functions.html"><span>Data&#160;Fields</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="functions.html"><span>All</span></a></li>
-      <li><a href="functions_vars.html"><span>Variables</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="#index__"><span>_</span></a></li>
-      <li><a href="#index_a"><span>a</span></a></li>
-      <li><a href="#index_b"><span>b</span></a></li>
-      <li><a href="#index_c"><span>c</span></a></li>
-      <li><a href="#index_d"><span>d</span></a></li>
-      <li><a href="#index_e"><span>e</span></a></li>
-      <li><a href="#index_f"><span>f</span></a></li>
-      <li><a href="#index_h"><span>h</span></a></li>
-      <li><a href="#index_i"><span>i</span></a></li>
-      <li><a href="#index_k"><span>k</span></a></li>
-      <li><a href="#index_l"><span>l</span></a></li>
-      <li><a href="#index_m"><span>m</span></a></li>
-      <li><a href="#index_n"><span>n</span></a></li>
-      <li><a href="#index_o"><span>o</span></a></li>
-      <li><a href="#index_p"><span>p</span></a></li>
-      <li><a href="#index_q"><span>q</span></a></li>
-      <li><a href="#index_r"><span>r</span></a></li>
-      <li><a href="#index_s"><span>s</span></a></li>
-      <li><a href="#index_t"><span>t</span></a></li>
-      <li><a href="#index_u"><span>u</span></a></li>
-      <li class="current"><a href="#index_v"><span>v</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 <div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
 
-<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<h3><a id="index__"></a>- _ -</h3><ul>
 <li>_delete
 : <a class="el" href="structjson__object.html#a63666be714a8ce8907d56142c1d9dfb7">json_object</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<h3><a id="index_a"></a>- a -</h3><ul>
 <li>array
 : <a class="el" href="structarray__list.html#a7ba65feda2b156148c08667cf155b657">array_list</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<h3><a id="index_b"></a>- b -</h3><ul>
 <li>bpos
 : <a class="el" href="structprintbuf.html#aba980ad7406329e32f557dfa0eb7b1b2">printbuf</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<h3><a id="index_c"></a>- c -</h3><ul>
 <li>c_array
 : <a class="el" href="unionjson__object_1_1data.html#a4ad6bf2fd6d8718f55850509edfe2e45">json_object::data</a>
 </li>
 <li>char_offset
 : <a class="el" href="structjson__tokener.html#a9daae2516fd6df23555d33ef01020a76">json_tokener</a>
 </li>
-<li>collisions
-: <a class="el" href="structlh__table.html#a9458e41d842ce40cd37dc13458ced133">lh_table</a>
-</li>
 <li>count
 : <a class="el" href="structlh__table.html#aa172ed8fe205367b54e0e2cdf9ea8c6c">lh_table</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
-<li>deletes
-: <a class="el" href="structlh__table.html#a8348bdd7e61c8d72b402f6a152013fbf">lh_table</a>
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>data
+: <a class="el" href="unionjson__object_1_1data.html#aaa742eb1b88b4b25ec4c27431d1576d7">json_object::data</a>
 </li>
 <li>depth
 : <a class="el" href="structjson__tokener.html#ae0e5102b44cc1fc680be3e0fb5fff028">json_tokener</a>
 </ul>
 
 
-<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<h3><a id="index_e"></a>- e -</h3><ul>
 <li>entry
 : <a class="el" href="structjson__object__iter.html#a64e326f050826c644c02ed5bcd214faa">json_object_iter</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<h3><a id="index_f"></a>- f -</h3><ul>
 <li>flags
 : <a class="el" href="structjson__tokener.html#aabfdcf2825154108669ffa3f4ab9c4ea">json_tokener</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<h3><a id="index_h"></a>- h -</h3><ul>
 <li>hash_fn
 : <a class="el" href="structlh__table.html#a1488d1a4a320b1a9bb2f441859544be1">lh_table</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
-<li>inserts
-: <a class="el" href="structlh__table.html#afd64becd0d2cfbc91a4c9c9a117498b9">lh_table</a>
-</li>
+<h3><a id="index_i"></a>- i -</h3><ul>
 <li>is_double
 : <a class="el" href="structjson__tokener.html#ad3bf0aa728ea14549d5aa6ca8dcba070">json_tokener</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<h3><a id="index_k"></a>- k -</h3><ul>
 <li>k
-: <a class="el" href="structlh__entry.html#a6b176b3582c9cf553af6431750f5c3b6">lh_entry</a>
+: <a class="el" href="structlh__entry.html#a79d9f1ef0dc444e17105aaeaf167e22c">lh_entry</a>
+</li>
+<li>k_is_constant
+: <a class="el" href="structlh__entry.html#a14f40cc124c32b03f81151ae7934d2e7">lh_entry</a>
 </li>
 <li>key
 : <a class="el" href="structjson__object__iter.html#a0b76228b3a039075e9d84f88fa72ff53">json_object_iter</a>
 </ul>
 
 
-<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<h3><a id="index_l"></a>- l -</h3><ul>
 <li>len
 : <a class="el" href="unionjson__object_1_1data.html#ac2386853b8a4e7d0b28a27ed599ccef7">json_object::data</a>
 </li>
 <li>length
-: <a class="el" href="structarray__list.html#a442fcfde196a3cc95a647f0708de814d">array_list</a>
-</li>
-<li>lookups
-: <a class="el" href="structlh__table.html#afd0385c645413d26e682f725a6f52164">lh_table</a>
+: <a class="el" href="structarray__list.html#a5638022574f4ddb0f80d62535085bf4f">array_list</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<h3><a id="index_m"></a>- m -</h3><ul>
 <li>max_depth
 : <a class="el" href="structjson__tokener.html#a9d9b33c3982925349627dc6a3edca940">json_tokener</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
-<li>name
-: <a class="el" href="structlh__table.html#aebf4001cde3746ec8025c1d87d4e6279">lh_table</a>
-</li>
+<h3><a id="index_n"></a>- n -</h3><ul>
 <li>next
 : <a class="el" href="structlh__entry.html#a7c40c46e72d9a0ba071a8d49d535bc67">lh_entry</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<h3><a id="index_o"></a>- o -</h3><ul>
 <li>o
 : <a class="el" href="structjson__object.html#a33aff83ffea02b934235c4821cca8cf0">json_object</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<h3><a id="index_p"></a>- p -</h3><ul>
 <li>pb
 : <a class="el" href="structjson__tokener.html#a1cdc7f85d7bde95f81bb08b7e61d6684">json_tokener</a>
 </li>
 <li>prev
 : <a class="el" href="structlh__entry.html#a6fb9c3de01fb5af67d8d429921cc6a3b">lh_entry</a>
 </li>
+<li>ptr
+: <a class="el" href="unionjson__object_1_1data.html#ad3f2798f4679c5a3cc7f67a42365b71f">json_object::data</a>
+</li>
 </ul>
 
 
-<h3><a class="anchor" id="index_q"></a>- q -</h3><ul>
+<h3><a id="index_q"></a>- q -</h3><ul>
 <li>quote_char
 : <a class="el" href="structjson__tokener.html#aea488b73085ac7c5969ae7fc29e25fa0">json_tokener</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
-<li>resizes
-: <a class="el" href="structlh__table.html#ab4cde49bd9ce7a07daaf99af34ddb67e">lh_table</a>
-</li>
-</ul>
-
-
-<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<h3><a id="index_s"></a>- s -</h3><ul>
 <li>saved_state
 : <a class="el" href="structjson__tokener__srec.html#a868b9912dbb1e4813a630c944f522d48">json_tokener_srec</a>
 </li>
 <li>size
-: <a class="el" href="structarray__list.html#aba48a197d3c8f1d56682da23fe883d0a">array_list</a>
+: <a class="el" href="structarray__list.html#a11b92f48ed715b187f8609351405342f">array_list</a>
 , <a class="el" href="structlh__table.html#ae251575ec2935bcb0e0589ca8e243839">lh_table</a>
 , <a class="el" href="structprintbuf.html#a12ce6440eaa06a55b96ebdc5a9778dd5">printbuf</a>
 </li>
 : <a class="el" href="structjson__tokener.html#a3521d62906eb0e15d07d7b4f64a5fac3">json_tokener</a>
 </li>
 <li>str
-: <a class="el" href="unionjson__object_1_1data.html#a18a82441c3972195a3bf698bb286634b">json_object::data</a>
+: <a class="el" href="unionjson__object_1_1data.html#a51a177df2ef6d27590696975a4f4a7ee">json_object::data</a>
 , <a class="el" href="structjson__tokener.html#a9772e2170322a19d8da6ce5d7dc46895">json_tokener</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<h3><a id="index_t"></a>- t -</h3><ul>
 <li>table
 : <a class="el" href="structlh__table.html#a4fd9c5aba38791b26ab0ec614a5caf8f">lh_table</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
+<h3><a id="index_u"></a>- u -</h3><ul>
 <li>ucs_char
 : <a class="el" href="structjson__tokener.html#a32fa73e43fb760e6845231a8482eb064">json_tokener</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<h3><a id="index_v"></a>- v -</h3><ul>
 <li>v
 : <a class="el" href="structlh__entry.html#a1b676732ab2ad3eeaedf6ec60a6a0835">lh_entry</a>
 </li>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 12:23:18 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 4b0fa75..13d68de 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Data Fields - Variables</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="functions.html"><span>Data&#160;Fields</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li><a href="functions.html"><span>All</span></a></li>
-      <li class="current"><a href="functions_vars.html"><span>Variables</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="#index__"><span>_</span></a></li>
-      <li><a href="#index_a"><span>a</span></a></li>
-      <li><a href="#index_b"><span>b</span></a></li>
-      <li><a href="#index_c"><span>c</span></a></li>
-      <li><a href="#index_d"><span>d</span></a></li>
-      <li><a href="#index_e"><span>e</span></a></li>
-      <li><a href="#index_f"><span>f</span></a></li>
-      <li><a href="#index_h"><span>h</span></a></li>
-      <li><a href="#index_i"><span>i</span></a></li>
-      <li><a href="#index_k"><span>k</span></a></li>
-      <li><a href="#index_l"><span>l</span></a></li>
-      <li><a href="#index_m"><span>m</span></a></li>
-      <li><a href="#index_n"><span>n</span></a></li>
-      <li><a href="#index_o"><span>o</span></a></li>
-      <li><a href="#index_p"><span>p</span></a></li>
-      <li><a href="#index_q"><span>q</span></a></li>
-      <li><a href="#index_r"><span>r</span></a></li>
-      <li><a href="#index_s"><span>s</span></a></li>
-      <li><a href="#index_t"><span>t</span></a></li>
-      <li><a href="#index_u"><span>u</span></a></li>
-      <li class="current"><a href="#index_v"><span>v</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 &#160;
 
-<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<h3><a id="index__"></a>- _ -</h3><ul>
 <li>_delete
 : <a class="el" href="structjson__object.html#a63666be714a8ce8907d56142c1d9dfb7">json_object</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<h3><a id="index_a"></a>- a -</h3><ul>
 <li>array
 : <a class="el" href="structarray__list.html#a7ba65feda2b156148c08667cf155b657">array_list</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<h3><a id="index_b"></a>- b -</h3><ul>
 <li>bpos
 : <a class="el" href="structprintbuf.html#aba980ad7406329e32f557dfa0eb7b1b2">printbuf</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<h3><a id="index_c"></a>- c -</h3><ul>
 <li>c_array
 : <a class="el" href="unionjson__object_1_1data.html#a4ad6bf2fd6d8718f55850509edfe2e45">json_object::data</a>
 </li>
 <li>char_offset
 : <a class="el" href="structjson__tokener.html#a9daae2516fd6df23555d33ef01020a76">json_tokener</a>
 </li>
-<li>collisions
-: <a class="el" href="structlh__table.html#a9458e41d842ce40cd37dc13458ced133">lh_table</a>
-</li>
 <li>count
 : <a class="el" href="structlh__table.html#aa172ed8fe205367b54e0e2cdf9ea8c6c">lh_table</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
-<li>deletes
-: <a class="el" href="structlh__table.html#a8348bdd7e61c8d72b402f6a152013fbf">lh_table</a>
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>data
+: <a class="el" href="unionjson__object_1_1data.html#aaa742eb1b88b4b25ec4c27431d1576d7">json_object::data</a>
 </li>
 <li>depth
 : <a class="el" href="structjson__tokener.html#ae0e5102b44cc1fc680be3e0fb5fff028">json_tokener</a>
 </ul>
 
 
-<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<h3><a id="index_e"></a>- e -</h3><ul>
 <li>entry
 : <a class="el" href="structjson__object__iter.html#a64e326f050826c644c02ed5bcd214faa">json_object_iter</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<h3><a id="index_f"></a>- f -</h3><ul>
 <li>flags
 : <a class="el" href="structjson__tokener.html#aabfdcf2825154108669ffa3f4ab9c4ea">json_tokener</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<h3><a id="index_h"></a>- h -</h3><ul>
 <li>hash_fn
 : <a class="el" href="structlh__table.html#a1488d1a4a320b1a9bb2f441859544be1">lh_table</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
-<li>inserts
-: <a class="el" href="structlh__table.html#afd64becd0d2cfbc91a4c9c9a117498b9">lh_table</a>
-</li>
+<h3><a id="index_i"></a>- i -</h3><ul>
 <li>is_double
 : <a class="el" href="structjson__tokener.html#ad3bf0aa728ea14549d5aa6ca8dcba070">json_tokener</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<h3><a id="index_k"></a>- k -</h3><ul>
 <li>k
-: <a class="el" href="structlh__entry.html#a6b176b3582c9cf553af6431750f5c3b6">lh_entry</a>
+: <a class="el" href="structlh__entry.html#a79d9f1ef0dc444e17105aaeaf167e22c">lh_entry</a>
+</li>
+<li>k_is_constant
+: <a class="el" href="structlh__entry.html#a14f40cc124c32b03f81151ae7934d2e7">lh_entry</a>
 </li>
 <li>key
 : <a class="el" href="structjson__object__iter.html#a0b76228b3a039075e9d84f88fa72ff53">json_object_iter</a>
 </ul>
 
 
-<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<h3><a id="index_l"></a>- l -</h3><ul>
 <li>len
 : <a class="el" href="unionjson__object_1_1data.html#ac2386853b8a4e7d0b28a27ed599ccef7">json_object::data</a>
 </li>
 <li>length
-: <a class="el" href="structarray__list.html#a442fcfde196a3cc95a647f0708de814d">array_list</a>
-</li>
-<li>lookups
-: <a class="el" href="structlh__table.html#afd0385c645413d26e682f725a6f52164">lh_table</a>
+: <a class="el" href="structarray__list.html#a5638022574f4ddb0f80d62535085bf4f">array_list</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<h3><a id="index_m"></a>- m -</h3><ul>
 <li>max_depth
 : <a class="el" href="structjson__tokener.html#a9d9b33c3982925349627dc6a3edca940">json_tokener</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
-<li>name
-: <a class="el" href="structlh__table.html#aebf4001cde3746ec8025c1d87d4e6279">lh_table</a>
-</li>
+<h3><a id="index_n"></a>- n -</h3><ul>
 <li>next
 : <a class="el" href="structlh__entry.html#a7c40c46e72d9a0ba071a8d49d535bc67">lh_entry</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<h3><a id="index_o"></a>- o -</h3><ul>
 <li>o
 : <a class="el" href="structjson__object.html#a33aff83ffea02b934235c4821cca8cf0">json_object</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<h3><a id="index_p"></a>- p -</h3><ul>
 <li>pb
 : <a class="el" href="structjson__tokener.html#a1cdc7f85d7bde95f81bb08b7e61d6684">json_tokener</a>
 </li>
 <li>prev
 : <a class="el" href="structlh__entry.html#a6fb9c3de01fb5af67d8d429921cc6a3b">lh_entry</a>
 </li>
+<li>ptr
+: <a class="el" href="unionjson__object_1_1data.html#ad3f2798f4679c5a3cc7f67a42365b71f">json_object::data</a>
+</li>
 </ul>
 
 
-<h3><a class="anchor" id="index_q"></a>- q -</h3><ul>
+<h3><a id="index_q"></a>- q -</h3><ul>
 <li>quote_char
 : <a class="el" href="structjson__tokener.html#aea488b73085ac7c5969ae7fc29e25fa0">json_tokener</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
-<li>resizes
-: <a class="el" href="structlh__table.html#ab4cde49bd9ce7a07daaf99af34ddb67e">lh_table</a>
-</li>
-</ul>
-
-
-<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<h3><a id="index_s"></a>- s -</h3><ul>
 <li>saved_state
 : <a class="el" href="structjson__tokener__srec.html#a868b9912dbb1e4813a630c944f522d48">json_tokener_srec</a>
 </li>
 <li>size
-: <a class="el" href="structarray__list.html#aba48a197d3c8f1d56682da23fe883d0a">array_list</a>
+: <a class="el" href="structarray__list.html#a11b92f48ed715b187f8609351405342f">array_list</a>
 , <a class="el" href="structlh__table.html#ae251575ec2935bcb0e0589ca8e243839">lh_table</a>
 , <a class="el" href="structprintbuf.html#a12ce6440eaa06a55b96ebdc5a9778dd5">printbuf</a>
 </li>
 : <a class="el" href="structjson__tokener.html#a3521d62906eb0e15d07d7b4f64a5fac3">json_tokener</a>
 </li>
 <li>str
-: <a class="el" href="unionjson__object_1_1data.html#a18a82441c3972195a3bf698bb286634b">json_object::data</a>
+: <a class="el" href="unionjson__object_1_1data.html#a51a177df2ef6d27590696975a4f4a7ee">json_object::data</a>
 , <a class="el" href="structjson__tokener.html#a9772e2170322a19d8da6ce5d7dc46895">json_tokener</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<h3><a id="index_t"></a>- t -</h3><ul>
 <li>table
 : <a class="el" href="structlh__table.html#a4fd9c5aba38791b26ab0ec614a5caf8f">lh_table</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
+<h3><a id="index_u"></a>- u -</h3><ul>
 <li>ucs_char
 : <a class="el" href="structjson__tokener.html#a32fa73e43fb760e6845231a8482eb064">json_tokener</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<h3><a id="index_v"></a>- v -</h3><ul>
 <li>v
 : <a class="el" href="structlh__entry.html#a1b676732ab2ad3eeaedf6ec60a6a0835">lh_entry</a>
 </li>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 03:40:39 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index ef03a94..1c585b5 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_a.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_e.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_f.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_h.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_i.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_j.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_l.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_m.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_p.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_s.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_t.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 <div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
 
-<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<h3><a id="index__"></a>- _ -</h3><ul>
 <li>__STRING
 : <a class="el" href="debug_8h.html#a375c4dc9f0fb338999de81aab826f9d6">debug.h</a>
 </li>
+<li>_json_c_set_last_err()
+: <a class="el" href="json__object__private_8h.html#a2b38dd2d14fbfa6585de5664b6d61c0c">json_object_private.h</a>
+</li>
+<li>_json_c_strerror()
+: <a class="el" href="strerror__override_8h.html#a2affa276d0d7b0a446105e324560576f">strerror_override.h</a>
+</li>
+<li>_json_c_strerror_enable
+: <a class="el" href="strerror__override__private_8h.html#ac00e7d4121efe4b2e6ad8961e35e88ba">strerror_override_private.h</a>
+</li>
+<li>_LH_INLINE
+: <a class="el" href="linkhash_8h.html#a77c5cddef96e6f1ab036ccf911783456">linkhash.h</a>
+</li>
+<li>_LH_UNCONST
+: <a class="el" href="linkhash_8h.html#afb856ed4a9bcfd090dde5151fa3ad9ae">linkhash.h</a>
+</li>
+<li>_printbuf_check_literal
+: <a class="el" href="printbuf_8h.html#ab009973c5e15aae191e610cd70752603">printbuf.h</a>
+</li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 05:27:19 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
diff --git a/doc/html/globals_0x61.html b/doc/html/globals_0x61.html
deleted file mode 100644 (file)
index 800f484..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.5"/>
-<title>json-c: Globals</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
-   <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12</span>
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.5 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li class="current"><a href="globals_0x61.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
-</div><!-- top -->
-<div class="contents">
-<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
-
-<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
-<li>array_list
-: <a class="el" href="json__object_8h.html#a6d6d32d8b026ea2025df519b9e90f44a">json_object.h</a>
-</li>
-<li>array_list_add()
-: <a class="el" href="arraylist_8h.html#a6e995608aa464244ff3184fb43574dc8">arraylist.h</a>
-</li>
-<li>ARRAY_LIST_DEFAULT_SIZE
-: <a class="el" href="arraylist_8h.html#acd30d910b398421574eb1f59e78617f5">arraylist.h</a>
-</li>
-<li>array_list_free()
-: <a class="el" href="arraylist_8h.html#acd00fb70f7ca82f23b48b812c3498f67">arraylist.h</a>
-</li>
-<li>array_list_free_fn
-: <a class="el" href="arraylist_8h.html#aad83e4ed3c8ea274e6f18459276d774b">arraylist.h</a>
-</li>
-<li>array_list_get_idx()
-: <a class="el" href="arraylist_8h.html#aa16207e545b6c1265299abcfa418dc2b">arraylist.h</a>
-</li>
-<li>array_list_length()
-: <a class="el" href="arraylist_8h.html#aa8393b4aa3dc447660371530439ab70f">arraylist.h</a>
-</li>
-<li>array_list_new()
-: <a class="el" href="arraylist_8h.html#a0d4bfac055dfd98e17296142abf4d894">arraylist.h</a>
-</li>
-<li>array_list_put_idx()
-: <a class="el" href="arraylist_8h.html#a21b8e4c59e52fbc5a9a5a098e3f96e76">arraylist.h</a>
-</li>
-<li>array_list_sort()
-: <a class="el" href="arraylist_8h.html#afb67cc8e2e5c9be41c3e644536079169">arraylist.h</a>
-</li>
-</ul>
-</div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated on Thu Apr 10 2014 18:21:29 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.5
-</small></address>
-</body>
-</html>
diff --git a/doc/html/globals_0x65.html b/doc/html/globals_0x65.html
deleted file mode 100644 (file)
index 6f40a92..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.5"/>
-<title>json-c: Globals</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
-   <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12</span>
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.5 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
-      <li class="current"><a href="globals_0x65.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
-</div><!-- top -->
-<div class="contents">
-<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
-
-<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
-<li>error_description
-: <a class="el" href="bits_8h.html#a45afe86501cd57ee2beeef9d67a4d40c">bits.h</a>
-</li>
-<li>error_ptr
-: <a class="el" href="bits_8h.html#a863a898e607f8c2ff87b7052e326740f">bits.h</a>
-</li>
-</ul>
-</div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated on Thu Apr 10 2014 19:38:33 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.5
-</small></address>
-</body>
-</html>
diff --git a/doc/html/globals_0x66.html b/doc/html/globals_0x66.html
deleted file mode 100644 (file)
index 89f35e8..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.5"/>
-<title>json-c: Globals</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
-   <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12</span>
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.5 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
-      <li class="current"><a href="globals_0x66.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
-</div><!-- top -->
-<div class="contents">
-<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
-
-<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
-<li>FALSE
-: <a class="el" href="json__object_8h.html#aa93f0eb578d23995850d61f7d61c55c1">json_object.h</a>
-</li>
-</ul>
-</div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated on Thu Apr 10 2014 23:52:25 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.5
-</small></address>
-</body>
-</html>
diff --git a/doc/html/globals_0x68.html b/doc/html/globals_0x68.html
deleted file mode 100644 (file)
index 909af89..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.5"/>
-<title>json-c: Globals</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
-   <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12</span>
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.5 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
-      <li class="current"><a href="globals_0x68.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
-</div><!-- top -->
-<div class="contents">
-<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
-
-<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
-<li>hexdigit
-: <a class="el" href="bits_8h.html#a1cf38b22d3a118ad48d9282c32c048aa">bits.h</a>
-</li>
-</ul>
-</div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated on Thu Apr 10 2014 00:20:09 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.5
-</small></address>
-</body>
-</html>
diff --git a/doc/html/globals_0x69.html b/doc/html/globals_0x69.html
deleted file mode 100644 (file)
index dd8f8b7..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.5"/>
-<title>json-c: Globals</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
-   <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12</span>
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.5 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
-      <li class="current"><a href="globals_0x69.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
-</div><!-- top -->
-<div class="contents">
-<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
-
-<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
-<li>is_error
-: <a class="el" href="bits_8h.html#a4a887e5fb7cde221bcab9c6f39d93fc1">bits.h</a>
-</li>
-</ul>
-</div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated on Thu Apr 10 2014 06:03:37 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.5
-</small></address>
-</body>
-</html>
diff --git a/doc/html/globals_0x6a.html b/doc/html/globals_0x6a.html
deleted file mode 100644 (file)
index e8f6328..0000000
+++ /dev/null
@@ -1,499 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.5"/>
-<title>json-c: Globals</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
-   <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12</span>
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.5 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
-      <li class="current"><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
-</div><!-- top -->
-<div class="contents">
-<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
-
-<h3><a class="anchor" id="index_j"></a>- j -</h3><ul>
-<li>JASSERT
-: <a class="el" href="debug_8h.html#a8ca29550d5b1b73948f4a7bce53f2385">debug.h</a>
-</li>
-<li>json_bool
-: <a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_object.h</a>
-</li>
-<li>json_c_get_random_seed()
-: <a class="el" href="random__seed_8h.html#ae190c6819d7687e110d6ec59a16d006f">random_seed.h</a>
-</li>
-<li>JSON_C_MAJOR_VERSION
-: <a class="el" href="json__c__version_8h.html#a251c3e1f59a379a4a905382b4e855125">json_c_version.h</a>
-</li>
-<li>JSON_C_MICRO_VERSION
-: <a class="el" href="json__c__version_8h.html#a64457730097067ab096906d82e4a51a6">json_c_version.h</a>
-</li>
-<li>JSON_C_MINOR_VERSION
-: <a class="el" href="json__c__version_8h.html#adc87477fbc1c75848fe6b6feec21c2d6">json_c_version.h</a>
-</li>
-<li>JSON_C_TO_STRING_NOZERO
-: <a class="el" href="json__object_8h.html#a34f027c147babf69fc530d088f2b49b0">json_object.h</a>
-</li>
-<li>JSON_C_TO_STRING_PLAIN
-: <a class="el" href="json__object_8h.html#a3294cb92765cdeb497cfd346644d1059">json_object.h</a>
-</li>
-<li>JSON_C_TO_STRING_PRETTY
-: <a class="el" href="json__object_8h.html#a2025bc677c35f130e117dfda5bf1ef73">json_object.h</a>
-</li>
-<li>JSON_C_TO_STRING_SPACED
-: <a class="el" href="json__object_8h.html#aa821746c8668e6ad62bed90ec9e00103">json_object.h</a>
-</li>
-<li>JSON_C_VERSION
-: <a class="el" href="json__c__version_8h.html#a894adda66a072bc3fd34ebe91a5aa7f4">json_c_version.h</a>
-</li>
-<li>json_c_version()
-: <a class="el" href="json__c__version_8h.html#a536b398f292b0669fc824a8486131a27">json_c_version.h</a>
-</li>
-<li>JSON_C_VERSION_NUM
-: <a class="el" href="json__c__version_8h.html#a78e176eee75ee6aed43c4d65ca4c5b44">json_c_version.h</a>
-</li>
-<li>json_c_version_num()
-: <a class="el" href="json__c__version_8h.html#a114bcfed9594f3cd662e43454000938d">json_c_version.h</a>
-</li>
-<li>JSON_FILE_BUF_SIZE
-: <a class="el" href="json__util_8h.html#a084b6afc8f7fbef88976aabe4aca7efd">json_util.h</a>
-</li>
-<li>json_hex_chars
-: <a class="el" href="json__object_8h.html#a20dbe4913551cefa6b4b0a77fd4397c4">json_object.h</a>
-</li>
-<li>json_max
-: <a class="el" href="bits_8h.html#a57d63d199d4b9ea40359253618951300">bits.h</a>
-</li>
-<li>json_min
-: <a class="el" href="bits_8h.html#a3dde282dc23d0eaa3c4840df8dc262d4">bits.h</a>
-</li>
-<li>json_number_chars
-: <a class="el" href="json__object_8h.html#a27427f89f2fc995639e366635fbe58ac">json_object.h</a>
-</li>
-<li>json_object
-: <a class="el" href="json__object_8h.html#af27907ced0f5a43409ad96430fe0f914">json_object.h</a>
-</li>
-<li>json_object_array_add()
-: <a class="el" href="json__object_8h.html#acc89c0f58947d499e2868ac8b62bed49">json_object.h</a>
-</li>
-<li>json_object_array_get_idx()
-: <a class="el" href="json__object_8h.html#a5c9120a6d644ea12a61e2ec8520130c6">json_object.h</a>
-</li>
-<li>json_object_array_length()
-: <a class="el" href="json__object_8h.html#a2e62d4b19de8f297595f3b4aaa0ec453">json_object.h</a>
-</li>
-<li>json_object_array_put_idx()
-: <a class="el" href="json__object_8h.html#a2d19d21b495e1e0d3f711093d97a5104">json_object.h</a>
-</li>
-<li>json_object_array_sort()
-: <a class="el" href="json__object_8h.html#aa1b05eeaa9c92f079facece87d6a0149">json_object.h</a>
-</li>
-<li>JSON_OBJECT_DEF_HASH_ENTRIES
-: <a class="el" href="json__object_8h.html#a268a63dd1b2e6d81559e268a4529e9bf">json_object.h</a>
-</li>
-<li>json_object_delete_fn
-: <a class="el" href="json__object_8h.html#aa647d7c567a06abe1a1a511f6d6860e4">json_object.h</a>
-</li>
-<li>json_object_free_userdata
-: <a class="el" href="json__object_8h.html#adda8476609cc566ee62b80eaed310283">json_object.h</a>
-</li>
-<li>json_object_from_file()
-: <a class="el" href="json__util_8h.html#a8fa0bba6b7ddb149a2159d99bae709ce">json_util.h</a>
-</li>
-<li>json_object_get()
-: <a class="el" href="json__object_8h.html#acc3628d97c6308dc967006e4268c4e7f">json_object.h</a>
-</li>
-<li>json_object_get_array()
-: <a class="el" href="json__object_8h.html#aba4e8df5e00bdc91a89bfb775e04ed70">json_object.h</a>
-</li>
-<li>json_object_get_boolean()
-: <a class="el" href="json__object_8h.html#a3be3153ae5158ed24a49d74fbf14149f">json_object.h</a>
-</li>
-<li>json_object_get_double()
-: <a class="el" href="json__object_8h.html#a9cf586fba906a597a121423045cb2a45">json_object.h</a>
-</li>
-<li>json_object_get_int()
-: <a class="el" href="json__object_8h.html#ae6cab7d4c7c707b9053035a6405d3891">json_object.h</a>
-</li>
-<li>json_object_get_int64()
-: <a class="el" href="json__object_8h.html#a3493894ebd226249118582e640af6944">json_object.h</a>
-</li>
-<li>json_object_get_object()
-: <a class="el" href="json__object_8h.html#a9840421d6b45a7d00a42e13e379b54b5">json_object.h</a>
-</li>
-<li>json_object_get_string()
-: <a class="el" href="json__object_8h.html#ad24f1c4c22b2a7d33e7b562c01f2ca65">json_object.h</a>
-</li>
-<li>json_object_get_string_len()
-: <a class="el" href="json__object_8h.html#ad821384d0d8515d5ed4eec44d7101772">json_object.h</a>
-</li>
-<li>json_object_get_type()
-: <a class="el" href="json__object_8h.html#adc5e998b4897b6e450bd0975a58d2f72">json_object.h</a>
-</li>
-<li>json_object_is_type()
-: <a class="el" href="json__object_8h.html#ab6dc8b19f8da310e78f402f83d6ae6c5">json_object.h</a>
-</li>
-<li>json_object_iter
-: <a class="el" href="json__object_8h.html#af88126730e765f2068968f4b16fd074f">json_object.h</a>
-</li>
-<li>json_object_iter_begin()
-: <a class="el" href="json__object__iterator_8h.html#a925eb97b5aa5b64986a0f663f53cf0fa">json_object_iterator.h</a>
-</li>
-<li>json_object_iter_end()
-: <a class="el" href="json__object__iterator_8h.html#a1fa3784395fb14496e3f1a1633028fd4">json_object_iterator.h</a>
-</li>
-<li>json_object_iter_equal()
-: <a class="el" href="json__object__iterator_8h.html#a878ca25f72b339882aa2607ac938e79c">json_object_iterator.h</a>
-</li>
-<li>json_object_iter_init_default()
-: <a class="el" href="json__object__iterator_8h.html#af30f56ca510d59da42e5592f9a436c10">json_object_iterator.h</a>
-</li>
-<li>json_object_iter_next()
-: <a class="el" href="json__object__iterator_8h.html#aa98a310c340f6d9b4eeecb673aa5e240">json_object_iterator.h</a>
-</li>
-<li>json_object_iter_peek_name()
-: <a class="el" href="json__object__iterator_8h.html#af17775b9b812a4206a84e4d3fb5774ab">json_object_iterator.h</a>
-</li>
-<li>json_object_iter_peek_value()
-: <a class="el" href="json__object__iterator_8h.html#a47b0af7f1722c10475dffd29efc0b89d">json_object_iterator.h</a>
-</li>
-<li>json_object_new_array()
-: <a class="el" href="json__object_8h.html#a9b5af06e9a99e16c6d9b6459a685ea3f">json_object.h</a>
-</li>
-<li>json_object_new_boolean()
-: <a class="el" href="json__object_8h.html#a93cfacfdd1000c739ad19df0a080cb85">json_object.h</a>
-</li>
-<li>json_object_new_double()
-: <a class="el" href="json__object_8h.html#a2e9c761833a4f5d0a0c60640377e3cec">json_object.h</a>
-</li>
-<li>json_object_new_double_s()
-: <a class="el" href="json__object_8h.html#a50c188c8eb9007f05ab1aa0e22eae90c">json_object.h</a>
-</li>
-<li>json_object_new_int()
-: <a class="el" href="json__object_8h.html#aa7db8ceb1afe1b93afc63c10b8c57560">json_object.h</a>
-</li>
-<li>json_object_new_int64()
-: <a class="el" href="json__object_8h.html#a54a27690a1927354966189166bba6ca3">json_object.h</a>
-</li>
-<li>json_object_new_object()
-: <a class="el" href="json__object_8h.html#af0ed3555604f39ac74b5e28bc5b1f82c">json_object.h</a>
-</li>
-<li>json_object_new_string()
-: <a class="el" href="json__object_8h.html#a48eb92a8208e6718e55edf1130e8e4b8">json_object.h</a>
-</li>
-<li>json_object_new_string_len()
-: <a class="el" href="json__object_8h.html#a9d14fd03ed7520c4aa33ab53b4569414">json_object.h</a>
-</li>
-<li>json_object_object_add()
-: <a class="el" href="json__object_8h.html#a04448b1c63173e1bfe49965835732075">json_object.h</a>
-</li>
-<li>json_object_object_del()
-: <a class="el" href="json__object_8h.html#a03653c18aafccd1ffba1ad318e342845">json_object.h</a>
-</li>
-<li>json_object_object_foreach
-: <a class="el" href="json__object_8h.html#acf5f514a9e0061c10fc08055762639ee">json_object.h</a>
-</li>
-<li>json_object_object_foreachC
-: <a class="el" href="json__object_8h.html#a71f07006c12d78f7bbf4cb716a5af3a6">json_object.h</a>
-</li>
-<li>json_object_object_get_ex()
-: <a class="el" href="json__object_8h.html#af3f38b3395b1af8e9d3ac73818c3a936">json_object.h</a>
-</li>
-<li>json_object_object_length()
-: <a class="el" href="json__object_8h.html#acde75a8e4ad28056b3e694ff43afbec0">json_object.h</a>
-</li>
-<li>json_object_private_delete_fn
-: <a class="el" href="json__object__private_8h.html#aa125a0d39945a73a7d52b9823a2ef741">json_object_private.h</a>
-</li>
-<li>json_object_put()
-: <a class="el" href="json__object_8h.html#a1bb50e2d17832c404c3d5f13fbde5bf5">json_object.h</a>
-</li>
-<li>json_object_set_serializer()
-: <a class="el" href="json__object_8h.html#a2ce290cd15dba1c779727c6041d5a2dd">json_object.h</a>
-</li>
-<li>json_object_to_file()
-: <a class="el" href="json__util_8h.html#abbd121df84ec3878a5cb8fefaff12ec7">json_util.h</a>
-</li>
-<li>json_object_to_file_ext()
-: <a class="el" href="json__util_8h.html#a4e980954930951bf790c1ec3ba68fb76">json_util.h</a>
-</li>
-<li>json_object_to_json_string()
-: <a class="el" href="json__object_8h.html#a1f62a660e2619559d1f3f54cd7483ff8">json_object.h</a>
-</li>
-<li>json_object_to_json_string_ext()
-: <a class="el" href="json__object_8h.html#a84421dab94ccad42e901e534c6d7b658">json_object.h</a>
-</li>
-<li>json_object_to_json_string_fn
-: <a class="el" href="json__object_8h.html#af84078100a9025df418f31626ea866fa">json_object.h</a>
-</li>
-<li>json_object_userdata_to_json_string
-: <a class="el" href="json__object_8h.html#a8bc341281f4dd60b53b03b2dec0fae28">json_object.h</a>
-</li>
-<li>json_parse_double()
-: <a class="el" href="json__util_8h.html#a6b5790c15178b6ea97841fc5868b1e1a">json_util.h</a>
-</li>
-<li>json_parse_int64()
-: <a class="el" href="json__util_8h.html#a9bb9882ef2859ca2c1ee17805679bc25">json_util.h</a>
-</li>
-<li>json_tokener
-: <a class="el" href="json__object_8h.html#a4dd5e5b65aee7f376f529f86b210ff49">json_object.h</a>
-</li>
-<li>json_tokener_continue
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a9b26e920ca765df91c84e999561d8fb0">json_tokener.h</a>
-</li>
-<li>JSON_TOKENER_DEFAULT_DEPTH
-: <a class="el" href="json__tokener_8h.html#a5ccd346459feb66e4e0af32005360279">json_tokener.h</a>
-</li>
-<li>json_tokener_error
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener.h</a>
-</li>
-<li>json_tokener_error_depth
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a59b2c36d9cc30c3038e09b9ddee6c86c">json_tokener.h</a>
-</li>
-<li>json_tokener_error_desc()
-: <a class="el" href="json__tokener_8h.html#a04c5625212aed3216cc303429e47f642">json_tokener.h</a>
-</li>
-<li>json_tokener_error_parse_array
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a574846740b785146f164a209dc89574e">json_tokener.h</a>
-</li>
-<li>json_tokener_error_parse_boolean
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59addbdfe084e20709da3d20c8ae8ca278c">json_tokener.h</a>
-</li>
-<li>json_tokener_error_parse_comment
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a3588c05b1da8b909a8cbdef66b0a1a28">json_tokener.h</a>
-</li>
-<li>json_tokener_error_parse_eof
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a8f774f4c7869afdd9b92295fca3a9ded">json_tokener.h</a>
-</li>
-<li>json_tokener_error_parse_null
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a641bbb8d881fdd1e463f20a1a203b77c">json_tokener.h</a>
-</li>
-<li>json_tokener_error_parse_number
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59ab1b3ad685eb97235d269cc5b9eb7ab81">json_tokener.h</a>
-</li>
-<li>json_tokener_error_parse_object_key_name
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a2003bd8e96c6680cd22419c5ceafd4c0">json_tokener.h</a>
-</li>
-<li>json_tokener_error_parse_object_key_sep
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59af91a2a819b0d6344d6d4e1d2579f28fd">json_tokener.h</a>
-</li>
-<li>json_tokener_error_parse_object_value_sep
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a9ddb98741aebf7ac44735b4a43717013">json_tokener.h</a>
-</li>
-<li>json_tokener_error_parse_string
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a033ce89ce7b8f9e591e4bea92121c4c7">json_tokener.h</a>
-</li>
-<li>json_tokener_error_parse_unexpected
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a3309fa8ea4ab3ee0a81c55b69d223710">json_tokener.h</a>
-</li>
-<li>json_tokener_error_size
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a1eeed74de65c0c12c9f9c28cf4f3ff1d">json_tokener.h</a>
-</li>
-<li>json_tokener_free()
-: <a class="el" href="json__tokener_8h.html#af6645ff27c0ca82c6e314390814fcbeb">json_tokener.h</a>
-</li>
-<li>json_tokener_get_error()
-: <a class="el" href="json__tokener_8h.html#ae8dff7f1ea11702aecf418e0da5574fe">json_tokener.h</a>
-</li>
-<li>json_tokener_new()
-: <a class="el" href="json__tokener_8h.html#a55d6e8a6f6d90992c063a39e21769c52">json_tokener.h</a>
-</li>
-<li>json_tokener_new_ex()
-: <a class="el" href="json__tokener_8h.html#a8c0696656dba7dde887a71e5c7686057">json_tokener.h</a>
-</li>
-<li>json_tokener_parse()
-: <a class="el" href="json__tokener_8h.html#abf031fdf1e5caab71e2225a99588c6bb">json_tokener.h</a>
-</li>
-<li>json_tokener_parse_ex()
-: <a class="el" href="json__tokener_8h.html#a0d9a666c21879647e8831f9cfa691673">json_tokener.h</a>
-</li>
-<li>json_tokener_parse_verbose()
-: <a class="el" href="json__tokener_8h.html#a1c8f5d8baad383dc8879615d2b02b53c">json_tokener.h</a>
-</li>
-<li>json_tokener_reset()
-: <a class="el" href="json__tokener_8h.html#ae23dd7ad4737bfc18409af6173ab2b09">json_tokener.h</a>
-</li>
-<li>json_tokener_set_flags()
-: <a class="el" href="json__tokener_8h.html#aaaee020e15fe8a8fcc4ce1e81b610e36">json_tokener.h</a>
-</li>
-<li>json_tokener_state
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2">json_tokener.h</a>
-</li>
-<li>json_tokener_state_array
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2ab3d763300f1914865be09d603ddc11f4">json_tokener.h</a>
-</li>
-<li>json_tokener_state_array_add
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2aa2a01798ebe318ea91c38a886418f771">json_tokener.h</a>
-</li>
-<li>json_tokener_state_array_after_sep
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2ab1a0ad626ec662c1ba4fb5bfee1cd0a9">json_tokener.h</a>
-</li>
-<li>json_tokener_state_array_sep
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a4ec7762aeab3424cbb14354c94025865">json_tokener.h</a>
-</li>
-<li>json_tokener_state_boolean
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a3525b15ecd0a698281b3914115b6bd3e">json_tokener.h</a>
-</li>
-<li>json_tokener_state_comment
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a8c2680b8873a8dce85f0b1ac25882dc9">json_tokener.h</a>
-</li>
-<li>json_tokener_state_comment_end
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a62cef297a37a98b1239ea4bbd39723e1">json_tokener.h</a>
-</li>
-<li>json_tokener_state_comment_eol
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2ad8151350b1ef50298bafbab244ac1162">json_tokener.h</a>
-</li>
-<li>json_tokener_state_comment_start
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a0ff1d1935d49188aa1e6b998d43e655c">json_tokener.h</a>
-</li>
-<li>json_tokener_state_eatws
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a9db152607ec1872a000f1fcd8757297d">json_tokener.h</a>
-</li>
-<li>json_tokener_state_escape_unicode
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a6c852da2e694be56799c58c201d6dca0">json_tokener.h</a>
-</li>
-<li>json_tokener_state_finish
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2ad80b689cb709967b67a348de3d8601d2">json_tokener.h</a>
-</li>
-<li>json_tokener_state_inf
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2ab9f6244bfca4924db61ed3050c780b53">json_tokener.h</a>
-</li>
-<li>json_tokener_state_null
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a668fb2654c59608945370003403a5792">json_tokener.h</a>
-</li>
-<li>json_tokener_state_number
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a7ce18d281d322af690b45f3b8b599e81">json_tokener.h</a>
-</li>
-<li>json_tokener_state_object_field
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a77375940a10806e81d99876d13be67fc">json_tokener.h</a>
-</li>
-<li>json_tokener_state_object_field_end
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a0220aea1d9204aadfffde92c7f73f5f7">json_tokener.h</a>
-</li>
-<li>json_tokener_state_object_field_start
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a8c7dbda177a5d83a36a64f7cb99b9a29">json_tokener.h</a>
-</li>
-<li>json_tokener_state_object_field_start_after_sep
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a3a2c9cf26d076936a10a6ae3ca4eb523">json_tokener.h</a>
-</li>
-<li>json_tokener_state_object_sep
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2adaf3e06c5fc04fd4f04040cd67698215">json_tokener.h</a>
-</li>
-<li>json_tokener_state_object_value
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a4c7b7deac37355491572f6da84f208aa">json_tokener.h</a>
-</li>
-<li>json_tokener_state_object_value_add
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2ade6bee72f2147e634b19eb84e58eb162">json_tokener.h</a>
-</li>
-<li>json_tokener_state_start
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a7c4c0bed1ebde45f5a99de4278792d72">json_tokener.h</a>
-</li>
-<li>json_tokener_state_string
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2aa90ea4c327a285bfbbce49d42d491d65">json_tokener.h</a>
-</li>
-<li>json_tokener_state_string_escape
-: <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a1cf793d73587f68c4f2b3b4f65ff728e">json_tokener.h</a>
-</li>
-<li>JSON_TOKENER_STRICT
-: <a class="el" href="json__tokener_8h.html#a72be595cb7e090c70b1d29feb1cbfb16">json_tokener.h</a>
-</li>
-<li>json_tokener_success
-: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59afe2fa9bde03155019b2df30f66a5fcd0">json_tokener.h</a>
-</li>
-<li>json_type
-: <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_object.h</a>
-</li>
-<li>json_type_array
-: <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06cae536c8c9da4648e6b9348abddde6113c">json_object.h</a>
-</li>
-<li>json_type_boolean
-: <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06ca5d15299e90dbb9935ff6d3e2c22a285c">json_object.h</a>
-</li>
-<li>json_type_double
-: <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06cac6ac2d9a16577d00210fea64d16b47cd">json_object.h</a>
-</li>
-<li>json_type_int
-: <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06ca7bf325c213b43c5f970ae2d4443ab956">json_object.h</a>
-</li>
-<li>json_type_null
-: <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06ca127e62d156e13517471fcde3378979c1">json_object.h</a>
-</li>
-<li>json_type_object
-: <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06cac966c8008f0b2c07da59ee8a60ad440f">json_object.h</a>
-</li>
-<li>json_type_string
-: <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06cac9f56e57c09245522d764015a054faa6">json_object.h</a>
-</li>
-<li>json_type_to_name()
-: <a class="el" href="json__util_8h.html#a74031a1b948dc9fed3f367ea6ce78389">json_util.h</a>
-</li>
-</ul>
-</div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated on Thu Apr 10 2014 20:04:09 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.5
-</small></address>
-</body>
-</html>
diff --git a/doc/html/globals_0x6c.html b/doc/html/globals_0x6c.html
deleted file mode 100644 (file)
index 07b04c0..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.5"/>
-<title>json-c: Globals</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
-   <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12</span>
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.5 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
-      <li class="current"><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
-</div><!-- top -->
-<div class="contents">
-<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
-
-<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
-<li>lh_abort()
-: <a class="el" href="linkhash_8h.html#a1294160fa0e80cee04cd745a401f43a4">linkhash.h</a>
-</li>
-<li>lh_char_equal()
-: <a class="el" href="linkhash_8h.html#ae4e9f21fb1a556c7a50c6b7ea61f2079">linkhash.h</a>
-</li>
-<li>lh_char_hash()
-: <a class="el" href="linkhash_8h.html#a1fcf495b9c4ce169630cb31f638b8435">linkhash.h</a>
-</li>
-<li>LH_EMPTY
-: <a class="el" href="linkhash_8h.html#a93fad7f8ae44575dc89c9567859972d2">linkhash.h</a>
-</li>
-<li>lh_entry_free_fn
-: <a class="el" href="linkhash_8h.html#a671553d0ee3c2a123190ba0f8ed2b635">linkhash.h</a>
-</li>
-<li>lh_equal_fn
-: <a class="el" href="linkhash_8h.html#a91fd85fc81b0c7c83c62f00e84729091">linkhash.h</a>
-</li>
-<li>lh_foreach
-: <a class="el" href="linkhash_8h.html#ad7dd67da915065dce2c6f44cb03e2d82">linkhash.h</a>
-</li>
-<li>lh_foreach_safe
-: <a class="el" href="linkhash_8h.html#abcbb0df08b4976d0649b826b6bacfca1">linkhash.h</a>
-</li>
-<li>LH_FREED
-: <a class="el" href="linkhash_8h.html#ac69428f2de0a6fb080b6fb373d506aa7">linkhash.h</a>
-</li>
-<li>lh_hash_fn
-: <a class="el" href="linkhash_8h.html#a38bae27995dcfb6ee3fb109a9be229b2">linkhash.h</a>
-</li>
-<li>lh_kchar_table_new()
-: <a class="el" href="linkhash_8h.html#a0aaf11e11ee5b0925279a52eab04bc38">linkhash.h</a>
-</li>
-<li>lh_kptr_table_new()
-: <a class="el" href="linkhash_8h.html#a705513954267a16cc1d40a284a7c441e">linkhash.h</a>
-</li>
-<li>LH_LOAD_FACTOR
-: <a class="el" href="linkhash_8h.html#a66b61772c29d85eb52b697e0b0dc0aaf">linkhash.h</a>
-</li>
-<li>LH_PRIME
-: <a class="el" href="linkhash_8h.html#a032f1bd115df254dda325437203ce5fb">linkhash.h</a>
-</li>
-<li>lh_ptr_equal()
-: <a class="el" href="linkhash_8h.html#a6ce3cb97560072c40f5caeaba85f756a">linkhash.h</a>
-</li>
-<li>lh_ptr_hash()
-: <a class="el" href="linkhash_8h.html#a2e560f0d3e5a20f6b0bfa4049737db23">linkhash.h</a>
-</li>
-<li>lh_table
-: <a class="el" href="json__object_8h.html#a766e90057496fc6712d6be0da180a21f">json_object.h</a>
-</li>
-<li>lh_table_delete()
-: <a class="el" href="linkhash_8h.html#a2fed2c78f70d229edb2d00775ffe593c">linkhash.h</a>
-</li>
-<li>lh_table_delete_entry()
-: <a class="el" href="linkhash_8h.html#ae5885a71c3457190fb1dc2d6e20dde3b">linkhash.h</a>
-</li>
-<li>lh_table_free()
-: <a class="el" href="linkhash_8h.html#a81653acf740cf8c9fe672e6cd16df0cf">linkhash.h</a>
-</li>
-<li>lh_table_insert()
-: <a class="el" href="linkhash_8h.html#a22b897763cc34a98c21c7fe82d151004">linkhash.h</a>
-</li>
-<li>lh_table_length()
-: <a class="el" href="linkhash_8h.html#ac9ba631c91fe80fb905f04c7cd526f2b">linkhash.h</a>
-</li>
-<li>lh_table_lookup_entry()
-: <a class="el" href="linkhash_8h.html#ad3b6ca2d967a6c3021ee6c39e014a918">linkhash.h</a>
-</li>
-<li>lh_table_lookup_ex()
-: <a class="el" href="linkhash_8h.html#a81c270bb0dd9d5c8a3e7ae20bc4d67f3">linkhash.h</a>
-</li>
-<li>lh_table_new()
-: <a class="el" href="linkhash_8h.html#ac3ba464ac43c083397b1f1d34f2ddf55">linkhash.h</a>
-</li>
-<li>lh_table_resize()
-: <a class="el" href="linkhash_8h.html#a5322eccf3394af7dc1ebb22af8f8c562">linkhash.h</a>
-</li>
-</ul>
-</div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated on Thu Apr 10 2014 07:35:21 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.5
-</small></address>
-</body>
-</html>
diff --git a/doc/html/globals_0x6d.html b/doc/html/globals_0x6d.html
deleted file mode 100644 (file)
index cbab1b1..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.5"/>
-<title>json-c: Globals</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
-   <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12</span>
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.5 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
-      <li class="current"><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
-</div><!-- top -->
-<div class="contents">
-<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
-
-<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
-<li>MC_DEBUG
-: <a class="el" href="debug_8h.html#afda355b35d18bf2e6a2a22d5c8eef42c">debug.h</a>
-</li>
-<li>mc_debug()
-: <a class="el" href="debug_8h.html#a600cf4cbbe19c0c15ca3710210e35aba">debug.h</a>
-</li>
-<li>MC_ERROR
-: <a class="el" href="debug_8h.html#a11ba39cecbe449af5b86fa2f78e9da9d">debug.h</a>
-</li>
-<li>mc_error()
-: <a class="el" href="debug_8h.html#abf22ea3a331c7ff21c23da91a07c7cb2">debug.h</a>
-</li>
-<li>MC_GET_DEBUG
-: <a class="el" href="debug_8h.html#acb272a4b4444b69cd995236f167f90ba">debug.h</a>
-</li>
-<li>mc_get_debug()
-: <a class="el" href="debug_8h.html#a3b3ab3ae8b438384fb109a2e38646b6e">debug.h</a>
-</li>
-<li>mc_info()
-: <a class="el" href="debug_8h.html#acbb92996a994e316ff65ed3a026e12a4">debug.h</a>
-</li>
-<li>MC_INFO
-: <a class="el" href="debug_8h.html#a5ef640ce1e9e61c5f6632aefbbfa0041">debug.h</a>
-</li>
-<li>MC_SET_DEBUG
-: <a class="el" href="debug_8h.html#a50f21a239fa040a10ad4cfdb4278b02b">debug.h</a>
-</li>
-<li>mc_set_debug()
-: <a class="el" href="debug_8h.html#af65a73617b71476020a005b20bf02726">debug.h</a>
-</li>
-<li>MC_SET_SYSLOG
-: <a class="el" href="debug_8h.html#acf1e895cb5eb7f334cbe51901e6bb918">debug.h</a>
-</li>
-<li>mc_set_syslog()
-: <a class="el" href="debug_8h.html#aadb888da410116384e75a00db30da705">debug.h</a>
-</li>
-</ul>
-</div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated on Thu Apr 10 2014 15:26:49 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.5
-</small></address>
-</body>
-</html>
diff --git a/doc/html/globals_0x70.html b/doc/html/globals_0x70.html
deleted file mode 100644 (file)
index 54d9af7..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.5"/>
-<title>json-c: Globals</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
-   <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12</span>
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.5 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
-      <li class="current"><a href="globals_0x70.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
-</div><!-- top -->
-<div class="contents">
-<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
-
-<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
-<li>printbuf
-: <a class="el" href="json__object_8h.html#ace274df280df67463ff417b1b3392395">json_object.h</a>
-</li>
-<li>printbuf_free()
-: <a class="el" href="printbuf_8h.html#ab525221c767ac65c58ddeea8a655a4e8">printbuf.h</a>
-</li>
-<li>printbuf_length
-: <a class="el" href="printbuf_8h.html#acdd84ad88987c0166b7ba0e3f1f8f1bb">printbuf.h</a>
-</li>
-<li>printbuf_memappend()
-: <a class="el" href="printbuf_8h.html#a22f09779a19db59a83e7cb8c2ce4c75f">printbuf.h</a>
-</li>
-<li>printbuf_memappend_fast
-: <a class="el" href="printbuf_8h.html#a6f3a4dc87fab41c37e3eff42f40dc346">printbuf.h</a>
-</li>
-<li>printbuf_memset()
-: <a class="el" href="printbuf_8h.html#ad7fc6ec4c296e85abf404244614cded5">printbuf.h</a>
-</li>
-<li>printbuf_new()
-: <a class="el" href="printbuf_8h.html#a3e390ebc7660a18335edd89f640fd415">printbuf.h</a>
-</li>
-<li>printbuf_reset()
-: <a class="el" href="printbuf_8h.html#a4393ee3dedb376af11c96fe97532292e">printbuf.h</a>
-</li>
-</ul>
-</div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated on Thu Apr 10 2014 15:16:09 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.5
-</small></address>
-</body>
-</html>
diff --git a/doc/html/globals_0x73.html b/doc/html/globals_0x73.html
deleted file mode 100644 (file)
index 3e0c57d..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.5"/>
-<title>json-c: Globals</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
-   <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12</span>
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.5 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
-      <li class="current"><a href="globals_0x73.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
-</div><!-- top -->
-<div class="contents">
-<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
-
-<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
-<li>sprintbuf()
-: <a class="el" href="printbuf_8h.html#adf6214db6c8ce994c7f7f1180863c8a4">printbuf.h</a>
-</li>
-</ul>
-</div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated on Thu Apr 10 2014 22:16:09 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.5
-</small></address>
-</body>
-</html>
diff --git a/doc/html/globals_0x74.html b/doc/html/globals_0x74.html
deleted file mode 100644 (file)
index 2e603d3..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.5"/>
-<title>json-c: Globals</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
-   <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12</span>
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.5 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
-      <li class="current"><a href="globals_0x74.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
-</div><!-- top -->
-<div class="contents">
-<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
-
-<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
-<li>THIS_FUNCTION_IS_DEPRECATED
-: <a class="el" href="json__object_8h.html#a84fa70b86686ce202058f63905c90078">json_object.h</a>
-, <a class="el" href="linkhash_8h.html#a849aa0ce9fe550c16ce81a215b1765ad">linkhash.h</a>
-</li>
-<li>TRUE
-: <a class="el" href="json__object_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d">json_object.h</a>
-</li>
-</ul>
-</div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated on Thu Apr 10 2014 12:06:17 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.5
-</small></address>
-</body>
-</html>
index be53e0c..eaac1e3 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li class="current"><a href="globals_a.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_e.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_f.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_h.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_i.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_j.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_l.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_m.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_p.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_s.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_t.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 <div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
 
-<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<h3><a id="index_a"></a>- a -</h3><ul>
 <li>array_list
-: <a class="el" href="json__object_8h.html#a6d6d32d8b026ea2025df519b9e90f44a">json_object.h</a>
+: <a class="el" href="arraylist_8h.html#a6d6d32d8b026ea2025df519b9e90f44a">arraylist.h</a>
 </li>
 <li>array_list_add()
 : <a class="el" href="arraylist_8h.html#a6e995608aa464244ff3184fb43574dc8">arraylist.h</a>
 </li>
+<li>array_list_bsearch()
+: <a class="el" href="arraylist_8h.html#a8dae21354e818f13dbe4e952daec2669">arraylist.h</a>
+</li>
 <li>ARRAY_LIST_DEFAULT_SIZE
 : <a class="el" href="arraylist_8h.html#acd30d910b398421574eb1f59e78617f5">arraylist.h</a>
 </li>
+<li>array_list_del_idx()
+: <a class="el" href="arraylist_8h.html#aecedd8601ee96e2fd8eff5d83fda89ab">arraylist.h</a>
+</li>
 <li>array_list_free()
 : <a class="el" href="arraylist_8h.html#acd00fb70f7ca82f23b48b812c3498f67">arraylist.h</a>
 </li>
 <li>array_list_free_fn
-: <a class="el" href="arraylist_8h.html#a41e5f51b1befa448b861e61a2c352bd6">arraylist.h</a>
+: <a class="el" href="arraylist_8h.html#a90d2ce204a483fa38f5514bad67222aa">arraylist.h</a>
 </li>
 <li>array_list_get_idx()
-: <a class="el" href="arraylist_8h.html#aa16207e545b6c1265299abcfa418dc2b">arraylist.h</a>
+: <a class="el" href="arraylist_8h.html#a114f1af5b20b76a3dbb2d1d055006df8">arraylist.h</a>
 </li>
 <li>array_list_length()
-: <a class="el" href="arraylist_8h.html#aa8393b4aa3dc447660371530439ab70f">arraylist.h</a>
+: <a class="el" href="arraylist_8h.html#aa3bf90f47aa210032304b14e7ad09ef7">arraylist.h</a>
 </li>
 <li>array_list_new()
 : <a class="el" href="arraylist_8h.html#a0d4bfac055dfd98e17296142abf4d894">arraylist.h</a>
 </li>
 <li>array_list_put_idx()
-: <a class="el" href="arraylist_8h.html#a21b8e4c59e52fbc5a9a5a098e3f96e76">arraylist.h</a>
+: <a class="el" href="arraylist_8h.html#a9f92076e9d8229f8a07e536dc286f811">arraylist.h</a>
 </li>
 <li>array_list_sort()
 : <a class="el" href="arraylist_8h.html#afb67cc8e2e5c9be41c3e644536079169">arraylist.h</a>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 11:08:39 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index fd4c2c9..1c0244c 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li class="current"><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="#index__"><span>_</span></a></li>
-      <li><a href="#index_a"><span>a</span></a></li>
-      <li><a href="#index_e"><span>e</span></a></li>
-      <li><a href="#index_f"><span>f</span></a></li>
-      <li><a href="#index_h"><span>h</span></a></li>
-      <li><a href="#index_i"><span>i</span></a></li>
-      <li><a href="#index_j"><span>j</span></a></li>
-      <li><a href="#index_l"><span>l</span></a></li>
-      <li><a href="#index_m"><span>m</span></a></li>
-      <li><a href="#index_p"><span>p</span></a></li>
-      <li class="current"><a href="#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 &#160;
 
-<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<h3><a id="index__"></a>- _ -</h3><ul>
 <li>__STRING
 : <a class="el" href="debug_8h.html#a375c4dc9f0fb338999de81aab826f9d6">debug.h</a>
 </li>
+<li>_LH_INLINE
+: <a class="el" href="linkhash_8h.html#a77c5cddef96e6f1ab036ccf911783456">linkhash.h</a>
+</li>
+<li>_LH_UNCONST
+: <a class="el" href="linkhash_8h.html#afb856ed4a9bcfd090dde5151fa3ad9ae">linkhash.h</a>
+</li>
+<li>_printbuf_check_literal
+: <a class="el" href="printbuf_8h.html#ab009973c5e15aae191e610cd70752603">printbuf.h</a>
+</li>
 </ul>
 
 
-<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<h3><a id="index_a"></a>- a -</h3><ul>
 <li>ARRAY_LIST_DEFAULT_SIZE
 : <a class="el" href="arraylist_8h.html#acd30d910b398421574eb1f59e78617f5">arraylist.h</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<h3><a id="index_e"></a>- e -</h3><ul>
 <li>error_description
 : <a class="el" href="bits_8h.html#a45afe86501cd57ee2beeef9d67a4d40c">bits.h</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<h3><a id="index_f"></a>- f -</h3><ul>
 <li>FALSE
 : <a class="el" href="json__object_8h.html#aa93f0eb578d23995850d61f7d61c55c1">json_object.h</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>HAVE_DECL_INFINITY
+: <a class="el" href="math__compat_8h.html#a77914bc4c960d1bfda49328bd0646985">math_compat.h</a>
+</li>
+<li>HAVE_DECL_NAN
+: <a class="el" href="math__compat_8h.html#a9025492cba029d3e372532a1d012f119">math_compat.h</a>
+</li>
 <li>hexdigit
 : <a class="el" href="bits_8h.html#a1cf38b22d3a118ad48d9282c32c048aa">bits.h</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>INFINITY
+: <a class="el" href="math__compat_8h.html#a956e2723d559858d08644ac99146e910">math_compat.h</a>
+</li>
 <li>is_error
 : <a class="el" href="bits_8h.html#a4a887e5fb7cde221bcab9c6f39d93fc1">bits.h</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_j"></a>- j -</h3><ul>
+<h3><a id="index_j"></a>- j -</h3><ul>
 <li>JASSERT
 : <a class="el" href="debug_8h.html#a8ca29550d5b1b73948f4a7bce53f2385">debug.h</a>
 </li>
 <li>JSON_C_MINOR_VERSION
 : <a class="el" href="json__c__version_8h.html#adc87477fbc1c75848fe6b6feec21c2d6">json_c_version.h</a>
 </li>
+<li>JSON_C_OBJECT_ADD_KEY_IS_NEW
+: <a class="el" href="json__object_8h.html#a8cd01c484155ac99043a35b7c85ae411">json_object.h</a>
+</li>
+<li>JSON_C_OBJECT_KEY_IS_CONSTANT
+: <a class="el" href="json__object_8h.html#a134ffafc6116799a20134dc7646b5a37">json_object.h</a>
+</li>
+<li>JSON_C_OPTION_GLOBAL
+: <a class="el" href="json__object_8h.html#a45837b8c6564f9e605f8a2bc76243750">json_object.h</a>
+</li>
+<li>JSON_C_OPTION_THREAD
+: <a class="el" href="json__object_8h.html#a50d1490598fe476d7a53e204e02cdc9d">json_object.h</a>
+</li>
+<li>JSON_C_STR_HASH_DFLT
+: <a class="el" href="linkhash_8h.html#ac32e80138c5be6dd9b0483a9cbcc8799">linkhash.h</a>
+</li>
+<li>JSON_C_STR_HASH_PERLLIKE
+: <a class="el" href="linkhash_8h.html#a62316f34fd42941b97a8e9a6b6e68faa">linkhash.h</a>
+</li>
+<li>JSON_C_TO_STRING_NOSLASHESCAPE
+: <a class="el" href="json__object_8h.html#a5c11d72c55f3ab7c088f19e7bf118163">json_object.h</a>
+</li>
 <li>JSON_C_TO_STRING_NOZERO
 : <a class="el" href="json__object_8h.html#a34f027c147babf69fc530d088f2b49b0">json_object.h</a>
 </li>
 <li>JSON_C_TO_STRING_PRETTY
 : <a class="el" href="json__object_8h.html#a2025bc677c35f130e117dfda5bf1ef73">json_object.h</a>
 </li>
+<li>JSON_C_TO_STRING_PRETTY_TAB
+: <a class="el" href="json__object_8h.html#afc1486af21f6b1653c6f523025bdfd3b">json_object.h</a>
+</li>
 <li>JSON_C_TO_STRING_SPACED
 : <a class="el" href="json__object_8h.html#aa821746c8668e6ad62bed90ec9e00103">json_object.h</a>
 </li>
 <li>JSON_C_VERSION_NUM
 : <a class="el" href="json__c__version_8h.html#a78e176eee75ee6aed43c4d65ca4c5b44">json_c_version.h</a>
 </li>
+<li>JSON_C_VISIT_RETURN_CONTINUE
+: <a class="el" href="json__visit_8h.html#a98b35e1ba1d52d41799dccbfd2c170a1">json_visit.h</a>
+</li>
+<li>JSON_C_VISIT_RETURN_ERROR
+: <a class="el" href="json__visit_8h.html#abfacb0713b81c897a8ce5f37ff6ffb9c">json_visit.h</a>
+</li>
+<li>JSON_C_VISIT_RETURN_POP
+: <a class="el" href="json__visit_8h.html#a327a21f1f1c6f84e7a13fbaaf4a51b13">json_visit.h</a>
+</li>
+<li>JSON_C_VISIT_RETURN_SKIP
+: <a class="el" href="json__visit_8h.html#adc7ca60a79c4ae870d9463e41527c2a1">json_visit.h</a>
+</li>
+<li>JSON_C_VISIT_RETURN_STOP
+: <a class="el" href="json__visit_8h.html#a5956f41bed48f90a127f9b37fad7ea97">json_visit.h</a>
+</li>
+<li>JSON_C_VISIT_SECOND
+: <a class="el" href="json__visit_8h.html#ac5be4a96b99b724833943003715dfc1c">json_visit.h</a>
+</li>
+<li>JSON_EXPORT
+: <a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">json_object.h</a>
+</li>
 <li>JSON_FILE_BUF_SIZE
 : <a class="el" href="json__util_8h.html#a084b6afc8f7fbef88976aabe4aca7efd">json_util.h</a>
 </li>
 <li>json_max
-: <a class="el" href="bits_8h.html#a57d63d199d4b9ea40359253618951300">bits.h</a>
+: <a class="el" href="json__util_8h.html#a57d63d199d4b9ea40359253618951300">json_util.h</a>
 </li>
 <li>json_min
-: <a class="el" href="bits_8h.html#a3dde282dc23d0eaa3c4840df8dc262d4">bits.h</a>
+: <a class="el" href="json__util_8h.html#a3dde282dc23d0eaa3c4840df8dc262d4">json_util.h</a>
 </li>
 <li>JSON_OBJECT_DEF_HASH_ENTRIES
 : <a class="el" href="json__object_8h.html#a268a63dd1b2e6d81559e268a4529e9bf">json_object.h</a>
 </ul>
 
 
-<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>LEN_DIRECT_STRING_DATA
+: <a class="el" href="json__object__private_8h.html#a227adaf0073e17006f614190d414fa1a">json_object_private.h</a>
+</li>
 <li>LH_EMPTY
 : <a class="el" href="linkhash_8h.html#a93fad7f8ae44575dc89c9567859972d2">linkhash.h</a>
 </li>
+<li>lh_entry_k
+: <a class="el" href="linkhash_8h.html#a7579ce28b8366fc9b8656f14270aa3aa">linkhash.h</a>
+</li>
+<li>lh_entry_v
+: <a class="el" href="linkhash_8h.html#a0d4052ccfd8c5d351a9c1d3ba07671b3">linkhash.h</a>
+</li>
 <li>lh_foreach
 : <a class="el" href="linkhash_8h.html#ad7dd67da915065dce2c6f44cb03e2d82">linkhash.h</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<h3><a id="index_m"></a>- m -</h3><ul>
 <li>MC_DEBUG
 : <a class="el" href="debug_8h.html#afda355b35d18bf2e6a2a22d5c8eef42c">debug.h</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>NAN
+: <a class="el" href="math__compat_8h.html#a8abfcc76130f3f991d124dd22d7e69bc">math_compat.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>PRId64
+: <a class="el" href="json__inttypes_8h.html#ae372e90b62c1e8b51dc5d95bf7f5ba48">json_inttypes.h</a>
+</li>
 <li>printbuf_length
 : <a class="el" href="printbuf_8h.html#acdd84ad88987c0166b7ba0e3f1f8f1bb">printbuf.h</a>
 </li>
 <li>printbuf_memappend_fast
 : <a class="el" href="printbuf_8h.html#a6f3a4dc87fab41c37e3eff42f40dc346">printbuf.h</a>
 </li>
+<li>printbuf_strappend
+: <a class="el" href="printbuf_8h.html#a2f30492682f5fbc59a8749b428e0e4ba">printbuf.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>SCNd64
+: <a class="el" href="json__inttypes_8h.html#ae7044b3fb4cc5cde22155d59437c348f">json_inttypes.h</a>
+</li>
+<li>strerror
+: <a class="el" href="strerror__override_8h.html#a9dae36435b1668856ec610d6d5238754">strerror_override.h</a>
+</li>
 </ul>
 
 
-<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<h3><a id="index_t"></a>- t -</h3><ul>
 <li>THIS_FUNCTION_IS_DEPRECATED
 : <a class="el" href="json__object_8h.html#a84fa70b86686ce202058f63905c90078">json_object.h</a>
 </li>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 05:14:31 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index a244f5b..8f5e6d2 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_a.html#index_a"><span>a</span></a></li>
-      <li class="current"><a href="globals_e.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_f.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_h.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_i.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_j.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_l.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_m.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_p.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_s.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_t.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 <div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
 
-<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<h3><a id="index_e"></a>- e -</h3><ul>
 <li>error_description
 : <a class="el" href="bits_8h.html#a45afe86501cd57ee2beeef9d67a4d40c">bits.h</a>
 </li>
@@ -83,9 +51,9 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 00:09:27 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index d1d5fa8..2013d8c 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li class="current"><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 &#160;<ul>
@@ -68,9 +52,9 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 16:28:39 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 4611869..06173cf 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li class="current"><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li class="current"><a href="#index_j"><span>j</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 &#160;
 
-<h3><a class="anchor" id="index_j"></a>- j -</h3><ul>
+<h3><a id="index_j"></a>- j -</h3><ul>
 <li>json_tokener_continue
 : <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a9b26e920ca765df91c84e999561d8fb0">json_tokener.h</a>
 </li>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 21:16:39 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index c688bf6..dc911fc 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_a.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_e.html#index_e"><span>e</span></a></li>
-      <li class="current"><a href="globals_f.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_h.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_i.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_j.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_l.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_m.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_p.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_s.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_t.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 <div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
 
-<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<h3><a id="index_f"></a>- f -</h3><ul>
 <li>FALSE
 : <a class="el" href="json__object_8h.html#aa93f0eb578d23995850d61f7d61c55c1">json_object.h</a>
 </li>
@@ -80,9 +48,9 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 23:24:39 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 4abfe18..e9246fd 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li><a href="globals.html"><span>All</span></a></li>
-      <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="#index_a"><span>a</span></a></li>
-      <li><a href="#index_j"><span>j</span></a></li>
-      <li><a href="#index_l"><span>l</span></a></li>
-      <li><a href="#index_m"><span>m</span></a></li>
-      <li><a href="#index_p"><span>p</span></a></li>
-      <li><a href="#index_s"><span>s</span></a></li>
-      <li class="current"><a href="#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 &#160;
 
-<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<h3><a id="index__"></a>- _ -</h3><ul>
+<li>_json_c_set_last_err()
+: <a class="el" href="json__object__private_8h.html#a2b38dd2d14fbfa6585de5664b6d61c0c">json_object_private.h</a>
+</li>
+<li>_json_c_strerror()
+: <a class="el" href="strerror__override_8h.html#a2affa276d0d7b0a446105e324560576f">strerror_override.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_a"></a>- a -</h3><ul>
 <li>array_list_add()
 : <a class="el" href="arraylist_8h.html#a6e995608aa464244ff3184fb43574dc8">arraylist.h</a>
 </li>
+<li>array_list_bsearch()
+: <a class="el" href="arraylist_8h.html#a8dae21354e818f13dbe4e952daec2669">arraylist.h</a>
+</li>
+<li>array_list_del_idx()
+: <a class="el" href="arraylist_8h.html#aecedd8601ee96e2fd8eff5d83fda89ab">arraylist.h</a>
+</li>
 <li>array_list_free()
 : <a class="el" href="arraylist_8h.html#acd00fb70f7ca82f23b48b812c3498f67">arraylist.h</a>
 </li>
 <li>array_list_get_idx()
-: <a class="el" href="arraylist_8h.html#aa16207e545b6c1265299abcfa418dc2b">arraylist.h</a>
+: <a class="el" href="arraylist_8h.html#a114f1af5b20b76a3dbb2d1d055006df8">arraylist.h</a>
 </li>
 <li>array_list_length()
-: <a class="el" href="arraylist_8h.html#aa8393b4aa3dc447660371530439ab70f">arraylist.h</a>
+: <a class="el" href="arraylist_8h.html#aa3bf90f47aa210032304b14e7ad09ef7">arraylist.h</a>
 </li>
 <li>array_list_new()
 : <a class="el" href="arraylist_8h.html#a0d4bfac055dfd98e17296142abf4d894">arraylist.h</a>
 </li>
 <li>array_list_put_idx()
-: <a class="el" href="arraylist_8h.html#a21b8e4c59e52fbc5a9a5a098e3f96e76">arraylist.h</a>
+: <a class="el" href="arraylist_8h.html#a9f92076e9d8229f8a07e536dc286f811">arraylist.h</a>
 </li>
 <li>array_list_sort()
 : <a class="el" href="arraylist_8h.html#afb67cc8e2e5c9be41c3e644536079169">arraylist.h</a>
 </ul>
 
 
-<h3><a class="anchor" id="index_j"></a>- j -</h3><ul>
+<h3><a id="index_j"></a>- j -</h3><ul>
 <li>json_c_get_random_seed()
 : <a class="el" href="random__seed_8h.html#ae190c6819d7687e110d6ec59a16d006f">random_seed.h</a>
 </li>
+<li>json_c_set_serialization_double_format()
+: <a class="el" href="json__object_8h.html#a865a9a3f897eb64a0354c21b972e8187">json_object.h</a>
+</li>
 <li>json_c_version()
 : <a class="el" href="json__c__version_8h.html#a536b398f292b0669fc824a8486131a27">json_c_version.h</a>
 </li>
 <li>json_c_version_num()
 : <a class="el" href="json__c__version_8h.html#a114bcfed9594f3cd662e43454000938d">json_c_version.h</a>
 </li>
+<li>json_c_visit()
+: <a class="el" href="json__visit_8h.html#ac13d0e2e7bf34cd1be6eee3f0f112045">json_visit.h</a>
+</li>
+<li>json_global_set_string_hash()
+: <a class="el" href="linkhash_8h.html#ac8e1d61af44d9c0824d8c7980385bcd3">linkhash.h</a>
+</li>
 <li>json_object_array_add()
-: <a class="el" href="json__object_8h.html#acc89c0f58947d499e2868ac8b62bed49">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a18cdd9a7455e09f36cdf6e5756b7f586">json_object.h</a>
+</li>
+<li>json_object_array_bsearch()
+: <a class="el" href="json__object_8h.html#aed353084ed3ad84e7b7575afbe7e719d">json_object.h</a>
+</li>
+<li>json_object_array_del_idx()
+: <a class="el" href="json__object_8h.html#a722eca9f578704d3af38b97549242c1f">json_object.h</a>
 </li>
 <li>json_object_array_get_idx()
-: <a class="el" href="json__object_8h.html#a5c9120a6d644ea12a61e2ec8520130c6">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a676711a76545d4ec65cc75f100f5fd19">json_object.h</a>
 </li>
 <li>json_object_array_length()
-: <a class="el" href="json__object_8h.html#a2e62d4b19de8f297595f3b4aaa0ec453">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ab9ea8f9c72d5adf83fdcbfe69f97fa44">json_object.h</a>
 </li>
 <li>json_object_array_put_idx()
-: <a class="el" href="json__object_8h.html#a2d19d21b495e1e0d3f711093d97a5104">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a1ac0ccdbc13a25da7d8b2dc9e421dfad">json_object.h</a>
 </li>
 <li>json_object_array_sort()
-: <a class="el" href="json__object_8h.html#aa1b05eeaa9c92f079facece87d6a0149">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a5584e2f2051cd1faa7fafd07ba888fd1">json_object.h</a>
+</li>
+<li>json_object_deep_copy()
+: <a class="el" href="json__object_8h.html#aaac16505f13bc56accfad82604d8bcdc">json_object.h</a>
+</li>
+<li>json_object_double_to_json_string()
+: <a class="el" href="json__object_8h.html#ada262c62364e3819b6a64b1e3a632336">json_object.h</a>
+</li>
+<li>json_object_equal()
+: <a class="el" href="json__object_8h.html#a5a1d4640525e0217059868e312f20579">json_object.h</a>
+</li>
+<li>json_object_from_fd()
+: <a class="el" href="json__util_8h.html#a62ba7e0f43eb72c418654acf4e263aa6">json_util.h</a>
 </li>
 <li>json_object_from_file()
 : <a class="el" href="json__util_8h.html#a8fa0bba6b7ddb149a2159d99bae709ce">json_util.h</a>
 </li>
 <li>json_object_get()
-: <a class="el" href="json__object_8h.html#acc3628d97c6308dc967006e4268c4e7f">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a675aa3a9cced685dbfd1c1a770a0c3e4">json_object.h</a>
 </li>
 <li>json_object_get_array()
-: <a class="el" href="json__object_8h.html#aba4e8df5e00bdc91a89bfb775e04ed70">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a23d20e3f886c1638a7116be66b7b5ec2">json_object.h</a>
 </li>
 <li>json_object_get_boolean()
-: <a class="el" href="json__object_8h.html#a3be3153ae5158ed24a49d74fbf14149f">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ac003fb99db7ecd674bb16d983d2f92ee">json_object.h</a>
 </li>
 <li>json_object_get_double()
-: <a class="el" href="json__object_8h.html#a9cf586fba906a597a121423045cb2a45">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a94a70cff6a14398b581b7b10b0792c5b">json_object.h</a>
 </li>
 <li>json_object_get_int()
-: <a class="el" href="json__object_8h.html#ae6cab7d4c7c707b9053035a6405d3891">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a8c56dc58a02f92cd6789ba5dcb9fe7b1">json_object.h</a>
 </li>
 <li>json_object_get_int64()
-: <a class="el" href="json__object_8h.html#a3493894ebd226249118582e640af6944">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a1a14750b3af4df18ec8dc93b090a8e8a">json_object.h</a>
 </li>
 <li>json_object_get_object()
-: <a class="el" href="json__object_8h.html#a9840421d6b45a7d00a42e13e379b54b5">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a2caa52ae1863bd073444f3737138a4db">json_object.h</a>
 </li>
 <li>json_object_get_string()
-: <a class="el" href="json__object_8h.html#ad24f1c4c22b2a7d33e7b562c01f2ca65">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a9ee29ca8d79896e15007131527f6002e">json_object.h</a>
 </li>
 <li>json_object_get_string_len()
-: <a class="el" href="json__object_8h.html#ad821384d0d8515d5ed4eec44d7101772">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ac1d1f95a27a5e5d93bb66a8adfc1a2f4">json_object.h</a>
 </li>
 <li>json_object_get_type()
-: <a class="el" href="json__object_8h.html#adc5e998b4897b6e450bd0975a58d2f72">json_object.h</a>
+: <a class="el" href="json__object_8h.html#af256a3a7910e271a2b9735e5044c3827">json_object.h</a>
+</li>
+<li>json_object_get_userdata()
+: <a class="el" href="json__object_8h.html#ae925f3ec0f61cba5ea3dd50e0315f194">json_object.h</a>
+</li>
+<li>json_object_int_inc()
+: <a class="el" href="json__object_8h.html#a25691322b2d1ab24a3797e5752eb659f">json_object.h</a>
 </li>
 <li>json_object_is_type()
-: <a class="el" href="json__object_8h.html#ab6dc8b19f8da310e78f402f83d6ae6c5">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a8ab506a3d8f4ba5eb6a12ce0a6bbd37b">json_object.h</a>
 </li>
 <li>json_object_iter_begin()
 : <a class="el" href="json__object__iterator_8h.html#a925eb97b5aa5b64986a0f663f53cf0fa">json_object_iterator.h</a>
 : <a class="el" href="json__object__iterator_8h.html#a47b0af7f1722c10475dffd29efc0b89d">json_object_iterator.h</a>
 </li>
 <li>json_object_new_array()
-: <a class="el" href="json__object_8h.html#a9b5af06e9a99e16c6d9b6459a685ea3f">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a84f7f8c0774c4600d958561d7548d649">json_object.h</a>
 </li>
 <li>json_object_new_boolean()
-: <a class="el" href="json__object_8h.html#a93cfacfdd1000c739ad19df0a080cb85">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a2e290acd80e72cca745f89fb4600fb78">json_object.h</a>
 </li>
 <li>json_object_new_double()
-: <a class="el" href="json__object_8h.html#a2e9c761833a4f5d0a0c60640377e3cec">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a594a093bafb9091f843da3197e0638aa">json_object.h</a>
 </li>
 <li>json_object_new_double_s()
-: <a class="el" href="json__object_8h.html#a50c188c8eb9007f05ab1aa0e22eae90c">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ae49671c026fe1ada370a75321e4e65f6">json_object.h</a>
 </li>
 <li>json_object_new_int()
-: <a class="el" href="json__object_8h.html#aa7db8ceb1afe1b93afc63c10b8c57560">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ae92f0770fb4b3c884ce35de52d3d7de8">json_object.h</a>
 </li>
 <li>json_object_new_int64()
-: <a class="el" href="json__object_8h.html#a54a27690a1927354966189166bba6ca3">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a7847f74494645c2b076505c37cc4cb93">json_object.h</a>
 </li>
 <li>json_object_new_object()
-: <a class="el" href="json__object_8h.html#af0ed3555604f39ac74b5e28bc5b1f82c">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a68c383f54544fca19b5f2425be397600">json_object.h</a>
 </li>
 <li>json_object_new_string()
-: <a class="el" href="json__object_8h.html#a48eb92a8208e6718e55edf1130e8e4b8">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a7b7b5302b3903c9347eeb1f4a64d657b">json_object.h</a>
 </li>
 <li>json_object_new_string_len()
-: <a class="el" href="json__object_8h.html#a9d14fd03ed7520c4aa33ab53b4569414">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a190e9bea8c39b257af69d392dd2ddffb">json_object.h</a>
 </li>
 <li>json_object_object_add()
-: <a class="el" href="json__object_8h.html#a04448b1c63173e1bfe49965835732075">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a27bd808a022251059a43f1f6370441cd">json_object.h</a>
+</li>
+<li>json_object_object_add_ex()
+: <a class="el" href="json__object_8h.html#a57d3e444dd7db6b4510d21bf3716a002">json_object.h</a>
 </li>
 <li>json_object_object_del()
-: <a class="el" href="json__object_8h.html#a03653c18aafccd1ffba1ad318e342845">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ac6605fdafca20bd5d33c84f4f80a3bda">json_object.h</a>
+</li>
+<li>json_object_object_get()
+: <a class="el" href="json__object_8h.html#a1a097805abb53b4c8a60d573730a8939">json_object.h</a>
 </li>
 <li>json_object_object_get_ex()
-: <a class="el" href="json__object_8h.html#af3f38b3395b1af8e9d3ac73818c3a936">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a90d5f16d58636f01d2ed1a6030c7366a">json_object.h</a>
 </li>
 <li>json_object_object_length()
-: <a class="el" href="json__object_8h.html#acde75a8e4ad28056b3e694ff43afbec0">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ad59a0ad2ec914a5eef90af53acae06d9">json_object.h</a>
 </li>
 <li>json_object_put()
-: <a class="el" href="json__object_8h.html#a1bb50e2d17832c404c3d5f13fbde5bf5">json_object.h</a>
+: <a class="el" href="json__object_8h.html#afabf61f932cd64a4122ca8092452eed5">json_object.h</a>
+</li>
+<li>json_object_set_boolean()
+: <a class="el" href="json__object_8h.html#a23863c1503f3a8dd8a460a6405da0a65">json_object.h</a>
+</li>
+<li>json_object_set_double()
+: <a class="el" href="json__object_8h.html#a3a7b7ce585565558cb69dad8d45d7757">json_object.h</a>
+</li>
+<li>json_object_set_int()
+: <a class="el" href="json__object_8h.html#a4ab3568f12e01fd2967e765a72456caa">json_object.h</a>
+</li>
+<li>json_object_set_int64()
+: <a class="el" href="json__object_8h.html#a7d3948600dde732abed0e261264ef53a">json_object.h</a>
 </li>
 <li>json_object_set_serializer()
-: <a class="el" href="json__object_8h.html#a2ce290cd15dba1c779727c6041d5a2dd">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a889345512a214b8f78f6a73561523c7c">json_object.h</a>
+</li>
+<li>json_object_set_string()
+: <a class="el" href="json__object_8h.html#ac35013e51cdc0651512801c947df431c">json_object.h</a>
+</li>
+<li>json_object_set_string_len()
+: <a class="el" href="json__object_8h.html#ae48707a0c8689e14aaa3a9b831db27fc">json_object.h</a>
+</li>
+<li>json_object_set_userdata()
+: <a class="el" href="json__object_8h.html#a4ee4281ccd123c62878e931a0a3bc43b">json_object.h</a>
+</li>
+<li>json_object_to_fd()
+: <a class="el" href="json__util_8h.html#adc52c3b220effc880270f095cd748433">json_util.h</a>
 </li>
 <li>json_object_to_file()
 : <a class="el" href="json__util_8h.html#abbd121df84ec3878a5cb8fefaff12ec7">json_util.h</a>
 : <a class="el" href="json__util_8h.html#a4e980954930951bf790c1ec3ba68fb76">json_util.h</a>
 </li>
 <li>json_object_to_json_string()
-: <a class="el" href="json__object_8h.html#a1f62a660e2619559d1f3f54cd7483ff8">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ab7390c22baa1700d977c2af6b22d43a4">json_object.h</a>
 </li>
 <li>json_object_to_json_string_ext()
-: <a class="el" href="json__object_8h.html#a84421dab94ccad42e901e534c6d7b658">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a9db613127bd4ef7db42307e43a85fc1b">json_object.h</a>
+</li>
+<li>json_object_to_json_string_length()
+: <a class="el" href="json__object_8h.html#add3770a3ba3d01a8f9adedfcd6bd8dbb">json_object.h</a>
 </li>
 <li>json_parse_double()
 : <a class="el" href="json__util_8h.html#a6b5790c15178b6ea97841fc5868b1e1a">json_util.h</a>
 <li>json_parse_int64()
 : <a class="el" href="json__util_8h.html#a9bb9882ef2859ca2c1ee17805679bc25">json_util.h</a>
 </li>
+<li>json_pointer_get()
+: <a class="el" href="json__pointer_8h.html#abf47f34be3386a5eb510604f05ae9491">json_pointer.h</a>
+</li>
+<li>json_pointer_getf()
+: <a class="el" href="json__pointer_8h.html#ae7eb2cab2f6f50c51053430223a01438">json_pointer.h</a>
+</li>
+<li>json_pointer_set()
+: <a class="el" href="json__pointer_8h.html#ab06a9fd172593748b2dc8d3a11c74fa0">json_pointer.h</a>
+</li>
+<li>json_pointer_setf()
+: <a class="el" href="json__pointer_8h.html#a74edfbe357c7428b1a20ae73e3910ac0">json_pointer.h</a>
+</li>
 <li>json_tokener_error_desc()
 : <a class="el" href="json__tokener_8h.html#a04c5625212aed3216cc303429e47f642">json_tokener.h</a>
 </li>
 <li>json_tokener_free()
-: <a class="el" href="json__tokener_8h.html#af6645ff27c0ca82c6e314390814fcbeb">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a887c4661906fc6b36cc366304e522534">json_tokener.h</a>
 </li>
 <li>json_tokener_get_error()
-: <a class="el" href="json__tokener_8h.html#ae8dff7f1ea11702aecf418e0da5574fe">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#af5d7ffd95a0f6e5d5bb5994d233b4197">json_tokener.h</a>
 </li>
 <li>json_tokener_new()
-: <a class="el" href="json__tokener_8h.html#a55d6e8a6f6d90992c063a39e21769c52">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a5ac7e2c350bc592cf2fa7b9935b00ef5">json_tokener.h</a>
 </li>
 <li>json_tokener_new_ex()
-: <a class="el" href="json__tokener_8h.html#a8c0696656dba7dde887a71e5c7686057">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a6a1583ddd434e13515d6232de813462e">json_tokener.h</a>
 </li>
 <li>json_tokener_parse()
-: <a class="el" href="json__tokener_8h.html#abf031fdf1e5caab71e2225a99588c6bb">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a236ef64d079822a4411d13eae7190c4d">json_tokener.h</a>
 </li>
 <li>json_tokener_parse_ex()
-: <a class="el" href="json__tokener_8h.html#a0d9a666c21879647e8831f9cfa691673">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a61679f178111963a9ffa3c8179553f7a">json_tokener.h</a>
 </li>
 <li>json_tokener_parse_verbose()
-: <a class="el" href="json__tokener_8h.html#a1c8f5d8baad383dc8879615d2b02b53c">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a735f2dc755d57ed5c5b807aaaaef3b14">json_tokener.h</a>
 </li>
 <li>json_tokener_reset()
-: <a class="el" href="json__tokener_8h.html#ae23dd7ad4737bfc18409af6173ab2b09">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a238649a59737be5152d525aeaf4153ab">json_tokener.h</a>
 </li>
 <li>json_tokener_set_flags()
-: <a class="el" href="json__tokener_8h.html#aaaee020e15fe8a8fcc4ce1e81b610e36">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a7e7a0c0c9dc79e5e47b2608bb8aad7b7">json_tokener.h</a>
 </li>
 <li>json_type_to_name()
 : <a class="el" href="json__util_8h.html#a74031a1b948dc9fed3f367ea6ce78389">json_util.h</a>
 </li>
+<li>json_util_get_last_err()
+: <a class="el" href="json__util_8h.html#a811b1a5a7544337811a44c26fbe88761">json_util.h</a>
+</li>
 </ul>
 
 
-<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<h3><a id="index_l"></a>- l -</h3><ul>
 <li>lh_abort()
 : <a class="el" href="linkhash_8h.html#a1294160fa0e80cee04cd745a401f43a4">linkhash.h</a>
 </li>
-<li>lh_char_equal()
-: <a class="el" href="linkhash_8h.html#ae4e9f21fb1a556c7a50c6b7ea61f2079">linkhash.h</a>
-</li>
-<li>lh_char_hash()
-: <a class="el" href="linkhash_8h.html#a1fcf495b9c4ce169630cb31f638b8435">linkhash.h</a>
-</li>
 <li>lh_kchar_table_new()
-: <a class="el" href="linkhash_8h.html#a0aaf11e11ee5b0925279a52eab04bc38">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#a6bf630754affe92612639542a6c49c3f">linkhash.h</a>
 </li>
 <li>lh_kptr_table_new()
-: <a class="el" href="linkhash_8h.html#a705513954267a16cc1d40a284a7c441e">linkhash.h</a>
-</li>
-<li>lh_ptr_equal()
-: <a class="el" href="linkhash_8h.html#a6ce3cb97560072c40f5caeaba85f756a">linkhash.h</a>
-</li>
-<li>lh_ptr_hash()
-: <a class="el" href="linkhash_8h.html#a2e560f0d3e5a20f6b0bfa4049737db23">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#af8108563b961dbf5471fe2c0e51f40a5">linkhash.h</a>
 </li>
 <li>lh_table_delete()
 : <a class="el" href="linkhash_8h.html#a2fed2c78f70d229edb2d00775ffe593c">linkhash.h</a>
 : <a class="el" href="linkhash_8h.html#a81653acf740cf8c9fe672e6cd16df0cf">linkhash.h</a>
 </li>
 <li>lh_table_insert()
-: <a class="el" href="linkhash_8h.html#a22b897763cc34a98c21c7fe82d151004">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#a86c0cd547be1e2c2486a73bd58e1352c">linkhash.h</a>
+</li>
+<li>lh_table_insert_w_hash()
+: <a class="el" href="linkhash_8h.html#a4558a9347a422e03a15b0b7a29b82dc3">linkhash.h</a>
 </li>
 <li>lh_table_length()
 : <a class="el" href="linkhash_8h.html#ac9ba631c91fe80fb905f04c7cd526f2b">linkhash.h</a>
 </li>
+<li>lh_table_lookup()
+: <a class="el" href="linkhash_8h.html#a49c27f18a174eaf126d1b7953df13cb1">linkhash.h</a>
+</li>
 <li>lh_table_lookup_entry()
 : <a class="el" href="linkhash_8h.html#ad3b6ca2d967a6c3021ee6c39e014a918">linkhash.h</a>
 </li>
+<li>lh_table_lookup_entry_w_hash()
+: <a class="el" href="linkhash_8h.html#a59ecaf34ef59280952f4459b2de63677">linkhash.h</a>
+</li>
 <li>lh_table_lookup_ex()
 : <a class="el" href="linkhash_8h.html#a81c270bb0dd9d5c8a3e7ae20bc4d67f3">linkhash.h</a>
 </li>
 <li>lh_table_new()
-: <a class="el" href="linkhash_8h.html#ac3ba464ac43c083397b1f1d34f2ddf55">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#a9c4f8a71dbe4d3390d9f7adb331beb0e">linkhash.h</a>
 </li>
 <li>lh_table_resize()
-: <a class="el" href="linkhash_8h.html#a5322eccf3394af7dc1ebb22af8f8c562">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#a30c8414e31aeee7669acc938116d933f">linkhash.h</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<h3><a id="index_m"></a>- m -</h3><ul>
 <li>mc_debug()
 : <a class="el" href="debug_8h.html#a600cf4cbbe19c0c15ca3710210e35aba">debug.h</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<h3><a id="index_p"></a>- p -</h3><ul>
 <li>printbuf_free()
 : <a class="el" href="printbuf_8h.html#ab525221c767ac65c58ddeea8a655a4e8">printbuf.h</a>
 </li>
 </ul>
 
 
-<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<h3><a id="index_s"></a>- s -</h3><ul>
 <li>sprintbuf()
 : <a class="el" href="printbuf_8h.html#adf6214db6c8ce994c7f7f1180863c8a4">printbuf.h</a>
 </li>
 </ul>
-
-
-<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
-<li>THIS_FUNCTION_IS_DEPRECATED()
-: <a class="el" href="json__object_8h.html#a1345aaf3ee46e9b6185355b733ec362d">json_object.h</a>
-, <a class="el" href="linkhash_8h.html#a849aa0ce9fe550c16ce81a215b1765ad">linkhash.h</a>
-</li>
-</ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 15:26:47 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index cecb210..2d86cf4 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_a.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_e.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_f.html#index_f"><span>f</span></a></li>
-      <li class="current"><a href="globals_h.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_i.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_j.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_l.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_m.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_p.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_s.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_t.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 <div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
 
-<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>HAVE_DECL_INFINITY
+: <a class="el" href="math__compat_8h.html#a77914bc4c960d1bfda49328bd0646985">math_compat.h</a>
+</li>
+<li>HAVE_DECL_NAN
+: <a class="el" href="math__compat_8h.html#a9025492cba029d3e372532a1d012f119">math_compat.h</a>
+</li>
 <li>hexdigit
 : <a class="el" href="bits_8h.html#a1cf38b22d3a118ad48d9282c32c048aa">bits.h</a>
 </li>
@@ -80,9 +54,9 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 16:28:39 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index d9aa7f0..ab84ada 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_a.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_e.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_f.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_h.html#index_h"><span>h</span></a></li>
-      <li class="current"><a href="globals_i.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_j.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_l.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_m.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_p.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_s.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_t.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 <div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
 
-<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>INFINITY
+: <a class="el" href="math__compat_8h.html#a956e2723d559858d08644ac99146e910">math_compat.h</a>
+</li>
 <li>is_error
 : <a class="el" href="bits_8h.html#a4a887e5fb7cde221bcab9c6f39d93fc1">bits.h</a>
 </li>
@@ -80,9 +51,9 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 18:53:43 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 1ac7ce1..f31e3d7 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_a.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_e.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_f.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_h.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_i.html#index_i"><span>i</span></a></li>
-      <li class="current"><a href="globals_j.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_l.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_m.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_p.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_s.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_t.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 <div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
 
-<h3><a class="anchor" id="index_j"></a>- j -</h3><ul>
+<h3><a id="index_j"></a>- j -</h3><ul>
 <li>JASSERT
 : <a class="el" href="debug_8h.html#a8ca29550d5b1b73948f4a7bce53f2385">debug.h</a>
 </li>
 <li>JSON_C_MINOR_VERSION
 : <a class="el" href="json__c__version_8h.html#adc87477fbc1c75848fe6b6feec21c2d6">json_c_version.h</a>
 </li>
+<li>JSON_C_OBJECT_ADD_KEY_IS_NEW
+: <a class="el" href="json__object_8h.html#a8cd01c484155ac99043a35b7c85ae411">json_object.h</a>
+</li>
+<li>JSON_C_OBJECT_KEY_IS_CONSTANT
+: <a class="el" href="json__object_8h.html#a134ffafc6116799a20134dc7646b5a37">json_object.h</a>
+</li>
+<li>JSON_C_OPTION_GLOBAL
+: <a class="el" href="json__object_8h.html#a45837b8c6564f9e605f8a2bc76243750">json_object.h</a>
+</li>
+<li>JSON_C_OPTION_THREAD
+: <a class="el" href="json__object_8h.html#a50d1490598fe476d7a53e204e02cdc9d">json_object.h</a>
+</li>
+<li>json_c_set_serialization_double_format()
+: <a class="el" href="json__object_8h.html#a865a9a3f897eb64a0354c21b972e8187">json_object.h</a>
+</li>
+<li>json_c_shallow_copy_default
+: <a class="el" href="json__object_8h.html#ad79dbd850536be7f59714b52bbd7ec30">json_object.h</a>
+</li>
+<li>json_c_shallow_copy_fn
+: <a class="el" href="json__object_8h.html#acfbe0648eb909870e346df0bb42e81e1">json_object.h</a>
+</li>
+<li>JSON_C_STR_HASH_DFLT
+: <a class="el" href="linkhash_8h.html#ac32e80138c5be6dd9b0483a9cbcc8799">linkhash.h</a>
+</li>
+<li>JSON_C_STR_HASH_PERLLIKE
+: <a class="el" href="linkhash_8h.html#a62316f34fd42941b97a8e9a6b6e68faa">linkhash.h</a>
+</li>
+<li>JSON_C_TO_STRING_NOSLASHESCAPE
+: <a class="el" href="json__object_8h.html#a5c11d72c55f3ab7c088f19e7bf118163">json_object.h</a>
+</li>
 <li>JSON_C_TO_STRING_NOZERO
 : <a class="el" href="json__object_8h.html#a34f027c147babf69fc530d088f2b49b0">json_object.h</a>
 </li>
 <li>JSON_C_TO_STRING_PRETTY
 : <a class="el" href="json__object_8h.html#a2025bc677c35f130e117dfda5bf1ef73">json_object.h</a>
 </li>
+<li>JSON_C_TO_STRING_PRETTY_TAB
+: <a class="el" href="json__object_8h.html#afc1486af21f6b1653c6f523025bdfd3b">json_object.h</a>
+</li>
 <li>JSON_C_TO_STRING_SPACED
 : <a class="el" href="json__object_8h.html#aa821746c8668e6ad62bed90ec9e00103">json_object.h</a>
 </li>
 <li>json_c_version_num()
 : <a class="el" href="json__c__version_8h.html#a114bcfed9594f3cd662e43454000938d">json_c_version.h</a>
 </li>
+<li>json_c_visit()
+: <a class="el" href="json__visit_8h.html#ac13d0e2e7bf34cd1be6eee3f0f112045">json_visit.h</a>
+</li>
+<li>JSON_C_VISIT_RETURN_CONTINUE
+: <a class="el" href="json__visit_8h.html#a98b35e1ba1d52d41799dccbfd2c170a1">json_visit.h</a>
+</li>
+<li>JSON_C_VISIT_RETURN_ERROR
+: <a class="el" href="json__visit_8h.html#abfacb0713b81c897a8ce5f37ff6ffb9c">json_visit.h</a>
+</li>
+<li>JSON_C_VISIT_RETURN_POP
+: <a class="el" href="json__visit_8h.html#a327a21f1f1c6f84e7a13fbaaf4a51b13">json_visit.h</a>
+</li>
+<li>JSON_C_VISIT_RETURN_SKIP
+: <a class="el" href="json__visit_8h.html#adc7ca60a79c4ae870d9463e41527c2a1">json_visit.h</a>
+</li>
+<li>JSON_C_VISIT_RETURN_STOP
+: <a class="el" href="json__visit_8h.html#a5956f41bed48f90a127f9b37fad7ea97">json_visit.h</a>
+</li>
+<li>JSON_C_VISIT_SECOND
+: <a class="el" href="json__visit_8h.html#ac5be4a96b99b724833943003715dfc1c">json_visit.h</a>
+</li>
+<li>json_c_visit_userfunc
+: <a class="el" href="json__visit_8h.html#a9e5b550cfae3f9cecd7a95b2cae336e0">json_visit.h</a>
+</li>
+<li>JSON_EXPORT
+: <a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">json_object.h</a>
+</li>
 <li>JSON_FILE_BUF_SIZE
 : <a class="el" href="json__util_8h.html#a084b6afc8f7fbef88976aabe4aca7efd">json_util.h</a>
 </li>
+<li>json_global_set_string_hash()
+: <a class="el" href="linkhash_8h.html#ac8e1d61af44d9c0824d8c7980385bcd3">linkhash.h</a>
+</li>
 <li>json_hex_chars
-: <a class="el" href="json__object_8h.html#a20dbe4913551cefa6b4b0a77fd4397c4">json_object.h</a>
+: <a class="el" href="json__object__private_8h.html#a20dbe4913551cefa6b4b0a77fd4397c4">json_object_private.h</a>
 </li>
 <li>json_max
-: <a class="el" href="bits_8h.html#a57d63d199d4b9ea40359253618951300">bits.h</a>
+: <a class="el" href="json__util_8h.html#a57d63d199d4b9ea40359253618951300">json_util.h</a>
 </li>
 <li>json_min
-: <a class="el" href="bits_8h.html#a3dde282dc23d0eaa3c4840df8dc262d4">bits.h</a>
+: <a class="el" href="json__util_8h.html#a3dde282dc23d0eaa3c4840df8dc262d4">json_util.h</a>
 </li>
 <li>json_number_chars
-: <a class="el" href="json__object_8h.html#a27427f89f2fc995639e366635fbe58ac">json_object.h</a>
+: <a class="el" href="json__object__private_8h.html#a27427f89f2fc995639e366635fbe58ac">json_object_private.h</a>
 </li>
 <li>json_object
 : <a class="el" href="json__object_8h.html#af27907ced0f5a43409ad96430fe0f914">json_object.h</a>
 </li>
 <li>json_object_array_add()
-: <a class="el" href="json__object_8h.html#acc89c0f58947d499e2868ac8b62bed49">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a18cdd9a7455e09f36cdf6e5756b7f586">json_object.h</a>
+</li>
+<li>json_object_array_bsearch()
+: <a class="el" href="json__object_8h.html#aed353084ed3ad84e7b7575afbe7e719d">json_object.h</a>
+</li>
+<li>json_object_array_del_idx()
+: <a class="el" href="json__object_8h.html#a722eca9f578704d3af38b97549242c1f">json_object.h</a>
 </li>
 <li>json_object_array_get_idx()
-: <a class="el" href="json__object_8h.html#a5c9120a6d644ea12a61e2ec8520130c6">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a676711a76545d4ec65cc75f100f5fd19">json_object.h</a>
 </li>
 <li>json_object_array_length()
-: <a class="el" href="json__object_8h.html#a2e62d4b19de8f297595f3b4aaa0ec453">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ab9ea8f9c72d5adf83fdcbfe69f97fa44">json_object.h</a>
 </li>
 <li>json_object_array_put_idx()
-: <a class="el" href="json__object_8h.html#a2d19d21b495e1e0d3f711093d97a5104">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a1ac0ccdbc13a25da7d8b2dc9e421dfad">json_object.h</a>
 </li>
 <li>json_object_array_sort()
-: <a class="el" href="json__object_8h.html#aa1b05eeaa9c92f079facece87d6a0149">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a5584e2f2051cd1faa7fafd07ba888fd1">json_object.h</a>
+</li>
+<li>json_object_deep_copy()
+: <a class="el" href="json__object_8h.html#aaac16505f13bc56accfad82604d8bcdc">json_object.h</a>
 </li>
 <li>JSON_OBJECT_DEF_HASH_ENTRIES
 : <a class="el" href="json__object_8h.html#a268a63dd1b2e6d81559e268a4529e9bf">json_object.h</a>
 </li>
 <li>json_object_delete_fn
-: <a class="el" href="json__object_8h.html#a3032a61c0ba2d38563b1b765f54ea46f">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a57e58c272b899b7034c3b5137935117f">json_object.h</a>
+</li>
+<li>json_object_double_to_json_string()
+: <a class="el" href="json__object_8h.html#ada262c62364e3819b6a64b1e3a632336">json_object.h</a>
+</li>
+<li>json_object_equal()
+: <a class="el" href="json__object_8h.html#a5a1d4640525e0217059868e312f20579">json_object.h</a>
 </li>
 <li>json_object_free_userdata
 : <a class="el" href="json__object_8h.html#adda8476609cc566ee62b80eaed310283">json_object.h</a>
 </li>
+<li>json_object_from_fd()
+: <a class="el" href="json__util_8h.html#a62ba7e0f43eb72c418654acf4e263aa6">json_util.h</a>
+</li>
 <li>json_object_from_file()
 : <a class="el" href="json__util_8h.html#a8fa0bba6b7ddb149a2159d99bae709ce">json_util.h</a>
 </li>
 <li>json_object_get()
-: <a class="el" href="json__object_8h.html#acc3628d97c6308dc967006e4268c4e7f">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a675aa3a9cced685dbfd1c1a770a0c3e4">json_object.h</a>
 </li>
 <li>json_object_get_array()
-: <a class="el" href="json__object_8h.html#aba4e8df5e00bdc91a89bfb775e04ed70">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a23d20e3f886c1638a7116be66b7b5ec2">json_object.h</a>
 </li>
 <li>json_object_get_boolean()
-: <a class="el" href="json__object_8h.html#a3be3153ae5158ed24a49d74fbf14149f">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ac003fb99db7ecd674bb16d983d2f92ee">json_object.h</a>
 </li>
 <li>json_object_get_double()
-: <a class="el" href="json__object_8h.html#a9cf586fba906a597a121423045cb2a45">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a94a70cff6a14398b581b7b10b0792c5b">json_object.h</a>
 </li>
 <li>json_object_get_int()
-: <a class="el" href="json__object_8h.html#ae6cab7d4c7c707b9053035a6405d3891">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a8c56dc58a02f92cd6789ba5dcb9fe7b1">json_object.h</a>
 </li>
 <li>json_object_get_int64()
-: <a class="el" href="json__object_8h.html#a3493894ebd226249118582e640af6944">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a1a14750b3af4df18ec8dc93b090a8e8a">json_object.h</a>
 </li>
 <li>json_object_get_object()
-: <a class="el" href="json__object_8h.html#a9840421d6b45a7d00a42e13e379b54b5">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a2caa52ae1863bd073444f3737138a4db">json_object.h</a>
 </li>
 <li>json_object_get_string()
-: <a class="el" href="json__object_8h.html#ad24f1c4c22b2a7d33e7b562c01f2ca65">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a9ee29ca8d79896e15007131527f6002e">json_object.h</a>
 </li>
 <li>json_object_get_string_len()
-: <a class="el" href="json__object_8h.html#ad821384d0d8515d5ed4eec44d7101772">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ac1d1f95a27a5e5d93bb66a8adfc1a2f4">json_object.h</a>
 </li>
 <li>json_object_get_type()
-: <a class="el" href="json__object_8h.html#adc5e998b4897b6e450bd0975a58d2f72">json_object.h</a>
+: <a class="el" href="json__object_8h.html#af256a3a7910e271a2b9735e5044c3827">json_object.h</a>
+</li>
+<li>json_object_get_userdata()
+: <a class="el" href="json__object_8h.html#ae925f3ec0f61cba5ea3dd50e0315f194">json_object.h</a>
+</li>
+<li>json_object_int_inc()
+: <a class="el" href="json__object_8h.html#a25691322b2d1ab24a3797e5752eb659f">json_object.h</a>
 </li>
 <li>json_object_is_type()
-: <a class="el" href="json__object_8h.html#ab6dc8b19f8da310e78f402f83d6ae6c5">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a8ab506a3d8f4ba5eb6a12ce0a6bbd37b">json_object.h</a>
 </li>
 <li>json_object_iter
 : <a class="el" href="json__object_8h.html#af88126730e765f2068968f4b16fd074f">json_object.h</a>
 : <a class="el" href="json__object__iterator_8h.html#a47b0af7f1722c10475dffd29efc0b89d">json_object_iterator.h</a>
 </li>
 <li>json_object_new_array()
-: <a class="el" href="json__object_8h.html#a9b5af06e9a99e16c6d9b6459a685ea3f">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a84f7f8c0774c4600d958561d7548d649">json_object.h</a>
 </li>
 <li>json_object_new_boolean()
-: <a class="el" href="json__object_8h.html#a93cfacfdd1000c739ad19df0a080cb85">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a2e290acd80e72cca745f89fb4600fb78">json_object.h</a>
 </li>
 <li>json_object_new_double()
-: <a class="el" href="json__object_8h.html#a2e9c761833a4f5d0a0c60640377e3cec">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a594a093bafb9091f843da3197e0638aa">json_object.h</a>
 </li>
 <li>json_object_new_double_s()
-: <a class="el" href="json__object_8h.html#a50c188c8eb9007f05ab1aa0e22eae90c">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ae49671c026fe1ada370a75321e4e65f6">json_object.h</a>
 </li>
 <li>json_object_new_int()
-: <a class="el" href="json__object_8h.html#aa7db8ceb1afe1b93afc63c10b8c57560">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ae92f0770fb4b3c884ce35de52d3d7de8">json_object.h</a>
 </li>
 <li>json_object_new_int64()
-: <a class="el" href="json__object_8h.html#a54a27690a1927354966189166bba6ca3">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a7847f74494645c2b076505c37cc4cb93">json_object.h</a>
 </li>
 <li>json_object_new_object()
-: <a class="el" href="json__object_8h.html#af0ed3555604f39ac74b5e28bc5b1f82c">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a68c383f54544fca19b5f2425be397600">json_object.h</a>
 </li>
 <li>json_object_new_string()
-: <a class="el" href="json__object_8h.html#a48eb92a8208e6718e55edf1130e8e4b8">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a7b7b5302b3903c9347eeb1f4a64d657b">json_object.h</a>
 </li>
 <li>json_object_new_string_len()
-: <a class="el" href="json__object_8h.html#a9d14fd03ed7520c4aa33ab53b4569414">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a190e9bea8c39b257af69d392dd2ddffb">json_object.h</a>
 </li>
 <li>json_object_object_add()
-: <a class="el" href="json__object_8h.html#a04448b1c63173e1bfe49965835732075">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a27bd808a022251059a43f1f6370441cd">json_object.h</a>
+</li>
+<li>json_object_object_add_ex()
+: <a class="el" href="json__object_8h.html#a57d3e444dd7db6b4510d21bf3716a002">json_object.h</a>
 </li>
 <li>json_object_object_del()
-: <a class="el" href="json__object_8h.html#a03653c18aafccd1ffba1ad318e342845">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ac6605fdafca20bd5d33c84f4f80a3bda">json_object.h</a>
 </li>
 <li>json_object_object_foreach
 : <a class="el" href="json__object_8h.html#acf5f514a9e0061c10fc08055762639ee">json_object.h</a>
 <li>json_object_object_foreachC
 : <a class="el" href="json__object_8h.html#a71f07006c12d78f7bbf4cb716a5af3a6">json_object.h</a>
 </li>
+<li>json_object_object_get()
+: <a class="el" href="json__object_8h.html#a1a097805abb53b4c8a60d573730a8939">json_object.h</a>
+</li>
 <li>json_object_object_get_ex()
-: <a class="el" href="json__object_8h.html#af3f38b3395b1af8e9d3ac73818c3a936">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a90d5f16d58636f01d2ed1a6030c7366a">json_object.h</a>
 </li>
 <li>json_object_object_length()
-: <a class="el" href="json__object_8h.html#acde75a8e4ad28056b3e694ff43afbec0">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ad59a0ad2ec914a5eef90af53acae06d9">json_object.h</a>
 </li>
 <li>json_object_private_delete_fn
-: <a class="el" href="json__object__private_8h.html#aa7d02026483e5ff3af5d6181d4efd032">json_object_private.h</a>
+: <a class="el" href="json__object__private_8h.html#a725ac370dfd6c705c02d8d85b78f1050">json_object_private.h</a>
 </li>
 <li>json_object_put()
-: <a class="el" href="json__object_8h.html#a1bb50e2d17832c404c3d5f13fbde5bf5">json_object.h</a>
+: <a class="el" href="json__object_8h.html#afabf61f932cd64a4122ca8092452eed5">json_object.h</a>
+</li>
+<li>json_object_set_boolean()
+: <a class="el" href="json__object_8h.html#a23863c1503f3a8dd8a460a6405da0a65">json_object.h</a>
+</li>
+<li>json_object_set_double()
+: <a class="el" href="json__object_8h.html#a3a7b7ce585565558cb69dad8d45d7757">json_object.h</a>
+</li>
+<li>json_object_set_int()
+: <a class="el" href="json__object_8h.html#a4ab3568f12e01fd2967e765a72456caa">json_object.h</a>
+</li>
+<li>json_object_set_int64()
+: <a class="el" href="json__object_8h.html#a7d3948600dde732abed0e261264ef53a">json_object.h</a>
 </li>
 <li>json_object_set_serializer()
-: <a class="el" href="json__object_8h.html#a2ce290cd15dba1c779727c6041d5a2dd">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a889345512a214b8f78f6a73561523c7c">json_object.h</a>
+</li>
+<li>json_object_set_string()
+: <a class="el" href="json__object_8h.html#ac35013e51cdc0651512801c947df431c">json_object.h</a>
+</li>
+<li>json_object_set_string_len()
+: <a class="el" href="json__object_8h.html#ae48707a0c8689e14aaa3a9b831db27fc">json_object.h</a>
+</li>
+<li>json_object_set_userdata()
+: <a class="el" href="json__object_8h.html#a4ee4281ccd123c62878e931a0a3bc43b">json_object.h</a>
+</li>
+<li>json_object_to_fd()
+: <a class="el" href="json__util_8h.html#adc52c3b220effc880270f095cd748433">json_util.h</a>
 </li>
 <li>json_object_to_file()
 : <a class="el" href="json__util_8h.html#abbd121df84ec3878a5cb8fefaff12ec7">json_util.h</a>
 : <a class="el" href="json__util_8h.html#a4e980954930951bf790c1ec3ba68fb76">json_util.h</a>
 </li>
 <li>json_object_to_json_string()
-: <a class="el" href="json__object_8h.html#a1f62a660e2619559d1f3f54cd7483ff8">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ab7390c22baa1700d977c2af6b22d43a4">json_object.h</a>
 </li>
 <li>json_object_to_json_string_ext()
-: <a class="el" href="json__object_8h.html#a84421dab94ccad42e901e534c6d7b658">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a9db613127bd4ef7db42307e43a85fc1b">json_object.h</a>
 </li>
 <li>json_object_to_json_string_fn
-: <a class="el" href="json__object_8h.html#a7806d0a6826ac08f6f8b09636207870e">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ad689953451ffa828830d349f4cd72563">json_object.h</a>
+</li>
+<li>json_object_to_json_string_length()
+: <a class="el" href="json__object_8h.html#add3770a3ba3d01a8f9adedfcd6bd8dbb">json_object.h</a>
 </li>
 <li>json_object_userdata_to_json_string
 : <a class="el" href="json__object_8h.html#a8bc341281f4dd60b53b03b2dec0fae28">json_object.h</a>
 <li>json_parse_int64()
 : <a class="el" href="json__util_8h.html#a9bb9882ef2859ca2c1ee17805679bc25">json_util.h</a>
 </li>
+<li>json_pointer_get()
+: <a class="el" href="json__pointer_8h.html#abf47f34be3386a5eb510604f05ae9491">json_pointer.h</a>
+</li>
+<li>json_pointer_getf()
+: <a class="el" href="json__pointer_8h.html#ae7eb2cab2f6f50c51053430223a01438">json_pointer.h</a>
+</li>
+<li>json_pointer_set()
+: <a class="el" href="json__pointer_8h.html#ab06a9fd172593748b2dc8d3a11c74fa0">json_pointer.h</a>
+</li>
+<li>json_pointer_setf()
+: <a class="el" href="json__pointer_8h.html#a74edfbe357c7428b1a20ae73e3910ac0">json_pointer.h</a>
+</li>
 <li>json_tokener
-: <a class="el" href="json__object_8h.html#a4dd5e5b65aee7f376f529f86b210ff49">json_object.h</a>
+: <a class="el" href="json__tokener_8h.html#a4dd5e5b65aee7f376f529f86b210ff49">json_tokener.h</a>
 </li>
 <li>json_tokener_continue
 : <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a9b26e920ca765df91c84e999561d8fb0">json_tokener.h</a>
 : <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a1eeed74de65c0c12c9f9c28cf4f3ff1d">json_tokener.h</a>
 </li>
 <li>json_tokener_free()
-: <a class="el" href="json__tokener_8h.html#af6645ff27c0ca82c6e314390814fcbeb">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a887c4661906fc6b36cc366304e522534">json_tokener.h</a>
 </li>
 <li>json_tokener_get_error()
-: <a class="el" href="json__tokener_8h.html#ae8dff7f1ea11702aecf418e0da5574fe">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#af5d7ffd95a0f6e5d5bb5994d233b4197">json_tokener.h</a>
 </li>
 <li>json_tokener_new()
-: <a class="el" href="json__tokener_8h.html#a55d6e8a6f6d90992c063a39e21769c52">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a5ac7e2c350bc592cf2fa7b9935b00ef5">json_tokener.h</a>
 </li>
 <li>json_tokener_new_ex()
-: <a class="el" href="json__tokener_8h.html#a8c0696656dba7dde887a71e5c7686057">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a6a1583ddd434e13515d6232de813462e">json_tokener.h</a>
 </li>
 <li>json_tokener_parse()
-: <a class="el" href="json__tokener_8h.html#abf031fdf1e5caab71e2225a99588c6bb">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a236ef64d079822a4411d13eae7190c4d">json_tokener.h</a>
 </li>
 <li>json_tokener_parse_ex()
-: <a class="el" href="json__tokener_8h.html#a0d9a666c21879647e8831f9cfa691673">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a61679f178111963a9ffa3c8179553f7a">json_tokener.h</a>
 </li>
 <li>json_tokener_parse_verbose()
-: <a class="el" href="json__tokener_8h.html#a1c8f5d8baad383dc8879615d2b02b53c">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a735f2dc755d57ed5c5b807aaaaef3b14">json_tokener.h</a>
 </li>
 <li>json_tokener_reset()
-: <a class="el" href="json__tokener_8h.html#ae23dd7ad4737bfc18409af6173ab2b09">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a238649a59737be5152d525aeaf4153ab">json_tokener.h</a>
 </li>
 <li>json_tokener_set_flags()
-: <a class="el" href="json__tokener_8h.html#aaaee020e15fe8a8fcc4ce1e81b610e36">json_tokener.h</a>
+: <a class="el" href="json__tokener_8h.html#a7e7a0c0c9dc79e5e47b2608bb8aad7b7">json_tokener.h</a>
 </li>
 <li>json_tokener_state
 : <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2">json_tokener.h</a>
 : <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59afe2fa9bde03155019b2df30f66a5fcd0">json_tokener.h</a>
 </li>
 <li>json_type
-: <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_object.h</a>
+: <a class="el" href="json__object_8h.html#aba5eff84f8638d22f50403175f270c96">json_object.h</a>
 </li>
 <li>json_type_array
 : <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06cae536c8c9da4648e6b9348abddde6113c">json_object.h</a>
 <li>json_type_to_name()
 : <a class="el" href="json__util_8h.html#a74031a1b948dc9fed3f367ea6ce78389">json_util.h</a>
 </li>
+<li>json_util_get_last_err()
+: <a class="el" href="json__util_8h.html#a811b1a5a7544337811a44c26fbe88761">json_util.h</a>
+</li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 01:41:11 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 1da769f..6469788 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_a.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_e.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_f.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_h.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_i.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_j.html#index_j"><span>j</span></a></li>
-      <li class="current"><a href="globals_l.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_m.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_p.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_s.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_t.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 <div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
 
-<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>LEN_DIRECT_STRING_DATA
+: <a class="el" href="json__object__private_8h.html#a227adaf0073e17006f614190d414fa1a">json_object_private.h</a>
+</li>
 <li>lh_abort()
 : <a class="el" href="linkhash_8h.html#a1294160fa0e80cee04cd745a401f43a4">linkhash.h</a>
 </li>
-<li>lh_char_equal()
-: <a class="el" href="linkhash_8h.html#ae4e9f21fb1a556c7a50c6b7ea61f2079">linkhash.h</a>
-</li>
-<li>lh_char_hash()
-: <a class="el" href="linkhash_8h.html#a1fcf495b9c4ce169630cb31f638b8435">linkhash.h</a>
-</li>
 <li>LH_EMPTY
 : <a class="el" href="linkhash_8h.html#a93fad7f8ae44575dc89c9567859972d2">linkhash.h</a>
 </li>
 <li>lh_entry_free_fn
-: <a class="el" href="linkhash_8h.html#a0c6811f660b93857aafdbfdf80d9696b">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#a481b0bb1ab1d6a83713d9c27aa9f07d2">linkhash.h</a>
+</li>
+<li>lh_entry_k
+: <a class="el" href="linkhash_8h.html#a7579ce28b8366fc9b8656f14270aa3aa">linkhash.h</a>
+</li>
+<li>lh_entry_v
+: <a class="el" href="linkhash_8h.html#a0d4052ccfd8c5d351a9c1d3ba07671b3">linkhash.h</a>
 </li>
 <li>lh_equal_fn
-: <a class="el" href="linkhash_8h.html#abcbf0e4849fb0c6279827ac3b66d15c3">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#af74a0690267598a0ed6f0a9b66674573">linkhash.h</a>
 </li>
 <li>lh_foreach
 : <a class="el" href="linkhash_8h.html#ad7dd67da915065dce2c6f44cb03e2d82">linkhash.h</a>
 : <a class="el" href="linkhash_8h.html#ac69428f2de0a6fb080b6fb373d506aa7">linkhash.h</a>
 </li>
 <li>lh_hash_fn
-: <a class="el" href="linkhash_8h.html#a1780449146b716ad5e6ed0a0207d0417">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#a91d16eb45069d235a198d2184a77d0ae">linkhash.h</a>
 </li>
 <li>lh_kchar_table_new()
-: <a class="el" href="linkhash_8h.html#a0aaf11e11ee5b0925279a52eab04bc38">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#a6bf630754affe92612639542a6c49c3f">linkhash.h</a>
 </li>
 <li>lh_kptr_table_new()
-: <a class="el" href="linkhash_8h.html#a705513954267a16cc1d40a284a7c441e">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#af8108563b961dbf5471fe2c0e51f40a5">linkhash.h</a>
 </li>
 <li>LH_LOAD_FACTOR
 : <a class="el" href="linkhash_8h.html#a66b61772c29d85eb52b697e0b0dc0aaf">linkhash.h</a>
 <li>LH_PRIME
 : <a class="el" href="linkhash_8h.html#a032f1bd115df254dda325437203ce5fb">linkhash.h</a>
 </li>
-<li>lh_ptr_equal()
-: <a class="el" href="linkhash_8h.html#a6ce3cb97560072c40f5caeaba85f756a">linkhash.h</a>
-</li>
-<li>lh_ptr_hash()
-: <a class="el" href="linkhash_8h.html#a2e560f0d3e5a20f6b0bfa4049737db23">linkhash.h</a>
-</li>
 <li>lh_table
-: <a class="el" href="json__object_8h.html#a766e90057496fc6712d6be0da180a21f">json_object.h</a>
+: <a class="el" href="linkhash_8h.html#a766e90057496fc6712d6be0da180a21f">linkhash.h</a>
 </li>
 <li>lh_table_delete()
 : <a class="el" href="linkhash_8h.html#a2fed2c78f70d229edb2d00775ffe593c">linkhash.h</a>
 : <a class="el" href="linkhash_8h.html#a81653acf740cf8c9fe672e6cd16df0cf">linkhash.h</a>
 </li>
 <li>lh_table_insert()
-: <a class="el" href="linkhash_8h.html#a22b897763cc34a98c21c7fe82d151004">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#a86c0cd547be1e2c2486a73bd58e1352c">linkhash.h</a>
+</li>
+<li>lh_table_insert_w_hash()
+: <a class="el" href="linkhash_8h.html#a4558a9347a422e03a15b0b7a29b82dc3">linkhash.h</a>
 </li>
 <li>lh_table_length()
 : <a class="el" href="linkhash_8h.html#ac9ba631c91fe80fb905f04c7cd526f2b">linkhash.h</a>
 </li>
+<li>lh_table_lookup()
+: <a class="el" href="linkhash_8h.html#a49c27f18a174eaf126d1b7953df13cb1">linkhash.h</a>
+</li>
 <li>lh_table_lookup_entry()
 : <a class="el" href="linkhash_8h.html#ad3b6ca2d967a6c3021ee6c39e014a918">linkhash.h</a>
 </li>
+<li>lh_table_lookup_entry_w_hash()
+: <a class="el" href="linkhash_8h.html#a59ecaf34ef59280952f4459b2de63677">linkhash.h</a>
+</li>
 <li>lh_table_lookup_ex()
 : <a class="el" href="linkhash_8h.html#a81c270bb0dd9d5c8a3e7ae20bc4d67f3">linkhash.h</a>
 </li>
 <li>lh_table_new()
-: <a class="el" href="linkhash_8h.html#ac3ba464ac43c083397b1f1d34f2ddf55">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#a9c4f8a71dbe4d3390d9f7adb331beb0e">linkhash.h</a>
 </li>
 <li>lh_table_resize()
-: <a class="el" href="linkhash_8h.html#a5322eccf3394af7dc1ebb22af8f8c562">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#a30c8414e31aeee7669acc938116d933f">linkhash.h</a>
 </li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 09:09:11 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 509ad9b..4ca8251 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_a.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_e.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_f.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_h.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_i.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_j.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_l.html#index_l"><span>l</span></a></li>
-      <li class="current"><a href="globals_m.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_p.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_s.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_t.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 <div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
 
-<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
-<li>MC_DEBUG
-: <a class="el" href="debug_8h.html#afda355b35d18bf2e6a2a22d5c8eef42c">debug.h</a>
-</li>
+<h3><a id="index_m"></a>- m -</h3><ul>
 <li>mc_debug()
 : <a class="el" href="debug_8h.html#a600cf4cbbe19c0c15ca3710210e35aba">debug.h</a>
 </li>
+<li>MC_DEBUG
+: <a class="el" href="debug_8h.html#afda355b35d18bf2e6a2a22d5c8eef42c">debug.h</a>
+</li>
 <li>MC_ERROR
 : <a class="el" href="debug_8h.html#a11ba39cecbe449af5b86fa2f78e9da9d">debug.h</a>
 </li>
 <li>mc_get_debug()
 : <a class="el" href="debug_8h.html#a3b3ab3ae8b438384fb109a2e38646b6e">debug.h</a>
 </li>
-<li>mc_info()
-: <a class="el" href="debug_8h.html#acbb92996a994e316ff65ed3a026e12a4">debug.h</a>
-</li>
 <li>MC_INFO
 : <a class="el" href="debug_8h.html#a5ef640ce1e9e61c5f6632aefbbfa0041">debug.h</a>
 </li>
+<li>mc_info()
+: <a class="el" href="debug_8h.html#acbb92996a994e316ff65ed3a026e12a4">debug.h</a>
+</li>
 <li>MC_SET_DEBUG
 : <a class="el" href="debug_8h.html#a50f21a239fa040a10ad4cfdb4278b02b">debug.h</a>
 </li>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 07:13:59 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
diff --git a/doc/html/globals_n.html b/doc/html/globals_n.html
new file mode 100644 (file)
index 0000000..2f60a80
--- /dev/null
@@ -0,0 +1,56 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>json-c: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">json-c
+   &#160;<span id="projectnumber">0.13</span>
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div class="contents">
+<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>NAN
+: <a class="el" href="math__compat_8h.html#a8abfcc76130f3f991d124dd22d7e69bc">math_compat.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
index 4c5504f..cde10f1 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_a.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_e.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_f.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_h.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_i.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_j.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_l.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_m.html#index_m"><span>m</span></a></li>
-      <li class="current"><a href="globals_p.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_s.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_t.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 <div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
 
-<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>PRId64
+: <a class="el" href="json__inttypes_8h.html#ae372e90b62c1e8b51dc5d95bf7f5ba48">json_inttypes.h</a>
+</li>
 <li>printbuf
-: <a class="el" href="json__object_8h.html#ace274df280df67463ff417b1b3392395">json_object.h</a>
+: <a class="el" href="printbuf_8h.html#ace274df280df67463ff417b1b3392395">printbuf.h</a>
 </li>
 <li>printbuf_free()
 : <a class="el" href="printbuf_8h.html#ab525221c767ac65c58ddeea8a655a4e8">printbuf.h</a>
 <li>printbuf_reset()
 : <a class="el" href="printbuf_8h.html#a4393ee3dedb376af11c96fe97532292e">printbuf.h</a>
 </li>
+<li>printbuf_strappend
+: <a class="el" href="printbuf_8h.html#a2f30492682f5fbc59a8749b428e0e4ba">printbuf.h</a>
+</li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 05:27:19 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 79972be..a0a8ede 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_a.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_e.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_f.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_h.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_i.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_j.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_l.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_m.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_p.html#index_p"><span>p</span></a></li>
-      <li class="current"><a href="globals_s.html#index_s"><span>s</span></a></li>
-      <li><a href="globals_t.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 <div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
 
-<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>SCNd64
+: <a class="el" href="json__inttypes_8h.html#ae7044b3fb4cc5cde22155d59437c348f">json_inttypes.h</a>
+</li>
 <li>sprintbuf()
 : <a class="el" href="printbuf_8h.html#adf6214db6c8ce994c7f7f1180863c8a4">printbuf.h</a>
 </li>
+<li>strerror
+: <a class="el" href="strerror__override_8h.html#a9dae36435b1668856ec610d6d5238754">strerror_override.h</a>
+</li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 14:09:59 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index d3dce86..91a3f4b 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li class="current"><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow4" class="tabs3">
-    <ul class="tablist">
-      <li><a href="globals.html#index__"><span>_</span></a></li>
-      <li><a href="globals_a.html#index_a"><span>a</span></a></li>
-      <li><a href="globals_e.html#index_e"><span>e</span></a></li>
-      <li><a href="globals_f.html#index_f"><span>f</span></a></li>
-      <li><a href="globals_h.html#index_h"><span>h</span></a></li>
-      <li><a href="globals_i.html#index_i"><span>i</span></a></li>
-      <li><a href="globals_j.html#index_j"><span>j</span></a></li>
-      <li><a href="globals_l.html#index_l"><span>l</span></a></li>
-      <li><a href="globals_m.html#index_m"><span>m</span></a></li>
-      <li><a href="globals_p.html#index_p"><span>p</span></a></li>
-      <li><a href="globals_s.html#index_s"><span>s</span></a></li>
-      <li class="current"><a href="globals_t.html#index_t"><span>t</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 <div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
 
-<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<h3><a id="index_t"></a>- t -</h3><ul>
 <li>THIS_FUNCTION_IS_DEPRECATED
 : <a class="el" href="json__object_8h.html#a84fa70b86686ce202058f63905c90078">json_object.h</a>
-, <a class="el" href="linkhash_8h.html#a849aa0ce9fe550c16ce81a215b1765ad">linkhash.h</a>
 </li>
 <li>TRUE
 : <a class="el" href="json__object_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d">json_object.h</a>
@@ -84,9 +51,9 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 17:13:27 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 805edce..f397d52 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li class="current"><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 &#160;<ul>
 <li>array_list
-: <a class="el" href="json__object_8h.html#a6d6d32d8b026ea2025df519b9e90f44a">json_object.h</a>
+: <a class="el" href="arraylist_8h.html#a6d6d32d8b026ea2025df519b9e90f44a">arraylist.h</a>
 </li>
 <li>array_list_free_fn
-: <a class="el" href="arraylist_8h.html#a41e5f51b1befa448b861e61a2c352bd6">arraylist.h</a>
+: <a class="el" href="arraylist_8h.html#a90d2ce204a483fa38f5514bad67222aa">arraylist.h</a>
 </li>
 <li>json_bool
 : <a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_object.h</a>
 </li>
+<li>json_c_shallow_copy_fn
+: <a class="el" href="json__object_8h.html#acfbe0648eb909870e346df0bb42e81e1">json_object.h</a>
+</li>
+<li>json_c_visit_userfunc
+: <a class="el" href="json__visit_8h.html#a9e5b550cfae3f9cecd7a95b2cae336e0">json_visit.h</a>
+</li>
 <li>json_object
 : <a class="el" href="json__object_8h.html#af27907ced0f5a43409ad96430fe0f914">json_object.h</a>
 </li>
 <li>json_object_delete_fn
-: <a class="el" href="json__object_8h.html#a3032a61c0ba2d38563b1b765f54ea46f">json_object.h</a>
+: <a class="el" href="json__object_8h.html#a57e58c272b899b7034c3b5137935117f">json_object.h</a>
 </li>
 <li>json_object_iter
 : <a class="el" href="json__object_8h.html#af88126730e765f2068968f4b16fd074f">json_object.h</a>
 </li>
 <li>json_object_private_delete_fn
-: <a class="el" href="json__object__private_8h.html#aa7d02026483e5ff3af5d6181d4efd032">json_object_private.h</a>
+: <a class="el" href="json__object__private_8h.html#a725ac370dfd6c705c02d8d85b78f1050">json_object_private.h</a>
 </li>
 <li>json_object_to_json_string_fn
-: <a class="el" href="json__object_8h.html#a7806d0a6826ac08f6f8b09636207870e">json_object.h</a>
+: <a class="el" href="json__object_8h.html#ad689953451ffa828830d349f4cd72563">json_object.h</a>
 </li>
 <li>json_tokener
-: <a class="el" href="json__object_8h.html#a4dd5e5b65aee7f376f529f86b210ff49">json_object.h</a>
+: <a class="el" href="json__tokener_8h.html#a4dd5e5b65aee7f376f529f86b210ff49">json_tokener.h</a>
 </li>
 <li>json_type
 : <a class="el" href="json__object_8h.html#aba5eff84f8638d22f50403175f270c96">json_object.h</a>
 </li>
 <li>lh_entry_free_fn
-: <a class="el" href="linkhash_8h.html#a0c6811f660b93857aafdbfdf80d9696b">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#a481b0bb1ab1d6a83713d9c27aa9f07d2">linkhash.h</a>
 </li>
 <li>lh_equal_fn
-: <a class="el" href="linkhash_8h.html#abcbf0e4849fb0c6279827ac3b66d15c3">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#af74a0690267598a0ed6f0a9b66674573">linkhash.h</a>
 </li>
 <li>lh_hash_fn
-: <a class="el" href="linkhash_8h.html#a1780449146b716ad5e6ed0a0207d0417">linkhash.h</a>
+: <a class="el" href="linkhash_8h.html#a91d16eb45069d235a198d2184a77d0ae">linkhash.h</a>
 </li>
 <li>lh_table
-: <a class="el" href="json__object_8h.html#a766e90057496fc6712d6be0da180a21f">json_object.h</a>
+: <a class="el" href="linkhash_8h.html#a766e90057496fc6712d6be0da180a21f">linkhash.h</a>
 </li>
 <li>printbuf
-: <a class="el" href="json__object_8h.html#ace274df280df67463ff417b1b3392395">json_object.h</a>
+: <a class="el" href="printbuf_8h.html#ace274df280df67463ff417b1b3392395">printbuf.h</a>
 </li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 13:33:43 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 6f1d69b..0d11c98 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Globals</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow3" class="tabs2">
-    <ul class="tablist">
-      <li><a href="globals.html"><span>All</span></a></li>
-      <li><a href="globals_func.html"><span>Functions</span></a></li>
-      <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
-      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
-      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
-      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
-      <li><a href="globals_defs.html"><span>Macros</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="contents">
 &#160;<ul>
+<li>_json_c_strerror_enable
+: <a class="el" href="strerror__override__private_8h.html#ac00e7d4121efe4b2e6ad8961e35e88ba">strerror_override_private.h</a>
+</li>
+<li>json_c_shallow_copy_default
+: <a class="el" href="json__object_8h.html#ad79dbd850536be7f59714b52bbd7ec30">json_object.h</a>
+</li>
 <li>json_hex_chars
-: <a class="el" href="json__object_8h.html#a20dbe4913551cefa6b4b0a77fd4397c4">json_object.h</a>
+: <a class="el" href="json__object__private_8h.html#a20dbe4913551cefa6b4b0a77fd4397c4">json_object_private.h</a>
 </li>
 <li>json_number_chars
-: <a class="el" href="json__object_8h.html#a27427f89f2fc995639e366635fbe58ac">json_object.h</a>
+: <a class="el" href="json__object__private_8h.html#a27427f89f2fc995639e366635fbe58ac">json_object_private.h</a>
 </li>
 <li>json_object_free_userdata
 : <a class="el" href="json__object_8h.html#adda8476609cc566ee62b80eaed310283">json_object.h</a>
@@ -71,9 +61,9 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 12:53:11 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 34ff51c..a88863f 100644 (file)
@@ -3,8 +3,9 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
-<title>json-c: Main Page</title>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>json-c: `json-c`</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li class="current"><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
-<div class="title">json-c Documentation</div>  </div>
+<div class="title">`json-c` </div>  </div>
 </div><!--header-->
 <div class="contents">
-</div><!-- contents -->
+<div class="textblock"><ol type="1">
+<li><a href="#overview">Overview and Build Status</a></li>
+<li><a href="#buildunix">Building on Unix</a></li>
+<li><a href="#installprereq">Install Prerequisites</a></li>
+<li><a href="#buildthreaded">Building with partial threading support</a></li>
+<li><a href="#linking">Linking to libjson-c</a></li>
+<li><a href="#using">Using json-c</a></li>
+</ol>
+<h2>JSON-C - A JSON implementation in C <a class="anchor" id="overview"></a> </h2>
+<p>Build Status</p><ul>
+<li><a href="https://ci.appveyor.com/project/hawicz/json-c">AppVeyor Build</a> <div class="image">
+<img src="https://ci.appveyor.com/api/projects/status/github/json-c/json-c?branch=master&svg=true" alt="AppVeyor Build Status"/>
+</div>
+</li>
+<li><a href="https://travis-ci.org/json-c/json-c">Travis Build</a> <div class="image">
+<img src="https://travis-ci.org/json-c/json-c.svg?branch=master" alt="Travis Build Status"/>
+</div>
+</li>
+</ul>
+<p>JSON-C implements a reference counting object model that allows you to easily construct JSON objects in C, output them as JSON formatted strings and parse JSON formatted strings back into the C representation of JSON objects. It aims to conform to <a href="https://tools.ietf.org/html/rfc7159">RFC 7159</a>.</p>
+<h2>Building on Unix with <code>git</code>, <code>gcc</code> and <code>autotools</code> <a class="anchor" id="buildunix"></a> </h2>
+<p>Home page for json-c: <a href="https://github.com/json-c/json-c/wiki">https://github.com/json-c/json-c/wiki</a></p>
+<h3>Prerequisites:</h3>
+<p>See also the "Installing prerequisites" section below.</p>
+<ul>
+<li><code>gcc</code>, <code>clang</code>, or another C compiler</li>
+<li><code>libtool&gt;=2.2.6b</code></li>
+</ul>
+<p>If you're not using a release tarball, you'll also need:</p>
+<ul>
+<li><code>autoconf&gt;=2.64</code> (<code>autoreconf</code>)</li>
+<li><code>automake&gt;=1.13</code></li>
+</ul>
+<p>Make sure you have a complete <code>libtool</code> install, including <code>libtoolize</code>.</p>
+<p>To generate docs (e.g. as part of make distcheck) you'll also need:</p><ul>
+<li><code>doxygen&gt;=1.8.13</code></li>
+</ul>
+<h3>Build instructions:</h3>
+<p><code>json-c</code> GitHub repo: <a href="https://github.com/json-c/json-c">https://github.com/json-c/json-c</a></p>
+<div class="fragment"><div class="line">$ git clone https://github.com/json-c/json-c.git</div><div class="line">$ cd json-c</div><div class="line">$ sh autogen.sh</div></div><!-- fragment --><p>followed by</p>
+<div class="fragment"><div class="line">$ ./configure  # --enable-threading</div><div class="line">$ make</div><div class="line">$ make install</div></div><!-- fragment --><p>To build and run the test programs:</p>
+<div class="fragment"><div class="line">$ make check</div><div class="line">$ make USE_VALGRIND=0 check   # optionally skip using valgrind</div></div><!-- fragment --><h2>Install prerequisites <a class="anchor" id="installprereq"></a> </h2>
+<p>If you are on a relatively modern system, you'll likely be able to install the prerequisites using your OS's packaging system.</p>
+<p>### Install using apt (e.g. Ubuntu 16.04.2 LTS) </p><div class="fragment"><div class="line">sudo apt install git</div><div class="line">sudo apt install autoconf automake libtool</div><div class="line">sudo apt install valgrind # optional</div></div><!-- fragment --><p>Then start from the "git clone" command, above.</p>
+<h3>Manually install and build autoconf, automake and libtool</h3>
+<p>For older OS's that don't have up-to-date version of the packages will require a bit more work. For example, CentOS release 5.11, etc...</p>
+<div class="fragment"><div class="line">curl -O http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz</div><div class="line">curl -O http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz</div><div class="line">curl -O http://ftp.gnu.org/gnu/libtool/libtool-2.2.6b.tar.gz</div><div class="line"></div><div class="line">tar xzf autoconf-2.69.tar.gz</div><div class="line">tar xzf automake-1.15.tar.gz</div><div class="line">tar xzf libtool-2.2.6b.tar.gz</div><div class="line"></div><div class="line">export PATH=${HOME}/ac_install/bin:$PATH</div><div class="line"></div><div class="line">(cd autoconf-2.69 &amp;&amp; \</div><div class="line">  ./configure --prefix ${HOME}/ac_install &amp;&amp; \</div><div class="line">  make &amp;&amp; \</div><div class="line">  make install)</div><div class="line"></div><div class="line">(cd automake-1.15 &amp;&amp; \</div><div class="line">  ./configure --prefix ${HOME}/ac_install &amp;&amp; \</div><div class="line">  make &amp;&amp; \</div><div class="line">  make install)</div><div class="line"></div><div class="line">(cd libtool-2.2.6b &amp;&amp; \</div><div class="line">  ./configure --prefix ${HOME}/ac_install &amp;&amp; \</div><div class="line">  make &amp;&amp; \</div><div class="line">  make install)</div></div><!-- fragment --><h2>Building with partial threading support <a class="anchor" id="buildthreaded"></a> </h2>
+<p>Although json-c does not support fully multi-threaded access to object trees, it has some code to help make use in threaded programs a bit safer. Currently, this is limited to using atomic operations for <a class="el" href="json__object_8h.html#a675aa3a9cced685dbfd1c1a770a0c3e4">json_object_get()</a> and <a class="el" href="json__object_8h.html#afabf61f932cd64a4122ca8092452eed5">json_object_put()</a>.</p>
+<p>Since this may have a performance impact, of at least 3x slower according to <a href="https://stackoverflow.com/a/11609063,">https://stackoverflow.com/a/11609063,</a> it is disabled by default. You may turn it on by adjusting your configure command with: &ndash;enable-threading</p>
+<p>Separately, the default hash function used for object field keys, lh_char_hash, uses a compare-and-swap operation to ensure the randomly seed is only generated once. Because this is a one-time operation, it is always compiled in when the compare-and-swap operation is available.</p>
+<h2>Linking to <code>libjson-c</code> <a class="anchor" id="linking"></a> </h2>
+<p>If your system has <code>pkgconfig</code>, then you can just add this to your <code>makefile</code>:</p>
+<div class="fragment"><div class="line">CFLAGS += $(shell pkg-config --cflags json-c)</div><div class="line">LDFLAGS += $(shell pkg-config --libs json-c)</div></div><!-- fragment --><p>Without <code>pkgconfig</code>, you would do something like this:</p>
+<div class="fragment"><div class="line">JSON_C_DIR=/path/to/json_c/install</div><div class="line">CFLAGS += -I$(JSON_C_DIR)/include/json-c</div><div class="line">LDFLAGS+= -L$(JSON_C_DIR)/lib -ljson-c</div></div><!-- fragment --><h2>Using json-c <a class="anchor" id="using"></a> </h2>
+<p>To use json-c you can either include <a class="el" href="json_8h.html" title="A convenience header that may be included instead of other individual ones. ">json.h</a>, or preferrably, one of the following more specific header files:</p>
+<ul>
+<li><a class="el" href="json__object_8h.html" title="Core json-c API. Start here, or with json_tokener.h. ">json_object.h</a> - Core types and methods.</li>
+<li><a class="el" href="json__tokener_8h.html" title="Methods to parse an input string into a tree of json_object objects. ">json_tokener.h</a> - Methods for parsing and serializing json-c object trees.</li>
+<li><a class="el" href="json__pointer_8h.html" title="JSON Pointer (RFC 6901) implementation for retrieving objects from a json-c object tree...">json_pointer.h</a> - JSON Pointer (RFC 6901) implementation for retrieving objects from a json-c object tree.</li>
+<li><a class="el" href="json__object__iterator_8h.html" title="An API for iterating over json_type_object objects, styled to be familiar to C++ programmers. Unlike json_object_object_foreach() and json_object_object_foreachC(), this avoids the need to expose json-c internals like lh_entry. ">json_object_iterator.h</a> - Methods for iterating over single <a class="el" href="structjson__object.html">json_object</a> instances.</li>
+<li><a class="el" href="json__visit_8h.html" title="Methods for walking a tree of objects. ">json_visit.h</a> - Methods for walking a tree of json-c objects.</li>
+<li><a class="el" href="json__util_8h.html" title="Miscllaneous utility functions and macros. ">json_util.h</a> - Miscelleanous utility functions.</li>
+</ul>
+<p>For a full list of headers see <a href="files.html">files.html</a> </p>
+</div></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 05:31:34 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
diff --git a/doc/html/issues__closed__for__0_813_8md.html b/doc/html/issues__closed__for__0_813_8md.html
new file mode 100644 (file)
index 0000000..a842b30
--- /dev/null
@@ -0,0 +1,53 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>json-c: issues_closed_for_0.13.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">json-c
+   &#160;<span id="projectnumber">0.13</span>
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">issues_closed_for_0.13.md File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
index 1f4d0b4..f5343ed 100644 (file)
  Released under MIT license.
  https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt
 */
-(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{a(jQuery)}}(function(k){var A=k(document),s=k(window),w=k("body");var n="displayController",e="hasActiveHover",d="forcedOpen",u="hasMouseMove",f="mouseOnToPopup",g="originalTitle",y="powertip",o="powertipjq",l="powertiptarget",E=180/Math.PI;var c={isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var p={none:0,top:1,bottom:2,left:4,right:8};k.fn.powerTip=function(F,N){if(!this.length){return this}if(k.type(F)==="string"&&k.powerTip[F]){return k.powerTip[F].call(this,this,N)}var O=k.extend({},k.fn.powerTip.defaults,F),G=new x(O);h();this.each(function M(){var R=k(this),Q=R.data(y),P=R.data(o),T=R.data(l),S;if(R.data(n)){k.powerTip.destroy(R)}S=R.attr("title");if(!Q&&!T&&!P&&S){R.data(y,S);R.data(g,S);R.removeAttr("title")}R.data(n,new t(R,O,G))});if(!O.manual){this.on({"mouseenter.powertip":function J(P){k.powerTip.show(this,P)},"mouseleave.powertip":function L(){k.powerTip.hide(this)},"focus.powertip":function K(){k.powerTip.show(this)},"blur.powertip":function H(){k.powerTip.hide(this,true)},"keydown.powertip":function I(P){if(P.keyCode===27){k.powerTip.hide(this,true)}}})}return this};k.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false};k.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};k.powerTip={show:function z(F,G){if(G){i(G);c.previousX=G.pageX;c.previousY=G.pageY;k(F).data(n).show()}else{k(F).first().data(n).show(true,true)}return F},reposition:function r(F){k(F).first().data(n).resetPosition();return F},hide:function D(G,F){if(G){k(G).first().data(n).hide(F)}else{if(c.activeHover){c.activeHover.data(n).hide(true)}}return G},destroy:function C(G){k(G).off(".powertip").each(function F(){var I=k(this),H=[g,n,e,d];if(I.data(g)){I.attr("title",I.data(g));H.push(y)}I.removeData(H)});return G}};k.powerTip.showTip=k.powerTip.show;k.powerTip.closeTip=k.powerTip.hide;function b(){var F=this;F.top="auto";F.left="auto";F.right="auto";F.bottom="auto";F.set=function(H,G){if(k.isNumeric(G)){F[H]=Math.round(G)}}}function t(K,N,F){var J=null;function L(P,Q){M();if(!K.data(e)){if(!P){c.tipOpenImminent=true;J=setTimeout(function O(){J=null;I()},N.intentPollInterval)}else{if(Q){K.data(d,true)}F.showTip(K)}}}function G(P){M();c.tipOpenImminent=false;if(K.data(e)){K.data(d,false);if(!P){c.delayInProgress=true;J=setTimeout(function O(){J=null;F.hideTip(K);c.delayInProgress=false},N.closeDelay)}else{F.hideTip(K)}}}function I(){var Q=Math.abs(c.previousX-c.currentX),O=Math.abs(c.previousY-c.currentY),P=Q+O;if(P<N.intentSensitivity){F.showTip(K)}else{c.previousX=c.currentX;c.previousY=c.currentY;L()}}function M(){J=clearTimeout(J);c.delayInProgress=false}function H(){F.resetPosition(K)}this.show=L;this.hide=G;this.cancel=M;this.resetPosition=H}function j(){function G(M,L,J,O,P){var K=L.split("-")[0],N=new b(),I;if(q(M)){I=H(M,K)}else{I=F(M,K)}switch(L){case"n":N.set("left",I.left-(J/2));N.set("bottom",c.windowHeight-I.top+P);break;case"e":N.set("left",I.left+P);N.set("top",I.top-(O/2));break;case"s":N.set("left",I.left-(J/2));N.set("top",I.top+P);break;case"w":N.set("top",I.top-(O/2));N.set("right",c.windowWidth-I.left+P);break;case"nw":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"nw-alt":N.set("left",I.left);N.set("bottom",c.windowHeight-I.top+P);break;case"ne":N.set("left",I.left-20);N.set("bottom",c.windowHeight-I.top+P);break;case"ne-alt":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left);break;case"sw":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"sw-alt":N.set("left",I.left);N.set("top",I.top+P);break;case"se":N.set("left",I.left-20);N.set("top",I.top+P);break;case"se-alt":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left);break}return N}function F(K,J){var O=K.offset(),N=K.outerWidth(),I=K.outerHeight(),M,L;switch(J){case"n":M=O.left+N/2;L=O.top;break;case"e":M=O.left+N;L=O.top+I/2;break;case"s":M=O.left+N/2;L=O.top+I;break;case"w":M=O.left;L=O.top+I/2;break;case"nw":M=O.left;L=O.top;break;case"ne":M=O.left+N;L=O.top;break;case"sw":M=O.left;L=O.top+I;break;case"se":M=O.left+N;L=O.top+I;break}return{top:L,left:M}}function H(O,K){var S=O.closest("svg")[0],N=O[0],W=S.createSVGPoint(),L=N.getBBox(),V=N.getScreenCTM(),M=L.width/2,Q=L.height/2,P=[],I=["nw","n","ne","e","se","s","sw","w"],U,X,R,T;function J(){P.push(W.matrixTransform(V))}W.x=L.x;W.y=L.y;J();W.x+=M;J();W.x+=M;J();W.y+=Q;J();W.y+=Q;J();W.x-=M;J();W.x-=M;J();W.y-=Q;J();if(P[0].y!==P[1].y||P[0].x!==P[7].x){X=Math.atan2(V.b,V.a)*E;R=Math.ceil(((X%360)-22.5)/45);if(R<1){R+=8}while(R--){I.push(I.shift())}}for(T=0;T<P.length;T++){if(I[T]===K){U=P[T];break}}return{top:U.y+c.scrollTop,left:U.x+c.scrollLeft}}this.compute=G}function x(Q){var P=new j(),O=k("#"+Q.popupId);if(O.length===0){O=k("<div/>",{id:Q.popupId});if(w.length===0){w=k("body")}w.append(O)}if(Q.followMouse){if(!O.data(u)){A.on("mousemove",M);s.on("scroll",M);O.data(u,true)}}if(Q.mouseOnToPopup){O.on({mouseenter:function L(){if(O.data(f)){if(c.activeHover){c.activeHover.data(n).cancel()}}},mouseleave:function N(){if(c.activeHover){c.activeHover.data(n).hide()}}})}function I(S){S.data(e,true);O.queue(function R(T){H(S);T()})}function H(S){var U;if(!S.data(e)){return}if(c.isTipOpen){if(!c.isClosing){K(c.activeHover)}O.delay(100).queue(function R(V){H(S);V()});return}S.trigger("powerTipPreRender");U=B(S);if(U){O.empty().append(U)}else{return}S.trigger("powerTipRender");c.activeHover=S;c.isTipOpen=true;O.data(f,Q.mouseOnToPopup);if(!Q.followMouse){G(S);c.isFixedTipOpen=true}else{M()}O.fadeIn(Q.fadeInTime,function T(){if(!c.desyncTimeout){c.desyncTimeout=setInterval(J,500)}S.trigger("powerTipOpen")})}function K(R){c.isClosing=true;c.activeHover=null;c.isTipOpen=false;c.desyncTimeout=clearInterval(c.desyncTimeout);R.data(e,false);R.data(d,false);O.fadeOut(Q.fadeOutTime,function S(){var T=new b();c.isClosing=false;c.isFixedTipOpen=false;O.removeClass();T.set("top",c.currentY+Q.offset);T.set("left",c.currentX+Q.offset);O.css(T);R.trigger("powerTipClose")})}function M(){if(!c.isFixedTipOpen&&(c.isTipOpen||(c.tipOpenImminent&&O.data(u)))){var R=O.outerWidth(),V=O.outerHeight(),U=new b(),S,T;U.set("top",c.currentY+Q.offset);U.set("left",c.currentX+Q.offset);S=m(U,R,V);if(S!==p.none){T=a(S);if(T===1){if(S===p.right){U.set("left",c.windowWidth-R)}else{if(S===p.bottom){U.set("top",c.scrollTop+c.windowHeight-V)}}}else{U.set("left",c.currentX-R-Q.offset);U.set("top",c.currentY-V-Q.offset)}}O.css(U)}}function G(S){var R,T;if(Q.smartPlacement){R=k.fn.powerTip.smartPlacementLists[Q.placement];k.each(R,function(U,W){var V=m(F(S,W),O.outerWidth(),O.outerHeight());T=W;if(V===p.none){return false}})}else{F(S,Q.placement);T=Q.placement}O.addClass(T)}function F(U,T){var R=0,S,W,V=new b();V.set("top",0);V.set("left",0);O.css(V);do{S=O.outerWidth();W=O.outerHeight();V=P.compute(U,T,S,W,Q.offset);O.css(V)}while(++R<=5&&(S!==O.outerWidth()||W!==O.outerHeight()));return V}function J(){var R=false;if(c.isTipOpen&&!c.isClosing&&!c.delayInProgress){if(c.activeHover.data(e)===false||c.activeHover.is(":disabled")){R=true}else{if(!v(c.activeHover)&&!c.activeHover.is(":focus")&&!c.activeHover.data(d)){if(O.data(f)){if(!v(O)){R=true}}else{R=true}}}if(R){K(c.activeHover)}}}this.showTip=I;this.hideTip=K;this.resetPosition=G}function q(F){return window.SVGElement&&F[0] instanceof SVGElement}function h(){if(!c.mouseTrackingActive){c.mouseTrackingActive=true;k(function H(){c.scrollLeft=s.scrollLeft();c.scrollTop=s.scrollTop();c.windowWidth=s.width();c.windowHeight=s.height()});A.on("mousemove",i);s.on({resize:function G(){c.windowWidth=s.width();c.windowHeight=s.height()},scroll:function F(){var I=s.scrollLeft(),J=s.scrollTop();if(I!==c.scrollLeft){c.currentX+=I-c.scrollLeft;c.scrollLeft=I}if(J!==c.scrollTop){c.currentY+=J-c.scrollTop;c.scrollTop=J}}})}}function i(F){c.currentX=F.pageX;c.currentY=F.pageY}function v(F){var H=F.offset(),J=F[0].getBoundingClientRect(),I=J.right-J.left,G=J.bottom-J.top;return c.currentX>=H.left&&c.currentX<=H.left+I&&c.currentY>=H.top&&c.currentY<=H.top+G}function B(I){var G=I.data(y),F=I.data(o),K=I.data(l),H,J;if(G){if(k.isFunction(G)){G=G.call(I[0])}J=G}else{if(F){if(k.isFunction(F)){F=F.call(I[0])}if(F.length>0){J=F.clone(true,true)}}else{if(K){H=k("#"+K);if(H.length>0){J=H.html()}}}}return J}function m(M,L,K){var G=c.scrollTop,J=c.scrollLeft,I=G+c.windowHeight,F=J+c.windowWidth,H=p.none;if(M.top<G||Math.abs(M.bottom-c.windowHeight)-K<G){H|=p.top}if(M.top+K>I||Math.abs(M.bottom-c.windowHeight)>I){H|=p.bottom}if(M.left<J||M.right+L>F){H|=p.left}if(M.left+L>F||M.right<J){H|=p.right}return H}function a(G){var F=0;while(G){G&=G-1;F++}return F}}));
\ No newline at end of file
+(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{a(jQuery)}}(function(k){var A=k(document),s=k(window),w=k("body");var n="displayController",e="hasActiveHover",d="forcedOpen",u="hasMouseMove",f="mouseOnToPopup",g="originalTitle",y="powertip",o="powertipjq",l="powertiptarget",E=180/Math.PI;var c={isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var p={none:0,top:1,bottom:2,left:4,right:8};k.fn.powerTip=function(F,N){if(!this.length){return this}if(k.type(F)==="string"&&k.powerTip[F]){return k.powerTip[F].call(this,this,N)}var O=k.extend({},k.fn.powerTip.defaults,F),G=new x(O);h();this.each(function M(){var R=k(this),Q=R.data(y),P=R.data(o),T=R.data(l),S;if(R.data(n)){k.powerTip.destroy(R)}S=R.attr("title");if(!Q&&!T&&!P&&S){R.data(y,S);R.data(g,S);R.removeAttr("title")}R.data(n,new t(R,O,G))});if(!O.manual){this.on({"mouseenter.powertip":function J(P){k.powerTip.show(this,P)},"mouseleave.powertip":function L(){k.powerTip.hide(this)},"focus.powertip":function K(){k.powerTip.show(this)},"blur.powertip":function H(){k.powerTip.hide(this,true)},"keydown.powertip":function I(P){if(P.keyCode===27){k.powerTip.hide(this,true)}}})}return this};k.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false};k.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};k.powerTip={show:function z(F,G){if(G){i(G);c.previousX=G.pageX;c.previousY=G.pageY;k(F).data(n).show()}else{k(F).first().data(n).show(true,true)}return F},reposition:function r(F){k(F).first().data(n).resetPosition();return F},hide:function D(G,F){if(G){k(G).first().data(n).hide(F)}else{if(c.activeHover){c.activeHover.data(n).hide(true)}}return G},destroy:function C(G){k(G).off(".powertip").each(function F(){var I=k(this),H=[g,n,e,d];if(I.data(g)){I.attr("title",I.data(g));H.push(y)}I.removeData(H)});return G}};k.powerTip.showTip=k.powerTip.show;k.powerTip.closeTip=k.powerTip.hide;function b(){var F=this;F.top="auto";F.left="auto";F.right="auto";F.bottom="auto";F.set=function(H,G){if(k.isNumeric(G)){F[H]=Math.round(G)}}}function t(K,N,F){var J=null;function L(P,Q){M();if(!K.data(e)){if(!P){c.tipOpenImminent=true;J=setTimeout(function O(){J=null;I()},N.intentPollInterval)}else{if(Q){K.data(d,true)}F.showTip(K)}}}function G(P){M();c.tipOpenImminent=false;if(K.data(e)){K.data(d,false);if(!P){c.delayInProgress=true;J=setTimeout(function O(){J=null;F.hideTip(K);c.delayInProgress=false},N.closeDelay)}else{F.hideTip(K)}}}function I(){var Q=Math.abs(c.previousX-c.currentX),O=Math.abs(c.previousY-c.currentY),P=Q+O;if(P<N.intentSensitivity){F.showTip(K)}else{c.previousX=c.currentX;c.previousY=c.currentY;L()}}function M(){J=clearTimeout(J);c.delayInProgress=false}function H(){F.resetPosition(K)}this.show=L;this.hide=G;this.cancel=M;this.resetPosition=H}function j(){function G(M,L,J,O,P){var K=L.split("-")[0],N=new b(),I;if(q(M)){I=H(M,K)}else{I=F(M,K)}switch(L){case"n":N.set("left",I.left-(J/2));N.set("bottom",c.windowHeight-I.top+P);break;case"e":N.set("left",I.left+P);N.set("top",I.top-(O/2));break;case"s":N.set("left",I.left-(J/2));N.set("top",I.top+P);break;case"w":N.set("top",I.top-(O/2));N.set("right",c.windowWidth-I.left+P);break;case"nw":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"nw-alt":N.set("left",I.left);N.set("bottom",c.windowHeight-I.top+P);break;case"ne":N.set("left",I.left-20);N.set("bottom",c.windowHeight-I.top+P);break;case"ne-alt":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left);break;case"sw":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"sw-alt":N.set("left",I.left);N.set("top",I.top+P);break;case"se":N.set("left",I.left-20);N.set("top",I.top+P);break;case"se-alt":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left);break}return N}function F(K,J){var O=K.offset(),N=K.outerWidth(),I=K.outerHeight(),M,L;switch(J){case"n":M=O.left+N/2;L=O.top;break;case"e":M=O.left+N;L=O.top+I/2;break;case"s":M=O.left+N/2;L=O.top+I;break;case"w":M=O.left;L=O.top+I/2;break;case"nw":M=O.left;L=O.top;break;case"ne":M=O.left+N;L=O.top;break;case"sw":M=O.left;L=O.top+I;break;case"se":M=O.left+N;L=O.top+I;break}return{top:L,left:M}}function H(O,K){var S=O.closest("svg")[0],N=O[0],W=S.createSVGPoint(),L=N.getBBox(),V=N.getScreenCTM(),M=L.width/2,Q=L.height/2,P=[],I=["nw","n","ne","e","se","s","sw","w"],U,X,R,T;function J(){P.push(W.matrixTransform(V))}W.x=L.x;W.y=L.y;J();W.x+=M;J();W.x+=M;J();W.y+=Q;J();W.y+=Q;J();W.x-=M;J();W.x-=M;J();W.y-=Q;J();if(P[0].y!==P[1].y||P[0].x!==P[7].x){X=Math.atan2(V.b,V.a)*E;R=Math.ceil(((X%360)-22.5)/45);if(R<1){R+=8}while(R--){I.push(I.shift())}}for(T=0;T<P.length;T++){if(I[T]===K){U=P[T];break}}return{top:U.y+c.scrollTop,left:U.x+c.scrollLeft}}this.compute=G}function x(Q){var P=new j(),O=k("#"+Q.popupId);if(O.length===0){O=k("<div/>",{id:Q.popupId});if(w.length===0){w=k("body")}w.append(O)}if(Q.followMouse){if(!O.data(u)){A.on("mousemove",M);s.on("scroll",M);O.data(u,true)}}if(Q.mouseOnToPopup){O.on({mouseenter:function L(){if(O.data(f)){if(c.activeHover){c.activeHover.data(n).cancel()}}},mouseleave:function N(){if(c.activeHover){c.activeHover.data(n).hide()}}})}function I(S){S.data(e,true);O.queue(function R(T){H(S);T()})}function H(S){var U;if(!S.data(e)){return}if(c.isTipOpen){if(!c.isClosing){K(c.activeHover)}O.delay(100).queue(function R(V){H(S);V()});return}S.trigger("powerTipPreRender");U=B(S);if(U){O.empty().append(U)}else{return}S.trigger("powerTipRender");c.activeHover=S;c.isTipOpen=true;O.data(f,Q.mouseOnToPopup);if(!Q.followMouse){G(S);c.isFixedTipOpen=true}else{M()}O.fadeIn(Q.fadeInTime,function T(){if(!c.desyncTimeout){c.desyncTimeout=setInterval(J,500)}S.trigger("powerTipOpen")})}function K(R){c.isClosing=true;c.activeHover=null;c.isTipOpen=false;c.desyncTimeout=clearInterval(c.desyncTimeout);R.data(e,false);R.data(d,false);O.fadeOut(Q.fadeOutTime,function S(){var T=new b();c.isClosing=false;c.isFixedTipOpen=false;O.removeClass();T.set("top",c.currentY+Q.offset);T.set("left",c.currentX+Q.offset);O.css(T);R.trigger("powerTipClose")})}function M(){if(!c.isFixedTipOpen&&(c.isTipOpen||(c.tipOpenImminent&&O.data(u)))){var R=O.outerWidth(),V=O.outerHeight(),U=new b(),S,T;U.set("top",c.currentY+Q.offset);U.set("left",c.currentX+Q.offset);S=m(U,R,V);if(S!==p.none){T=a(S);if(T===1){if(S===p.right){U.set("left",c.windowWidth-R)}else{if(S===p.bottom){U.set("top",c.scrollTop+c.windowHeight-V)}}}else{U.set("left",c.currentX-R-Q.offset);U.set("top",c.currentY-V-Q.offset)}}O.css(U)}}function G(S){var R,T;if(Q.smartPlacement){R=k.fn.powerTip.smartPlacementLists[Q.placement];k.each(R,function(U,W){var V=m(F(S,W),O.outerWidth(),O.outerHeight());T=W;if(V===p.none){return false}})}else{F(S,Q.placement);T=Q.placement}O.addClass(T)}function F(U,T){var R=0,S,W,V=new b();V.set("top",0);V.set("left",0);O.css(V);do{S=O.outerWidth();W=O.outerHeight();V=P.compute(U,T,S,W,Q.offset);O.css(V)}while(++R<=5&&(S!==O.outerWidth()||W!==O.outerHeight()));return V}function J(){var R=false;if(c.isTipOpen&&!c.isClosing&&!c.delayInProgress){if(c.activeHover.data(e)===false||c.activeHover.is(":disabled")){R=true}else{if(!v(c.activeHover)&&!c.activeHover.is(":focus")&&!c.activeHover.data(d)){if(O.data(f)){if(!v(O)){R=true}}else{R=true}}}if(R){K(c.activeHover)}}}this.showTip=I;this.hideTip=K;this.resetPosition=G}function q(F){return window.SVGElement&&F[0] instanceof SVGElement}function h(){if(!c.mouseTrackingActive){c.mouseTrackingActive=true;k(function H(){c.scrollLeft=s.scrollLeft();c.scrollTop=s.scrollTop();c.windowWidth=s.width();c.windowHeight=s.height()});A.on("mousemove",i);s.on({resize:function G(){c.windowWidth=s.width();c.windowHeight=s.height()},scroll:function F(){var I=s.scrollLeft(),J=s.scrollTop();if(I!==c.scrollLeft){c.currentX+=I-c.scrollLeft;c.scrollLeft=I}if(J!==c.scrollTop){c.currentY+=J-c.scrollTop;c.scrollTop=J}}})}}function i(F){c.currentX=F.pageX;c.currentY=F.pageY}function v(F){var H=F.offset(),J=F[0].getBoundingClientRect(),I=J.right-J.left,G=J.bottom-J.top;return c.currentX>=H.left&&c.currentX<=H.left+I&&c.currentY>=H.top&&c.currentY<=H.top+G}function B(I){var G=I.data(y),F=I.data(o),K=I.data(l),H,J;if(G){if(k.isFunction(G)){G=G.call(I[0])}J=G}else{if(F){if(k.isFunction(F)){F=F.call(I[0])}if(F.length>0){J=F.clone(true,true)}}else{if(K){H=k("#"+K);if(H.length>0){J=H.html()}}}}return J}function m(M,L,K){var G=c.scrollTop,J=c.scrollLeft,I=G+c.windowHeight,F=J+c.windowWidth,H=p.none;if(M.top<G||Math.abs(M.bottom-c.windowHeight)-K<G){H|=p.top}if(M.top+K>I||Math.abs(M.bottom-c.windowHeight)>I){H|=p.bottom}if(M.left<J||M.right+L>F){H|=p.left}if(M.left+L>F||M.right<J){H|=p.right}return H}function a(G){var F=0;while(G){G&=G-1;F++}return F}}));/*!
+ * jQuery UI Touch Punch 0.2.3
+ *
+ * Copyright 2011–2014, Dave Furfero
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Depends:
+ *  jquery.ui.widget.js
+ *  jquery.ui.mouse.js
+ */
+(function(b){b.support.touch="ontouchend" in document;if(!b.support.touch){return}var d=b.ui.mouse.prototype,f=d._mouseInit,c=d._mouseDestroy,a;function e(h,i){if(h.originalEvent.touches.length>1){return}h.preventDefault();var j=h.originalEvent.changedTouches[0],g=document.createEvent("MouseEvents");g.initMouseEvent(i,true,true,window,1,j.screenX,j.screenY,j.clientX,j.clientY,false,false,false,false,0,null);h.target.dispatchEvent(g)}d._touchStart=function(h){var g=this;if(a||!g._mouseCapture(h.originalEvent.changedTouches[0])){return}a=true;g._touchMoved=false;e(h,"mouseover");e(h,"mousemove");e(h,"mousedown")};d._touchMove=function(g){if(!a){return}this._touchMoved=true;e(g,"mousemove")};d._touchEnd=function(g){if(!a){return}e(g,"mouseup");e(g,"mouseout");if(!this._touchMoved){e(g,"click")}a=false};d._mouseInit=function(){var g=this;g.element.bind({touchstart:b.proxy(g,"_touchStart"),touchmove:b.proxy(g,"_touchMove"),touchend:b.proxy(g,"_touchEnd")});f.call(g)};d._mouseDestroy=function(){var g=this;g.element.unbind({touchstart:b.proxy(g,"_touchStart"),touchmove:b.proxy(g,"_touchMove"),touchend:b.proxy(g,"_touchEnd")});c.call(g)}})(jQuery);/*!
+ * SmartMenus jQuery Plugin - v1.0.0 - January 27, 2016
+ * http://www.smartmenus.org/
+ *
+ * Copyright Vasil Dinkov, Vadikom Web Ltd.
+ * http://vadikom.com
+ *
+ * Licensed MIT
+ */
+(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{if(typeof module==="object"&&typeof module.exports==="object"){module.exports=a(require("jquery"))}else{a(jQuery)}}}(function(a){var b=[],e=!!window.createPopup,f=false,d="ontouchstart" in window,h=false,g=window.requestAnimationFrame||function(l){return setTimeout(l,1000/60)},c=window.cancelAnimationFrame||function(l){clearTimeout(l)};function k(m){var n=".smartmenus_mouse";if(!h&&!m){var o=true,l=null;a(document).bind(i([["mousemove",function(s){var t={x:s.pageX,y:s.pageY,timeStamp:new Date().getTime()};if(l){var q=Math.abs(l.x-t.x),p=Math.abs(l.y-t.y);if((q>0||p>0)&&q<=2&&p<=2&&t.timeStamp-l.timeStamp<=300){f=true;if(o){var r=a(s.target).closest("a");if(r.is("a")){a.each(b,function(){if(a.contains(this.$root[0],r[0])){this.itemEnter({currentTarget:r[0]});return false}})}o=false}}}l=t}],[d?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut",function(p){if(j(p.originalEvent)){f=false}}]],n));h=true}else{if(h&&m){a(document).unbind(n);h=false}}}function j(l){return !/^(4|mouse)$/.test(l.pointerType)}function i(l,n){if(!n){n=""}var m={};a.each(l,function(o,p){m[p[0].split(" ").join(n+" ")+n]=p[1]});return m}a.SmartMenus=function(m,l){this.$root=a(m);this.opts=l;this.rootId="";this.accessIdPrefix="";this.$subArrow=null;this.activatedItems=[];this.visibleSubMenus=[];this.showTimeout=0;this.hideTimeout=0;this.scrollTimeout=0;this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.idInc=0;this.$firstLink=null;this.$firstSub=null;this.disabled=false;this.$disableOverlay=null;this.$touchScrollingSub=null;this.cssTransforms3d="perspective" in m.style||"webkitPerspective" in m.style;this.wasCollapsible=false;this.init()};a.extend(a.SmartMenus,{hideAll:function(){a.each(b,function(){this.menuHideAll()})},destroy:function(){while(b.length){b[0].destroy()}k(true)},prototype:{init:function(n){var l=this;if(!n){b.push(this);this.rootId=(new Date().getTime()+Math.random()+"").replace(/\D/g,"");this.accessIdPrefix="sm-"+this.rootId+"-";if(this.$root.hasClass("sm-rtl")){this.opts.rightToLeftSubMenus=true}var r=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).bind(i([["mouseover focusin",a.proxy(this.rootOver,this)],["mouseout focusout",a.proxy(this.rootOut,this)],["keydown",a.proxy(this.rootKeyDown,this)]],r)).delegate("a",i([["mouseenter",a.proxy(this.itemEnter,this)],["mouseleave",a.proxy(this.itemLeave,this)],["mousedown",a.proxy(this.itemDown,this)],["focus",a.proxy(this.itemFocus,this)],["blur",a.proxy(this.itemBlur,this)],["click",a.proxy(this.itemClick,this)]],r));r+=this.rootId;if(this.opts.hideOnClick){a(document).bind(i([["touchstart",a.proxy(this.docTouchStart,this)],["touchmove",a.proxy(this.docTouchMove,this)],["touchend",a.proxy(this.docTouchEnd,this)],["click",a.proxy(this.docClick,this)]],r))}a(window).bind(i([["resize orientationchange",a.proxy(this.winResize,this)]],r));if(this.opts.subIndicators){this.$subArrow=a("<span/>").addClass("sub-arrow");if(this.opts.subIndicatorsText){this.$subArrow.html(this.opts.subIndicatorsText)}}k()}this.$firstSub=this.$root.find("ul").each(function(){l.menuInit(a(this))}).eq(0);this.$firstLink=this.$root.find("a").eq(0);if(this.opts.markCurrentItem){var p=/(index|default)\.[^#\?\/]*/i,m=/#.*/,q=window.location.href.replace(p,""),o=q.replace(m,"");this.$root.find("a").each(function(){var s=this.href.replace(p,""),t=a(this);if(s==q||s==o){t.addClass("current");if(l.opts.markCurrentTree){t.parentsUntil("[data-smartmenus-id]","ul").each(function(){a(this).dataSM("parent-a").addClass("current")})}}})}this.wasCollapsible=this.isCollapsible()},destroy:function(m){if(!m){var n=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").unbind(n).undelegate(n);n+=this.rootId;a(document).unbind(n);a(window).unbind(n);if(this.opts.subIndicators){this.$subArrow=null}}this.menuHideAll();var l=this;this.$root.find("ul").each(function(){var o=a(this);if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}if(o.dataSM("shown-before")){if(l.opts.subMenusMinWidth||l.opts.subMenusMaxWidth){o.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap")}if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}o.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})}if((o.attr("id")||"").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("ie-shim").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded");this.$root.find("a.has-submenu").each(function(){var o=a(this);if(o.attr("id").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub");if(this.opts.subIndicators){this.$root.find("span.sub-arrow").remove()}if(this.opts.markCurrentItem){this.$root.find("a.current").removeClass("current")}if(!m){this.$root=null;this.$firstLink=null;this.$firstSub=null;if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}b.splice(a.inArray(this,b),1)}},disable:function(l){if(!this.disabled){this.menuHideAll();if(!l&&!this.opts.isPopup&&this.$root.is(":visible")){var m=this.$root.offset();this.$disableOverlay=a('<div class="sm-jquery-disable-overlay"/>').css({position:"absolute",top:m.top,left:m.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(true),opacity:0}).appendTo(document.body)}this.disabled=true}},docClick:function(l){if(this.$touchScrollingSub){this.$touchScrollingSub=null;return}if(this.visibleSubMenus.length&&!a.contains(this.$root[0],l.target)||a(l.target).is("a")){this.menuHideAll()}},docTouchEnd:function(m){if(!this.lastTouch){return}if(this.visibleSubMenus.length&&(this.lastTouch.x2===undefined||this.lastTouch.x1==this.lastTouch.x2)&&(this.lastTouch.y2===undefined||this.lastTouch.y1==this.lastTouch.y2)&&(!this.lastTouch.target||!a.contains(this.$root[0],this.lastTouch.target))){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},350)}this.lastTouch=null},docTouchMove:function(m){if(!this.lastTouch){return}var l=m.originalEvent.touches[0];this.lastTouch.x2=l.pageX;this.lastTouch.y2=l.pageY},docTouchStart:function(m){var l=m.originalEvent.touches[0];this.lastTouch={x1:l.pageX,y1:l.pageY,target:l.target}},enable:function(){if(this.disabled){if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}this.disabled=false}},getClosestMenu:function(m){var l=a(m).closest("ul");while(l.dataSM("in-mega")){l=l.parent().closest("ul")}return l[0]||null},getHeight:function(l){return this.getOffset(l,true)},getOffset:function(n,l){var m;if(n.css("display")=="none"){m={position:n[0].style.position,visibility:n[0].style.visibility};n.css({position:"absolute",visibility:"hidden"}).show()}var o=n[0].getBoundingClientRect&&n[0].getBoundingClientRect(),p=o&&(l?o.height||o.bottom-o.top:o.width||o.right-o.left);if(!p&&p!==0){p=l?n[0].offsetHeight:n[0].offsetWidth}if(m){n.hide().css(m)}return p},getStartZIndex:function(l){var m=parseInt(this[l?"$root":"$firstSub"].css("z-index"));if(!l&&isNaN(m)){m=parseInt(this.$root.css("z-index"))}return !isNaN(m)?m:1},getTouchPoint:function(l){return l.touches&&l.touches[0]||l.changedTouches&&l.changedTouches[0]||l},getViewport:function(l){var m=l?"Height":"Width",o=document.documentElement["client"+m],n=window["inner"+m];if(n){o=Math.min(o,n)}return o},getViewportHeight:function(){return this.getViewport(true)},getViewportWidth:function(){return this.getViewport()},getWidth:function(l){return this.getOffset(l)},handleEvents:function(){return !this.disabled&&this.isCSSOn()},handleItemEvents:function(l){return this.handleEvents()&&!this.isLinkInMegaMenu(l)},isCollapsible:function(){return this.$firstSub.css("position")=="static"},isCSSOn:function(){return this.$firstLink.css("display")=="block"},isFixed:function(){var l=this.$root.css("position")=="fixed";if(!l){this.$root.parentsUntil("body").each(function(){if(a(this).css("position")=="fixed"){l=true;return false}})}return l},isLinkInMegaMenu:function(l){return a(this.getClosestMenu(l[0])).hasClass("mega-menu")},isTouchMode:function(){return !f||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(p,l){var n=p.closest("ul"),q=n.dataSM("level");if(q>1&&(!this.activatedItems[q-2]||this.activatedItems[q-2][0]!=n.dataSM("parent-a")[0])){var m=this;a(n.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(n).each(function(){m.itemActivate(a(this).dataSM("parent-a"))})}if(!this.isCollapsible()||l){this.menuHideSubMenus(!this.activatedItems[q-1]||this.activatedItems[q-1][0]!=p[0]?q-1:q)}this.activatedItems[q-1]=p;if(this.$root.triggerHandler("activate.smapi",p[0])===false){return}var o=p.dataSM("sub");if(o&&(this.isTouchMode()||(!this.opts.showOnClick||this.clickActivated))){this.menuShow(o)}},itemBlur:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}this.$root.triggerHandler("blur.smapi",l[0])},itemClick:function(o){var n=a(o.currentTarget);if(!this.handleItemEvents(n)){return}if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==n.closest("ul")[0]){this.$touchScrollingSub=null;o.stopPropagation();return false}if(this.$root.triggerHandler("click.smapi",n[0])===false){return false}var p=a(o.target).is("span.sub-arrow"),m=n.dataSM("sub"),l=m?m.dataSM("level")==2:false;if(m&&!m.is(":visible")){if(this.opts.showOnClick&&l){this.clickActivated=true}this.itemActivate(n);if(m.is(":visible")){this.focusActivated=true;return false}}else{if(this.isCollapsible()&&p){this.itemActivate(n);this.menuHide(m);return false}}if(this.opts.showOnClick&&l||n.hasClass("disabled")||this.$root.triggerHandler("select.smapi",n[0])===false){return false}},itemDown:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}l.dataSM("mousedown",true)},itemEnter:function(n){var m=a(n.currentTarget);if(!this.handleItemEvents(m)){return}if(!this.isTouchMode()){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var l=this;this.showTimeout=setTimeout(function(){l.itemActivate(m)},this.opts.showOnClick&&m.closest("ul").dataSM("level")==1?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",m[0])},itemFocus:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(this.focusActivated&&(!this.isTouchMode()||!l.dataSM("mousedown"))&&(!this.activatedItems.length||this.activatedItems[this.activatedItems.length-1][0]!=l[0])){this.itemActivate(l,true)}this.$root.triggerHandler("focus.smapi",l[0])},itemLeave:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(!this.isTouchMode()){l[0].blur();if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}}l.removeDataSM("mousedown");this.$root.triggerHandler("mouseleave.smapi",l[0])},menuHide:function(m){if(this.$root.triggerHandler("beforehide.smapi",m[0])===false){return}m.stop(true,true);if(m.css("display")!="none"){var l=function(){m.css("z-index","")};if(this.isCollapsible()){if(this.opts.collapsibleHideFunction){this.opts.collapsibleHideFunction.call(this,m,l)}else{m.hide(this.opts.collapsibleHideDuration,l)}}else{if(this.opts.hideFunction){this.opts.hideFunction.call(this,m,l)}else{m.hide(this.opts.hideDuration,l)}}if(m.dataSM("ie-shim")){m.dataSM("ie-shim").remove().css({"-webkit-transform":"",transform:""})}if(m.dataSM("scroll")){this.menuScrollStop(m);m.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).unbind(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()}m.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false");m.attr({"aria-expanded":"false","aria-hidden":"true"});var n=m.dataSM("level");this.activatedItems.splice(n-1,1);this.visibleSubMenus.splice(a.inArray(m,this.visibleSubMenus),1);this.$root.triggerHandler("hide.smapi",m[0])}},menuHideAll:function(){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var m=this.opts.isPopup?1:0;for(var l=this.visibleSubMenus.length-1;l>=m;l--){this.menuHide(this.visibleSubMenus[l])}if(this.opts.isPopup){this.$root.stop(true,true);if(this.$root.is(":visible")){if(this.opts.hideFunction){this.opts.hideFunction.call(this,this.$root)}else{this.$root.hide(this.opts.hideDuration)}if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").remove()}}}this.activatedItems=[];this.visibleSubMenus=[];this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(n){for(var l=this.activatedItems.length-1;l>=n;l--){var m=this.activatedItems[l].dataSM("sub");if(m){this.menuHide(m)}}},menuIframeShim:function(l){if(e&&this.opts.overlapControlsInIE&&!l.dataSM("ie-shim")){l.dataSM("ie-shim",a("<iframe/>").attr({src:"javascript:0",tabindex:-9}).css({position:"absolute",top:"auto",left:"0",opacity:0,border:"0"}))}},menuInit:function(l){if(!l.dataSM("in-mega")){if(l.hasClass("mega-menu")){l.find("ul").dataSM("in-mega",true)}var q=2,m=l[0];while((m=m.parentNode.parentNode)!=this.$root[0]){q++}var n=l.prevAll("a").eq(-1);if(!n.length){n=l.prevAll().find("a").eq(-1)}n.addClass("has-submenu").dataSM("sub",l);l.dataSM("parent-a",n).dataSM("level",q).parent().dataSM("sub",l);var o=n.attr("id")||this.accessIdPrefix+(++this.idInc),p=l.attr("id")||this.accessIdPrefix+(++this.idInc);n.attr({id:o,"aria-haspopup":"true","aria-controls":p,"aria-expanded":"false"});l.attr({id:p,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"});if(this.opts.subIndicators){n[this.opts.subIndicatorsPos](this.$subArrow.clone())}}},menuPosition:function(K){var r=K.dataSM("parent-a"),D=r.closest("li"),E=D.parent(),l=K.dataSM("level"),t=this.getWidth(K),J=this.getHeight(K),u=r.offset(),o=u.left,m=u.top,q=this.getWidth(r),F=this.getHeight(r),H=a(window),v=H.scrollLeft(),s=H.scrollTop(),z=this.getViewportWidth(),L=this.getViewportHeight(),w=E.parent().is("[data-sm-horizontal-sub]")||l==2&&!E.hasClass("sm-vertical"),B=this.opts.rightToLeftSubMenus&&!D.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&D.is("[data-sm-reverse]"),p=l==2?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,n=l==2?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY,C,A;if(w){C=B?q-t-p:p;A=this.opts.bottomToTopSubMenus?-J-n:F+n}else{C=B?p-t:q-p;A=this.opts.bottomToTopSubMenus?F-n-J:n}if(this.opts.keepInViewport){var N=o+C,M=m+A;if(B&&N<v){C=w?v-N+C:q-p}else{if(!B&&N+t>v+z){C=w?v+z-t-N+C:p-t}}if(!w){if(J<L&&M+J>s+L){A+=s+L-J-M}else{if(J>=L||M<s){A+=s-M}}}if(w&&(M+J>s+L+0.49||M<s)||!w&&J>L+0.49){var G=this;if(!K.dataSM("scroll-arrows")){K.dataSM("scroll-arrows",a([a('<span class="scroll-up"><span class="scroll-up-arrow"></span></span>')[0],a('<span class="scroll-down"><span class="scroll-down-arrow"></span></span>')[0]]).bind({mouseenter:function(){K.dataSM("scroll").up=a(this).hasClass("scroll-up");G.menuScroll(K)},mouseleave:function(x){G.menuScrollStop(K);G.menuScrollOut(K,x)},"mousewheel DOMMouseScroll":function(x){x.preventDefault()}}).insertAfter(K))}var I=".smartmenus_scroll";K.dataSM("scroll",{y:this.cssTransforms3d?0:A-F,step:1,itemH:F,subH:J,arrowDownH:this.getHeight(K.dataSM("scroll-arrows").eq(1))}).bind(i([["mouseover",function(x){G.menuScrollOver(K,x)}],["mouseout",function(x){G.menuScrollOut(K,x)}],["mousewheel DOMMouseScroll",function(x){G.menuScrollMousewheel(K,x)}]],I)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:C+(parseInt(K.css("border-left-width"))||0),width:t-(parseInt(K.css("border-left-width"))||0)-(parseInt(K.css("border-right-width"))||0),zIndex:K.css("z-index")}).eq(w&&this.opts.bottomToTopSubMenus?0:1).show();if(this.isFixed()){K.css({"touch-action":"none","-ms-touch-action":"none"}).bind(i([[d?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp",function(x){G.menuScrollTouch(K,x)}]],I))}}}K.css({top:"auto",left:"0",marginLeft:C,marginTop:A-F});this.menuIframeShim(K);if(K.dataSM("ie-shim")){K.dataSM("ie-shim").css({zIndex:K.css("z-index"),width:t,height:J,marginLeft:C,marginTop:A-F})}},menuScroll:function(r,m,n){var p=r.dataSM("scroll"),q=r.dataSM("scroll-arrows"),o=p.up?p.upEnd:p.downEnd,s;if(!m&&p.momentum){p.momentum*=0.92;s=p.momentum;if(s<0.5){this.menuScrollStop(r);return}}else{s=n||(m||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(p.step))}var l=r.dataSM("level");if(this.activatedItems[l-1]&&this.activatedItems[l-1].dataSM("sub")&&this.activatedItems[l-1].dataSM("sub").is(":visible")){this.menuHideSubMenus(l-1)}p.y=p.up&&o<=p.y||!p.up&&o>=p.y?p.y:(Math.abs(o-p.y)>s?p.y+(p.up?s:-s):o);r.add(r.dataSM("ie-shim")).css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+p.y+"px, 0)",transform:"translate3d(0, "+p.y+"px, 0)"}:{marginTop:p.y});if(f&&(p.up&&p.y>p.downEnd||!p.up&&p.y<p.upEnd)){q.eq(p.up?1:0).show()}if(p.y==o){if(f){q.eq(p.up?0:1).hide()}this.menuScrollStop(r)}else{if(!m){if(this.opts.scrollAccelerate&&p.step<this.opts.scrollStep){p.step+=0.2}var t=this;this.scrollTimeout=g(function(){t.menuScroll(r)})}}},menuScrollMousewheel:function(m,n){if(this.getClosestMenu(n.target)==m[0]){n=n.originalEvent;var l=(n.wheelDelta||-n.detail)>0;if(m.dataSM("scroll-arrows").eq(l?0:1).is(":visible")){m.dataSM("scroll").up=l;this.menuScroll(m,true)}}n.preventDefault()},menuScrollOut:function(l,m){if(f){if(!/^scroll-(up|down)/.test((m.relatedTarget||"").className)&&(l[0]!=m.relatedTarget&&!a.contains(l[0],m.relatedTarget)||this.getClosestMenu(m.relatedTarget)!=l[0])){l.dataSM("scroll-arrows").css("visibility","hidden")}}},menuScrollOver:function(n,o){if(f){if(!/^scroll-(up|down)/.test(o.target.className)&&this.getClosestMenu(o.target)==n[0]){this.menuScrollRefreshData(n);var m=n.dataSM("scroll"),l=a(window).scrollTop()-n.dataSM("parent-a").offset().top-m.itemH;n.dataSM("scroll-arrows").eq(0).css("margin-top",l).end().eq(1).css("margin-top",l+this.getViewportHeight()-m.arrowDownH).end().css("visibility","visible")}}},menuScrollRefreshData:function(n){var m=n.dataSM("scroll"),l=a(window).scrollTop()-n.dataSM("parent-a").offset().top-m.itemH;if(this.cssTransforms3d){l=-(parseFloat(n.css("margin-top"))-l)}a.extend(m,{upEnd:l,downEnd:l+this.getViewportHeight()-m.subH})},menuScrollStop:function(l){if(this.scrollTimeout){c(this.scrollTimeout);this.scrollTimeout=0;l.dataSM("scroll").step=1;return true}},menuScrollTouch:function(p,q){q=q.originalEvent;if(j(q)){var m=this.getTouchPoint(q);if(this.getClosestMenu(m.target)==p[0]){var o=p.dataSM("scroll");if(/(start|down)$/i.test(q.type)){if(this.menuScrollStop(p)){q.preventDefault();this.$touchScrollingSub=p}else{this.$touchScrollingSub=null}this.menuScrollRefreshData(p);a.extend(o,{touchStartY:m.pageY,touchStartTime:q.timeStamp})}else{if(/move$/i.test(q.type)){var n=o.touchY!==undefined?o.touchY:o.touchStartY;if(n!==undefined&&n!=m.pageY){this.$touchScrollingSub=p;var l=n<m.pageY;if(o.up!==undefined&&o.up!=l){a.extend(o,{touchStartY:m.pageY,touchStartTime:q.timeStamp})}a.extend(o,{up:l,touchY:m.pageY});this.menuScroll(p,true,Math.abs(m.pageY-n))}q.preventDefault()}else{if(o.touchY!==undefined){if(o.momentum=Math.pow(Math.abs(m.pageY-o.touchStartY)/(q.timeStamp-o.touchStartTime),2)*15){this.menuScrollStop(p);this.menuScroll(p);q.preventDefault()}delete o.touchY}}}}}},menuShow:function(n){if(!n.dataSM("beforefirstshowfired")){n.dataSM("beforefirstshowfired",true);if(this.$root.triggerHandler("beforefirstshow.smapi",n[0])===false){return}}if(this.$root.triggerHandler("beforeshow.smapi",n[0])===false){return}n.dataSM("shown-before",true).stop(true,true);if(!n.is(":visible")){var m=n.dataSM("parent-a");if(this.opts.keepHighlighted||this.isCollapsible()){m.addClass("highlighted")}if(this.isCollapsible()){n.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""})}else{n.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1);if(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth){n.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap");if(this.opts.subMenusMinWidth){n.css("min-width",this.opts.subMenusMinWidth)}if(this.opts.subMenusMaxWidth){var o=this.getWidth(n);n.css("max-width",this.opts.subMenusMaxWidth);if(o>this.getWidth(n)){n.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}}}this.menuPosition(n);if(n.dataSM("ie-shim")){n.dataSM("ie-shim").insertBefore(n)}}var l=function(){n.css("overflow","")};if(this.isCollapsible()){if(this.opts.collapsibleShowFunction){this.opts.collapsibleShowFunction.call(this,n,l)}else{n.show(this.opts.collapsibleShowDuration,l)}}else{if(this.opts.showFunction){this.opts.showFunction.call(this,n,l)}else{n.show(this.opts.showDuration,l)}}m.attr("aria-expanded","true");n.attr({"aria-expanded":"true","aria-hidden":"false"});this.visibleSubMenus.push(n);this.$root.triggerHandler("show.smapi",n[0])}},popupHide:function(l){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var m=this;this.hideTimeout=setTimeout(function(){m.menuHideAll()},l?1:this.opts.hideTimeout)},popupShow:function(o,n){if(!this.opts.isPopup){alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.');return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}this.$root.dataSM("shown-before",true).stop(true,true);if(!this.$root.is(":visible")){this.$root.css({left:o,top:n});this.menuIframeShim(this.$root);if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").css({zIndex:this.$root.css("z-index"),width:this.getWidth(this.$root),height:this.getHeight(this.$root),left:o,top:n}).insertBefore(this.$root)}var m=this,l=function(){m.$root.css("overflow","")};if(this.opts.showFunction){this.opts.showFunction.call(this,this.$root,l)}else{this.$root.show(this.opts.showDuration,l)}this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(true);this.init(true)},rootKeyDown:function(o){if(!this.handleEvents()){return}switch(o.keyCode){case 27:var m=this.activatedItems[0];if(m){this.menuHideAll();m[0].focus();var n=m.dataSM("sub");if(n){this.menuHide(n)}}break;case 32:var l=a(o.target);if(l.is("a")&&this.handleItemEvents(l)){var n=l.dataSM("sub");if(n&&!n.is(":visible")){this.itemClick({currentTarget:o.target});o.preventDefault()}}break}},rootOut:function(m){if(!this.handleEvents()||this.isTouchMode()||m.target==this.$root[0]){return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}if(!this.opts.showOnClick||!this.opts.hideOnClick){var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(l){if(!this.handleEvents()||this.isTouchMode()||l.target==this.$root[0]){return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}},winResize:function(m){if(!this.handleEvents()){if(this.$disableOverlay){var n=this.$root.offset();this.$disableOverlay.css({top:n.top,left:n.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}return}if(!("onorientationchange" in window)||m.type=="orientationchange"){var l=this.isCollapsible();if(!(this.wasCollapsible&&l)){if(this.activatedItems.length){this.activatedItems[this.activatedItems.length-1][0].blur()}this.menuHideAll()}this.wasCollapsible=l}}}});a.fn.dataSM=function(l,m){if(m){return this.data(l+"_smartmenus",m)}return this.data(l+"_smartmenus")};a.fn.removeDataSM=function(l){return this.removeData(l+"_smartmenus")};a.fn.smartmenus=function(m){if(typeof m=="string"){var l=arguments,o=m;Array.prototype.shift.call(l);return this.each(function(){var p=a(this).data("smartmenus");if(p&&p[o]){p[o].apply(p,l)}})}var n=a.extend({},a.fn.smartmenus.defaults,m);return this.each(function(){new a.SmartMenus(this,n)})};a.fn.smartmenus.defaults={isPopup:false,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:true,subIndicatorsPos:"prepend",subIndicatorsText:"+",scrollStep:30,scrollAccelerate:true,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(m,l){m.fadeOut(200,l)},collapsibleShowDuration:0,collapsibleShowFunction:function(m,l){m.slideDown(200,l)},collapsibleHideDuration:0,collapsibleHideFunction:function(m,l){m.slideUp(200,l)},showOnClick:false,hideOnClick:true,noMouseOver:false,keepInViewport:true,keepHighlighted:true,markCurrentItem:false,markCurrentTree:true,rightToLeftSubMenus:false,bottomToTopSubMenus:false,overlapControlsInIE:true};return a}));
\ No newline at end of file
index e913001..b592e9c 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: json.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
 <div class="title">json.h File Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
-</div><!-- contents -->
+
+<p>A convenience header that may be included instead of other individual ones.  
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A convenience header that may be included instead of other individual ones. </p>
+</div></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 12:38:14 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 9a166f6..bfdfbff 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: json_c_version.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
 <div class="title">json_c_version.h File Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
+
+<p>Methods for retrieving the json-c version.  
+<a href="#details">More...</a></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
 Macros</h2></td></tr>
 <tr class="memitem:a251c3e1f59a379a4a905382b4e855125"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__c__version_8h.html#a251c3e1f59a379a4a905382b4e855125">JSON_C_MAJOR_VERSION</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:a251c3e1f59a379a4a905382b4e855125"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:adc87477fbc1c75848fe6b6feec21c2d6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__c__version_8h.html#adc87477fbc1c75848fe6b6feec21c2d6">JSON_C_MINOR_VERSION</a>&#160;&#160;&#160;12</td></tr>
+<tr class="memitem:adc87477fbc1c75848fe6b6feec21c2d6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__c__version_8h.html#adc87477fbc1c75848fe6b6feec21c2d6">JSON_C_MINOR_VERSION</a>&#160;&#160;&#160;13</td></tr>
 <tr class="separator:adc87477fbc1c75848fe6b6feec21c2d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a64457730097067ab096906d82e4a51a6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__c__version_8h.html#a64457730097067ab096906d82e4a51a6">JSON_C_MICRO_VERSION</a>&#160;&#160;&#160;1</td></tr>
+<tr class="memitem:a64457730097067ab096906d82e4a51a6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__c__version_8h.html#a64457730097067ab096906d82e4a51a6">JSON_C_MICRO_VERSION</a>&#160;&#160;&#160;00</td></tr>
 <tr class="separator:a64457730097067ab096906d82e4a51a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a78e176eee75ee6aed43c4d65ca4c5b44"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__c__version_8h.html#a78e176eee75ee6aed43c4d65ca4c5b44">JSON_C_VERSION_NUM</a></td></tr>
 <tr class="separator:a78e176eee75ee6aed43c4d65ca4c5b44"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a894adda66a072bc3fd34ebe91a5aa7f4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__c__version_8h.html#a894adda66a072bc3fd34ebe91a5aa7f4">JSON_C_VERSION</a>&#160;&#160;&#160;&quot;0.12.1&quot;</td></tr>
+<tr class="memitem:a894adda66a072bc3fd34ebe91a5aa7f4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__c__version_8h.html#a894adda66a072bc3fd34ebe91a5aa7f4">JSON_C_VERSION</a>&#160;&#160;&#160;&quot;0.13&quot;</td></tr>
 <tr class="separator:a894adda66a072bc3fd34ebe91a5aa7f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
@@ -71,8 +69,12 @@ Functions</h2></td></tr>
 <tr class="memitem:a114bcfed9594f3cd662e43454000938d"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__c__version_8h.html#a114bcfed9594f3cd662e43454000938d">json_c_version_num</a> (void)</td></tr>
 <tr class="separator:a114bcfed9594f3cd662e43454000938d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
-<h2 class="groupheader">Macro Definition Documentation</h2>
-<a class="anchor" id="a251c3e1f59a379a4a905382b4e855125"></a>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Methods for retrieving the json-c version. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a251c3e1f59a379a4a905382b4e855125"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a251c3e1f59a379a4a905382b4e855125">&#9670;&nbsp;</a></span>JSON_C_MAJOR_VERSION</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -84,43 +86,51 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a64457730097067ab096906d82e4a51a6"></a>
+<a id="a64457730097067ab096906d82e4a51a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a64457730097067ab096906d82e4a51a6">&#9670;&nbsp;</a></span>JSON_C_MICRO_VERSION</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">#define JSON_C_MICRO_VERSION&#160;&#160;&#160;1</td>
+          <td class="memname">#define JSON_C_MICRO_VERSION&#160;&#160;&#160;00</td>
         </tr>
       </table>
 </div><div class="memdoc">
 
 </div>
 </div>
-<a class="anchor" id="adc87477fbc1c75848fe6b6feec21c2d6"></a>
+<a id="adc87477fbc1c75848fe6b6feec21c2d6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adc87477fbc1c75848fe6b6feec21c2d6">&#9670;&nbsp;</a></span>JSON_C_MINOR_VERSION</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">#define JSON_C_MINOR_VERSION&#160;&#160;&#160;12</td>
+          <td class="memname">#define JSON_C_MINOR_VERSION&#160;&#160;&#160;13</td>
         </tr>
       </table>
 </div><div class="memdoc">
 
 </div>
 </div>
-<a class="anchor" id="a894adda66a072bc3fd34ebe91a5aa7f4"></a>
+<a id="a894adda66a072bc3fd34ebe91a5aa7f4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a894adda66a072bc3fd34ebe91a5aa7f4">&#9670;&nbsp;</a></span>JSON_C_VERSION</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">#define JSON_C_VERSION&#160;&#160;&#160;&quot;0.12.1&quot;</td>
+          <td class="memname">#define JSON_C_VERSION&#160;&#160;&#160;&quot;0.13&quot;</td>
         </tr>
       </table>
 </div><div class="memdoc">
 
 </div>
 </div>
-<a class="anchor" id="a78e176eee75ee6aed43c4d65ca4c5b44"></a>
+<a id="a78e176eee75ee6aed43c4d65ca4c5b44"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a78e176eee75ee6aed43c4d65ca4c5b44">&#9670;&nbsp;</a></span>JSON_C_VERSION_NUM</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -129,17 +139,15 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<b>Value:</b><div class="fragment"><div class="line">((<a class="code" href="json__c__version_8h.html#a251c3e1f59a379a4a905382b4e855125">JSON_C_MAJOR_VERSION</a> &lt;&lt; 16) | \</div>
-<div class="line">                            (<a class="code" href="json__c__version_8h.html#adc87477fbc1c75848fe6b6feec21c2d6">JSON_C_MINOR_VERSION</a> &lt;&lt; 8) | <a class="code" href="json__c__version_8h.html#a64457730097067ab096906d82e4a51a6">\</a></div>
-<div class="line"><a class="code" href="json__c__version_8h.html#a64457730097067ab096906d82e4a51a6">                            JSON_C_MICRO_VERSION</a>)</div>
-<div class="ttc" id="json__c__version_8h_html_a64457730097067ab096906d82e4a51a6"><div class="ttname"><a href="json__c__version_8h.html#a64457730097067ab096906d82e4a51a6">JSON_C_MICRO_VERSION</a></div><div class="ttdeci">#define JSON_C_MICRO_VERSION</div><div class="ttdef"><b>Definition:</b> json_c_version.h:13</div></div>
-<div class="ttc" id="json__c__version_8h_html_adc87477fbc1c75848fe6b6feec21c2d6"><div class="ttname"><a href="json__c__version_8h.html#adc87477fbc1c75848fe6b6feec21c2d6">JSON_C_MINOR_VERSION</a></div><div class="ttdeci">#define JSON_C_MINOR_VERSION</div><div class="ttdef"><b>Definition:</b> json_c_version.h:12</div></div>
-<div class="ttc" id="json__c__version_8h_html_a251c3e1f59a379a4a905382b4e855125"><div class="ttname"><a href="json__c__version_8h.html#a251c3e1f59a379a4a905382b4e855125">JSON_C_MAJOR_VERSION</a></div><div class="ttdeci">#define JSON_C_MAJOR_VERSION</div><div class="ttdef"><b>Definition:</b> json_c_version.h:11</div></div>
+<b>Value:</b><div class="fragment"><div class="line">((<a class="code" href="json__c__version_8h.html#a251c3e1f59a379a4a905382b4e855125">JSON_C_MAJOR_VERSION</a> &lt;&lt; 16) | \</div><div class="line">                            (<a class="code" href="json__c__version_8h.html#adc87477fbc1c75848fe6b6feec21c2d6">JSON_C_MINOR_VERSION</a> &lt;&lt; 8) | \</div><div class="line">                            JSON_C_MICRO_VERSION)</div><div class="ttc" id="json__c__version_8h_html_adc87477fbc1c75848fe6b6feec21c2d6"><div class="ttname"><a href="json__c__version_8h.html#adc87477fbc1c75848fe6b6feec21c2d6">JSON_C_MINOR_VERSION</a></div><div class="ttdeci">#define JSON_C_MINOR_VERSION</div><div class="ttdef"><b>Definition:</b> json_c_version.h:16</div></div>
+<div class="ttc" id="json__c__version_8h_html_a251c3e1f59a379a4a905382b4e855125"><div class="ttname"><a href="json__c__version_8h.html#a251c3e1f59a379a4a905382b4e855125">JSON_C_MAJOR_VERSION</a></div><div class="ttdeci">#define JSON_C_MAJOR_VERSION</div><div class="ttdef"><b>Definition:</b> json_c_version.h:15</div></div>
 </div><!-- fragment -->
 </div>
 </div>
 <h2 class="groupheader">Function Documentation</h2>
-<a class="anchor" id="a536b398f292b0669fc824a8486131a27"></a>
+<a id="a536b398f292b0669fc824a8486131a27"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a536b398f292b0669fc824a8486131a27">&#9670;&nbsp;</a></span>json_c_version()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -152,10 +160,14 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="json__c__version_8h.html#a894adda66a072bc3fd34ebe91a5aa7f4">JSON_C_VERSION</a> </dd></dl>
+<dl class="section return"><dt>Returns</dt><dd>the version of the json-c library as a string </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="a114bcfed9594f3cd662e43454000938d"></a>
+<a id="a114bcfed9594f3cd662e43454000938d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a114bcfed9594f3cd662e43454000938d">&#9670;&nbsp;</a></span>json_c_version_num()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -168,15 +180,18 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
+<p>The json-c version encoded into an int, with the low order 8 bits being the micro version, the next higher 8 bits being the minor version and the next higher 8 bits being the major version. For example, 7.12.99 would be 0x00070B63.</p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="json__c__version_8h.html#a78e176eee75ee6aed43c4d65ca4c5b44">JSON_C_VERSION_NUM</a> </dd></dl>
+<dl class="section return"><dt>Returns</dt><dd>the version of the json-c library as an int </dd></dl>
 
 </div>
 </div>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 14:44:06 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 7866964..24248b5 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: json_inttypes.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
   <div class="headertitle">
 <div class="title">json_inttypes.h File Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
+
+<p>Do not use, json-c internal, may be changed or removed at any time.  
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ae372e90b62c1e8b51dc5d95bf7f5ba48"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__inttypes_8h.html#ae372e90b62c1e8b51dc5d95bf7f5ba48">PRId64</a>&#160;&#160;&#160;&quot;I64d&quot;</td></tr>
+<tr class="separator:ae372e90b62c1e8b51dc5d95bf7f5ba48"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae7044b3fb4cc5cde22155d59437c348f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__inttypes_8h.html#ae7044b3fb4cc5cde22155d59437c348f">SCNd64</a>&#160;&#160;&#160;&quot;I64d&quot;</td></tr>
+<tr class="separator:ae7044b3fb4cc5cde22155d59437c348f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Do not use, json-c internal, may be changed or removed at any time. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ae372e90b62c1e8b51dc5d95bf7f5ba48"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae372e90b62c1e8b51dc5d95bf7f5ba48">&#9670;&nbsp;</a></span>PRId64</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PRId64&#160;&#160;&#160;&quot;I64d&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ae7044b3fb4cc5cde22155d59437c348f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae7044b3fb4cc5cde22155d59437c348f">&#9670;&nbsp;</a></span>SCNd64</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SCNd64&#160;&#160;&#160;&quot;I64d&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 08:47:50 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index d9f49d6..9c192ec 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: json_object.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
@@ -54,6 +49,9 @@
 <div class="title">json_object.h File Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
+
+<p>Core json-c API. Start here, or with <a class="el" href="json__tokener_8h.html" title="Methods to parse an input string into a tree of json_object objects. ">json_tokener.h</a>.  
+<a href="#details">More...</a></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
 Data Structures</h2></td></tr>
@@ -64,6 +62,8 @@ Data Structures</h2></td></tr>
 Macros</h2></td></tr>
 <tr class="memitem:a84fa70b86686ce202058f63905c90078"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a84fa70b86686ce202058f63905c90078">THIS_FUNCTION_IS_DEPRECATED</a>(func)&#160;&#160;&#160;func</td></tr>
 <tr class="separator:a84fa70b86686ce202058f63905c90078"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a31d5c00f3a4712f2d5d62aee66344e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a>&#160;&#160;&#160;extern</td></tr>
+<tr class="separator:a2a31d5c00f3a4712f2d5d62aee66344e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a268a63dd1b2e6d81559e268a4529e9bf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a268a63dd1b2e6d81559e268a4529e9bf">JSON_OBJECT_DEF_HASH_ENTRIES</a>&#160;&#160;&#160;16</td></tr>
 <tr class="separator:a268a63dd1b2e6d81559e268a4529e9bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a3294cb92765cdeb497cfd346644d1059"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a3294cb92765cdeb497cfd346644d1059">JSON_C_TO_STRING_PLAIN</a>&#160;&#160;&#160;0</td></tr>
@@ -72,39 +72,46 @@ Macros</h2></td></tr>
 <tr class="separator:aa821746c8668e6ad62bed90ec9e00103"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a2025bc677c35f130e117dfda5bf1ef73"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a2025bc677c35f130e117dfda5bf1ef73">JSON_C_TO_STRING_PRETTY</a>&#160;&#160;&#160;(1&lt;&lt;1)</td></tr>
 <tr class="separator:a2025bc677c35f130e117dfda5bf1ef73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc1486af21f6b1653c6f523025bdfd3b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#afc1486af21f6b1653c6f523025bdfd3b">JSON_C_TO_STRING_PRETTY_TAB</a>&#160;&#160;&#160;(1&lt;&lt;3)</td></tr>
+<tr class="separator:afc1486af21f6b1653c6f523025bdfd3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a34f027c147babf69fc530d088f2b49b0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a34f027c147babf69fc530d088f2b49b0">JSON_C_TO_STRING_NOZERO</a>&#160;&#160;&#160;(1&lt;&lt;2)</td></tr>
 <tr class="separator:a34f027c147babf69fc530d088f2b49b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c11d72c55f3ab7c088f19e7bf118163"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a5c11d72c55f3ab7c088f19e7bf118163">JSON_C_TO_STRING_NOSLASHESCAPE</a>&#160;&#160;&#160;(1&lt;&lt;4)</td></tr>
+<tr class="separator:a5c11d72c55f3ab7c088f19e7bf118163"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8cd01c484155ac99043a35b7c85ae411"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a8cd01c484155ac99043a35b7c85ae411">JSON_C_OBJECT_ADD_KEY_IS_NEW</a>&#160;&#160;&#160;(1&lt;&lt;1)</td></tr>
+<tr class="separator:a8cd01c484155ac99043a35b7c85ae411"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a134ffafc6116799a20134dc7646b5a37"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a134ffafc6116799a20134dc7646b5a37">JSON_C_OBJECT_KEY_IS_CONSTANT</a>&#160;&#160;&#160;(1&lt;&lt;2)</td></tr>
+<tr class="separator:a134ffafc6116799a20134dc7646b5a37"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aa93f0eb578d23995850d61f7d61c55c1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#aa93f0eb578d23995850d61f7d61c55c1">FALSE</a>&#160;&#160;&#160;((<a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>)0)</td></tr>
 <tr class="separator:aa93f0eb578d23995850d61f7d61c55c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aa8cecfc5c5c054d2875c03e77b7be15d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>&#160;&#160;&#160;((<a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>)1)</td></tr>
 <tr class="separator:aa8cecfc5c5c054d2875c03e77b7be15d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45837b8c6564f9e605f8a2bc76243750"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a45837b8c6564f9e605f8a2bc76243750">JSON_C_OPTION_GLOBAL</a>&#160;&#160;&#160;(0)</td></tr>
+<tr class="separator:a45837b8c6564f9e605f8a2bc76243750"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a50d1490598fe476d7a53e204e02cdc9d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a50d1490598fe476d7a53e204e02cdc9d">JSON_C_OPTION_THREAD</a>&#160;&#160;&#160;(1)</td></tr>
+<tr class="separator:a50d1490598fe476d7a53e204e02cdc9d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:acf5f514a9e0061c10fc08055762639ee"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#acf5f514a9e0061c10fc08055762639ee">json_object_object_foreach</a>(obj,  key,  val)</td></tr>
 <tr class="separator:acf5f514a9e0061c10fc08055762639ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a71f07006c12d78f7bbf4cb716a5af3a6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a71f07006c12d78f7bbf4cb716a5af3a6">json_object_object_foreachC</a>(obj,  iter)&#160;&#160;&#160;for(iter.entry = <a class="el" href="json__object_8h.html#a9840421d6b45a7d00a42e13e379b54b5">json_object_get_object</a>(obj)-&gt;head; (iter.entry ? (iter.key = (char*)iter.entry-&gt;k, iter.val = (struct <a class="el" href="structjson__object.html">json_object</a>*)iter.entry-&gt;v, iter.entry) : 0); iter.entry = iter.entry-&gt;next)</td></tr>
+<tr class="memitem:a71f07006c12d78f7bbf4cb716a5af3a6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a71f07006c12d78f7bbf4cb716a5af3a6">json_object_object_foreachC</a>(obj,  iter)</td></tr>
 <tr class="separator:a71f07006c12d78f7bbf4cb716a5af3a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
 Typedefs</h2></td></tr>
+<tr class="memitem:af88126730e765f2068968f4b16fd074f"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structjson__object__iter.html">json_object_iter</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#af88126730e765f2068968f4b16fd074f">json_object_iter</a></td></tr>
+<tr class="separator:af88126730e765f2068968f4b16fd074f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a81f02022906fafc71eb9197049f07f73"><td class="memItemLeft" align="right" valign="top">typedef int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a></td></tr>
 <tr class="separator:a81f02022906fafc71eb9197049f07f73"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ace274df280df67463ff417b1b3392395"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structprintbuf.html">printbuf</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ace274df280df67463ff417b1b3392395">printbuf</a></td></tr>
-<tr class="separator:ace274df280df67463ff417b1b3392395"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a766e90057496fc6712d6be0da180a21f"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structlh__table.html">lh_table</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a766e90057496fc6712d6be0da180a21f">lh_table</a></td></tr>
-<tr class="separator:a766e90057496fc6712d6be0da180a21f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a6d6d32d8b026ea2025df519b9e90f44a"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structarray__list.html">array_list</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a6d6d32d8b026ea2025df519b9e90f44a">array_list</a></td></tr>
-<tr class="separator:a6d6d32d8b026ea2025df519b9e90f44a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:af27907ced0f5a43409ad96430fe0f914"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structjson__object.html">json_object</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#af27907ced0f5a43409ad96430fe0f914">json_object</a></td></tr>
+<tr class="memdesc:af27907ced0f5a43409ad96430fe0f914"><td class="mdescLeft">&#160;</td><td class="mdescRight">The core type for all type of JSON objects handled by json-c.  <a href="#af27907ced0f5a43409ad96430fe0f914">More...</a><br /></td></tr>
 <tr class="separator:af27907ced0f5a43409ad96430fe0f914"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:af88126730e765f2068968f4b16fd074f"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structjson__object__iter.html">json_object_iter</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#af88126730e765f2068968f4b16fd074f">json_object_iter</a></td></tr>
-<tr class="separator:af88126730e765f2068968f4b16fd074f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a4dd5e5b65aee7f376f529f86b210ff49"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structjson__tokener.html">json_tokener</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a4dd5e5b65aee7f376f529f86b210ff49">json_tokener</a></td></tr>
-<tr class="separator:a4dd5e5b65aee7f376f529f86b210ff49"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a3032a61c0ba2d38563b1b765f54ea46f"><td class="memItemLeft" align="right" valign="top">typedef void(&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a3032a61c0ba2d38563b1b765f54ea46f">json_object_delete_fn</a>) (struct <a class="el" href="structjson__object.html">json_object</a> *jso, void *userdata)</td></tr>
-<tr class="separator:a3032a61c0ba2d38563b1b765f54ea46f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a7806d0a6826ac08f6f8b09636207870e"><td class="memItemLeft" align="right" valign="top">typedef int(&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a7806d0a6826ac08f6f8b09636207870e">json_object_to_json_string_fn</a>) (struct <a class="el" href="structjson__object.html">json_object</a> *jso, struct <a class="el" href="structprintbuf.html">printbuf</a> *pb, int level, int flags)</td></tr>
-<tr class="separator:a7806d0a6826ac08f6f8b09636207870e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57e58c272b899b7034c3b5137935117f"><td class="memItemLeft" align="right" valign="top">typedef void()&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a57e58c272b899b7034c3b5137935117f">json_object_delete_fn</a>(struct <a class="el" href="structjson__object.html">json_object</a> *jso, void *userdata)</td></tr>
+<tr class="separator:a57e58c272b899b7034c3b5137935117f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad689953451ffa828830d349f4cd72563"><td class="memItemLeft" align="right" valign="top">typedef int()&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ad689953451ffa828830d349f4cd72563">json_object_to_json_string_fn</a>(struct <a class="el" href="structjson__object.html">json_object</a> *jso, struct <a class="el" href="structprintbuf.html">printbuf</a> *pb, int level, int flags)</td></tr>
+<tr class="separator:ad689953451ffa828830d349f4cd72563"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aba5eff84f8638d22f50403175f270c96"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#aba5eff84f8638d22f50403175f270c96">json_type</a></td></tr>
 <tr class="separator:aba5eff84f8638d22f50403175f270c96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acfbe0648eb909870e346df0bb42e81e1"><td class="memItemLeft" align="right" valign="top">typedef int()&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#acfbe0648eb909870e346df0bb42e81e1">json_c_shallow_copy_fn</a>(<a class="el" href="structjson__object.html">json_object</a> *src, <a class="el" href="structjson__object.html">json_object</a> *parent, const char *key, size_t index, <a class="el" href="structjson__object.html">json_object</a> **dst)</td></tr>
+<tr class="separator:acfbe0648eb909870e346df0bb42e81e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
 Enumerations</h2></td></tr>
@@ -123,88 +130,124 @@ Enumerations</h2></td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:acc3628d97c6308dc967006e4268c4e7f"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#acc3628d97c6308dc967006e4268c4e7f">json_object_get</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
-<tr class="separator:acc3628d97c6308dc967006e4268c4e7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a1bb50e2d17832c404c3d5f13fbde5bf5"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a1bb50e2d17832c404c3d5f13fbde5bf5">json_object_put</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
-<tr class="separator:a1bb50e2d17832c404c3d5f13fbde5bf5"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ab6dc8b19f8da310e78f402f83d6ae6c5"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ab6dc8b19f8da310e78f402f83d6ae6c5">json_object_is_type</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a> type)</td></tr>
-<tr class="separator:ab6dc8b19f8da310e78f402f83d6ae6c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:adc5e998b4897b6e450bd0975a58d2f72"><td class="memItemLeft" align="right" valign="top">enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#adc5e998b4897b6e450bd0975a58d2f72">json_object_get_type</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
-<tr class="separator:adc5e998b4897b6e450bd0975a58d2f72"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a1f62a660e2619559d1f3f54cd7483ff8"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a1f62a660e2619559d1f3f54cd7483ff8">json_object_to_json_string</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
-<tr class="separator:a1f62a660e2619559d1f3f54cd7483ff8"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a84421dab94ccad42e901e534c6d7b658"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a84421dab94ccad42e901e534c6d7b658">json_object_to_json_string_ext</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, int flags)</td></tr>
-<tr class="separator:a84421dab94ccad42e901e534c6d7b658"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a2ce290cd15dba1c779727c6041d5a2dd"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a2ce290cd15dba1c779727c6041d5a2dd">json_object_set_serializer</a> (<a class="el" href="structjson__object.html">json_object</a> *jso, <a class="el" href="json__object_8h.html#a7806d0a6826ac08f6f8b09636207870e">json_object_to_json_string_fn</a> to_string_func, void *userdata, <a class="el" href="json__object_8h.html#a3032a61c0ba2d38563b1b765f54ea46f">json_object_delete_fn</a> *user_delete)</td></tr>
-<tr class="separator:a2ce290cd15dba1c779727c6041d5a2dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:af0ed3555604f39ac74b5e28bc5b1f82c"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#af0ed3555604f39ac74b5e28bc5b1f82c">json_object_new_object</a> (void)</td></tr>
-<tr class="separator:af0ed3555604f39ac74b5e28bc5b1f82c"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a9840421d6b45a7d00a42e13e379b54b5"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__table.html">lh_table</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a9840421d6b45a7d00a42e13e379b54b5">json_object_get_object</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
-<tr class="separator:a9840421d6b45a7d00a42e13e379b54b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:acde75a8e4ad28056b3e694ff43afbec0"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#acde75a8e4ad28056b3e694ff43afbec0">json_object_object_length</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
-<tr class="separator:acde75a8e4ad28056b3e694ff43afbec0"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a04448b1c63173e1bfe49965835732075"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a04448b1c63173e1bfe49965835732075">json_object_object_add</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, const char *key, struct <a class="el" href="structjson__object.html">json_object</a> *val)</td></tr>
-<tr class="separator:a04448b1c63173e1bfe49965835732075"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a1345aaf3ee46e9b6185355b733ec362d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a1345aaf3ee46e9b6185355b733ec362d">THIS_FUNCTION_IS_DEPRECATED</a> (extern struct <a class="el" href="structjson__object.html">json_object</a> *json_object_object_get(struct <a class="el" href="structjson__object.html">json_object</a> *obj, const char *key))</td></tr>
-<tr class="separator:a1345aaf3ee46e9b6185355b733ec362d"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:af3f38b3395b1af8e9d3ac73818c3a936"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#af3f38b3395b1af8e9d3ac73818c3a936">json_object_object_get_ex</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, const char *key, struct <a class="el" href="structjson__object.html">json_object</a> **value)</td></tr>
-<tr class="separator:af3f38b3395b1af8e9d3ac73818c3a936"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a03653c18aafccd1ffba1ad318e342845"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a03653c18aafccd1ffba1ad318e342845">json_object_object_del</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, const char *key)</td></tr>
-<tr class="separator:a03653c18aafccd1ffba1ad318e342845"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a9b5af06e9a99e16c6d9b6459a685ea3f"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a9b5af06e9a99e16c6d9b6459a685ea3f">json_object_new_array</a> (void)</td></tr>
-<tr class="separator:a9b5af06e9a99e16c6d9b6459a685ea3f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aba4e8df5e00bdc91a89bfb775e04ed70"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structarray__list.html">array_list</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#aba4e8df5e00bdc91a89bfb775e04ed70">json_object_get_array</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
-<tr class="separator:aba4e8df5e00bdc91a89bfb775e04ed70"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a2e62d4b19de8f297595f3b4aaa0ec453"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a2e62d4b19de8f297595f3b4aaa0ec453">json_object_array_length</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
-<tr class="separator:a2e62d4b19de8f297595f3b4aaa0ec453"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aa1b05eeaa9c92f079facece87d6a0149"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#aa1b05eeaa9c92f079facece87d6a0149">json_object_array_sort</a> (struct <a class="el" href="structjson__object.html">json_object</a> *jso, int(*sort_fn)(const void *, const void *))</td></tr>
-<tr class="separator:aa1b05eeaa9c92f079facece87d6a0149"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:acc89c0f58947d499e2868ac8b62bed49"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#acc89c0f58947d499e2868ac8b62bed49">json_object_array_add</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, struct <a class="el" href="structjson__object.html">json_object</a> *val)</td></tr>
-<tr class="separator:acc89c0f58947d499e2868ac8b62bed49"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a2d19d21b495e1e0d3f711093d97a5104"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a2d19d21b495e1e0d3f711093d97a5104">json_object_array_put_idx</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, int idx, struct <a class="el" href="structjson__object.html">json_object</a> *val)</td></tr>
-<tr class="separator:a2d19d21b495e1e0d3f711093d97a5104"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a5c9120a6d644ea12a61e2ec8520130c6"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a5c9120a6d644ea12a61e2ec8520130c6">json_object_array_get_idx</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, int idx)</td></tr>
-<tr class="separator:a5c9120a6d644ea12a61e2ec8520130c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a93cfacfdd1000c739ad19df0a080cb85"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a93cfacfdd1000c739ad19df0a080cb85">json_object_new_boolean</a> (<a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a> b)</td></tr>
-<tr class="separator:a93cfacfdd1000c739ad19df0a080cb85"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a3be3153ae5158ed24a49d74fbf14149f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a3be3153ae5158ed24a49d74fbf14149f">json_object_get_boolean</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
-<tr class="separator:a3be3153ae5158ed24a49d74fbf14149f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aa7db8ceb1afe1b93afc63c10b8c57560"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#aa7db8ceb1afe1b93afc63c10b8c57560">json_object_new_int</a> (int32_t i)</td></tr>
-<tr class="separator:aa7db8ceb1afe1b93afc63c10b8c57560"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a54a27690a1927354966189166bba6ca3"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a54a27690a1927354966189166bba6ca3">json_object_new_int64</a> (int64_t i)</td></tr>
-<tr class="separator:a54a27690a1927354966189166bba6ca3"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ae6cab7d4c7c707b9053035a6405d3891"><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ae6cab7d4c7c707b9053035a6405d3891">json_object_get_int</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
-<tr class="separator:ae6cab7d4c7c707b9053035a6405d3891"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a3493894ebd226249118582e640af6944"><td class="memItemLeft" align="right" valign="top">int64_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a3493894ebd226249118582e640af6944">json_object_get_int64</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
-<tr class="separator:a3493894ebd226249118582e640af6944"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a2e9c761833a4f5d0a0c60640377e3cec"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a2e9c761833a4f5d0a0c60640377e3cec">json_object_new_double</a> (double d)</td></tr>
-<tr class="separator:a2e9c761833a4f5d0a0c60640377e3cec"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a50c188c8eb9007f05ab1aa0e22eae90c"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a50c188c8eb9007f05ab1aa0e22eae90c">json_object_new_double_s</a> (double d, const char *ds)</td></tr>
-<tr class="separator:a50c188c8eb9007f05ab1aa0e22eae90c"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a9cf586fba906a597a121423045cb2a45"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a9cf586fba906a597a121423045cb2a45">json_object_get_double</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
-<tr class="separator:a9cf586fba906a597a121423045cb2a45"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a48eb92a8208e6718e55edf1130e8e4b8"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a48eb92a8208e6718e55edf1130e8e4b8">json_object_new_string</a> (const char *s)</td></tr>
-<tr class="separator:a48eb92a8208e6718e55edf1130e8e4b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a9d14fd03ed7520c4aa33ab53b4569414"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a9d14fd03ed7520c4aa33ab53b4569414">json_object_new_string_len</a> (const char *s, int len)</td></tr>
-<tr class="separator:a9d14fd03ed7520c4aa33ab53b4569414"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ad24f1c4c22b2a7d33e7b562c01f2ca65"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ad24f1c4c22b2a7d33e7b562c01f2ca65">json_object_get_string</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
-<tr class="separator:ad24f1c4c22b2a7d33e7b562c01f2ca65"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ad821384d0d8515d5ed4eec44d7101772"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ad821384d0d8515d5ed4eec44d7101772">json_object_get_string_len</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
-<tr class="separator:ad821384d0d8515d5ed4eec44d7101772"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a675aa3a9cced685dbfd1c1a770a0c3e4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a675aa3a9cced685dbfd1c1a770a0c3e4">json_object_get</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr class="separator:a675aa3a9cced685dbfd1c1a770a0c3e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afabf61f932cd64a4122ca8092452eed5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#afabf61f932cd64a4122ca8092452eed5">json_object_put</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr class="separator:afabf61f932cd64a4122ca8092452eed5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ab506a3d8f4ba5eb6a12ce0a6bbd37b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a8ab506a3d8f4ba5eb6a12ce0a6bbd37b">json_object_is_type</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj, enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a> type)</td></tr>
+<tr class="separator:a8ab506a3d8f4ba5eb6a12ce0a6bbd37b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af256a3a7910e271a2b9735e5044c3827"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#af256a3a7910e271a2b9735e5044c3827">json_object_get_type</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr class="separator:af256a3a7910e271a2b9735e5044c3827"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab7390c22baa1700d977c2af6b22d43a4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ab7390c22baa1700d977c2af6b22d43a4">json_object_to_json_string</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr class="separator:ab7390c22baa1700d977c2af6b22d43a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9db613127bd4ef7db42307e43a85fc1b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a9db613127bd4ef7db42307e43a85fc1b">json_object_to_json_string_ext</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, int flags)</td></tr>
+<tr class="separator:a9db613127bd4ef7db42307e43a85fc1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add3770a3ba3d01a8f9adedfcd6bd8dbb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#add3770a3ba3d01a8f9adedfcd6bd8dbb">json_object_to_json_string_length</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, int flags, size_t *length)</td></tr>
+<tr class="separator:add3770a3ba3d01a8f9adedfcd6bd8dbb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae925f3ec0f61cba5ea3dd50e0315f194"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ae925f3ec0f61cba5ea3dd50e0315f194">json_object_get_userdata</a> (<a class="el" href="structjson__object.html">json_object</a> *jso)</td></tr>
+<tr class="separator:ae925f3ec0f61cba5ea3dd50e0315f194"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ee4281ccd123c62878e931a0a3bc43b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a4ee4281ccd123c62878e931a0a3bc43b">json_object_set_userdata</a> (<a class="el" href="structjson__object.html">json_object</a> *jso, void *userdata, <a class="el" href="json__object_8h.html#a57e58c272b899b7034c3b5137935117f">json_object_delete_fn</a> *user_delete)</td></tr>
+<tr class="separator:a4ee4281ccd123c62878e931a0a3bc43b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a889345512a214b8f78f6a73561523c7c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a889345512a214b8f78f6a73561523c7c">json_object_set_serializer</a> (<a class="el" href="structjson__object.html">json_object</a> *jso, <a class="el" href="json__object_8h.html#ad689953451ffa828830d349f4cd72563">json_object_to_json_string_fn</a> *to_string_func, void *userdata, <a class="el" href="json__object_8h.html#a57e58c272b899b7034c3b5137935117f">json_object_delete_fn</a> *user_delete)</td></tr>
+<tr class="separator:a889345512a214b8f78f6a73561523c7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68c383f54544fca19b5f2425be397600"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a68c383f54544fca19b5f2425be397600">json_object_new_object</a> (void)</td></tr>
+<tr class="separator:a68c383f54544fca19b5f2425be397600"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2caa52ae1863bd073444f3737138a4db"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structlh__table.html">lh_table</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a2caa52ae1863bd073444f3737138a4db">json_object_get_object</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr class="separator:a2caa52ae1863bd073444f3737138a4db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad59a0ad2ec914a5eef90af53acae06d9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ad59a0ad2ec914a5eef90af53acae06d9">json_object_object_length</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr class="separator:ad59a0ad2ec914a5eef90af53acae06d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27bd808a022251059a43f1f6370441cd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a27bd808a022251059a43f1f6370441cd">json_object_object_add</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, const char *key, struct <a class="el" href="structjson__object.html">json_object</a> *val)</td></tr>
+<tr class="separator:a27bd808a022251059a43f1f6370441cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57d3e444dd7db6b4510d21bf3716a002"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a57d3e444dd7db6b4510d21bf3716a002">json_object_object_add_ex</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, const char *const key, struct <a class="el" href="structjson__object.html">json_object</a> *const val, const unsigned opts)</td></tr>
+<tr class="separator:a57d3e444dd7db6b4510d21bf3716a002"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a097805abb53b4c8a60d573730a8939"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a1a097805abb53b4c8a60d573730a8939">json_object_object_get</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj, const char *key)</td></tr>
+<tr class="separator:a1a097805abb53b4c8a60d573730a8939"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a90d5f16d58636f01d2ed1a6030c7366a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> <a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a90d5f16d58636f01d2ed1a6030c7366a">json_object_object_get_ex</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj, const char *key, struct <a class="el" href="structjson__object.html">json_object</a> **value)</td></tr>
+<tr class="separator:a90d5f16d58636f01d2ed1a6030c7366a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6605fdafca20bd5d33c84f4f80a3bda"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ac6605fdafca20bd5d33c84f4f80a3bda">json_object_object_del</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, const char *key)</td></tr>
+<tr class="separator:ac6605fdafca20bd5d33c84f4f80a3bda"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84f7f8c0774c4600d958561d7548d649"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a84f7f8c0774c4600d958561d7548d649">json_object_new_array</a> (void)</td></tr>
+<tr class="separator:a84f7f8c0774c4600d958561d7548d649"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a23d20e3f886c1638a7116be66b7b5ec2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structarray__list.html">array_list</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a23d20e3f886c1638a7116be66b7b5ec2">json_object_get_array</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr class="separator:a23d20e3f886c1638a7116be66b7b5ec2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab9ea8f9c72d5adf83fdcbfe69f97fa44"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ab9ea8f9c72d5adf83fdcbfe69f97fa44">json_object_array_length</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr class="separator:ab9ea8f9c72d5adf83fdcbfe69f97fa44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5584e2f2051cd1faa7fafd07ba888fd1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a5584e2f2051cd1faa7fafd07ba888fd1">json_object_array_sort</a> (struct <a class="el" href="structjson__object.html">json_object</a> *jso, int(*sort_fn)(const void *, const void *))</td></tr>
+<tr class="separator:a5584e2f2051cd1faa7fafd07ba888fd1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aed353084ed3ad84e7b7575afbe7e719d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#aed353084ed3ad84e7b7575afbe7e719d">json_object_array_bsearch</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *key, const struct <a class="el" href="structjson__object.html">json_object</a> *jso, int(*sort_fn)(const void *, const void *))</td></tr>
+<tr class="separator:aed353084ed3ad84e7b7575afbe7e719d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a18cdd9a7455e09f36cdf6e5756b7f586"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a18cdd9a7455e09f36cdf6e5756b7f586">json_object_array_add</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, struct <a class="el" href="structjson__object.html">json_object</a> *val)</td></tr>
+<tr class="separator:a18cdd9a7455e09f36cdf6e5756b7f586"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ac0ccdbc13a25da7d8b2dc9e421dfad"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a1ac0ccdbc13a25da7d8b2dc9e421dfad">json_object_array_put_idx</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, size_t idx, struct <a class="el" href="structjson__object.html">json_object</a> *val)</td></tr>
+<tr class="separator:a1ac0ccdbc13a25da7d8b2dc9e421dfad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a676711a76545d4ec65cc75f100f5fd19"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a676711a76545d4ec65cc75f100f5fd19">json_object_array_get_idx</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj, size_t idx)</td></tr>
+<tr class="separator:a676711a76545d4ec65cc75f100f5fd19"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a722eca9f578704d3af38b97549242c1f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a722eca9f578704d3af38b97549242c1f">json_object_array_del_idx</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, size_t idx, size_t count)</td></tr>
+<tr class="separator:a722eca9f578704d3af38b97549242c1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e290acd80e72cca745f89fb4600fb78"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a2e290acd80e72cca745f89fb4600fb78">json_object_new_boolean</a> (<a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a> b)</td></tr>
+<tr class="separator:a2e290acd80e72cca745f89fb4600fb78"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac003fb99db7ecd674bb16d983d2f92ee"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> <a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ac003fb99db7ecd674bb16d983d2f92ee">json_object_get_boolean</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr class="separator:ac003fb99db7ecd674bb16d983d2f92ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a23863c1503f3a8dd8a460a6405da0a65"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a23863c1503f3a8dd8a460a6405da0a65">json_object_set_boolean</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, <a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a> new_value)</td></tr>
+<tr class="separator:a23863c1503f3a8dd8a460a6405da0a65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae92f0770fb4b3c884ce35de52d3d7de8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ae92f0770fb4b3c884ce35de52d3d7de8">json_object_new_int</a> (int32_t i)</td></tr>
+<tr class="separator:ae92f0770fb4b3c884ce35de52d3d7de8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7847f74494645c2b076505c37cc4cb93"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a7847f74494645c2b076505c37cc4cb93">json_object_new_int64</a> (int64_t i)</td></tr>
+<tr class="separator:a7847f74494645c2b076505c37cc4cb93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8c56dc58a02f92cd6789ba5dcb9fe7b1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a8c56dc58a02f92cd6789ba5dcb9fe7b1">json_object_get_int</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr class="separator:a8c56dc58a02f92cd6789ba5dcb9fe7b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ab3568f12e01fd2967e765a72456caa"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a4ab3568f12e01fd2967e765a72456caa">json_object_set_int</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, int new_value)</td></tr>
+<tr class="separator:a4ab3568f12e01fd2967e765a72456caa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25691322b2d1ab24a3797e5752eb659f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a25691322b2d1ab24a3797e5752eb659f">json_object_int_inc</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, int64_t val)</td></tr>
+<tr class="separator:a25691322b2d1ab24a3797e5752eb659f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a14750b3af4df18ec8dc93b090a8e8a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int64_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a1a14750b3af4df18ec8dc93b090a8e8a">json_object_get_int64</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr class="separator:a1a14750b3af4df18ec8dc93b090a8e8a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7d3948600dde732abed0e261264ef53a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a7d3948600dde732abed0e261264ef53a">json_object_set_int64</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, int64_t new_value)</td></tr>
+<tr class="separator:a7d3948600dde732abed0e261264ef53a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a594a093bafb9091f843da3197e0638aa"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a594a093bafb9091f843da3197e0638aa">json_object_new_double</a> (double d)</td></tr>
+<tr class="separator:a594a093bafb9091f843da3197e0638aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae49671c026fe1ada370a75321e4e65f6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ae49671c026fe1ada370a75321e4e65f6">json_object_new_double_s</a> (double d, const char *ds)</td></tr>
+<tr class="separator:ae49671c026fe1ada370a75321e4e65f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a865a9a3f897eb64a0354c21b972e8187"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a865a9a3f897eb64a0354c21b972e8187">json_c_set_serialization_double_format</a> (const char *double_format, int global_or_thread)</td></tr>
+<tr class="separator:a865a9a3f897eb64a0354c21b972e8187"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ada262c62364e3819b6a64b1e3a632336"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ada262c62364e3819b6a64b1e3a632336">json_object_double_to_json_string</a> (struct <a class="el" href="structjson__object.html">json_object</a> *jso, struct <a class="el" href="structprintbuf.html">printbuf</a> *pb, int level, int flags)</td></tr>
+<tr class="separator:ada262c62364e3819b6a64b1e3a632336"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a94a70cff6a14398b581b7b10b0792c5b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a94a70cff6a14398b581b7b10b0792c5b">json_object_get_double</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr class="separator:a94a70cff6a14398b581b7b10b0792c5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a7b7ce585565558cb69dad8d45d7757"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a3a7b7ce585565558cb69dad8d45d7757">json_object_set_double</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, double new_value)</td></tr>
+<tr class="separator:a3a7b7ce585565558cb69dad8d45d7757"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b7b5302b3903c9347eeb1f4a64d657b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a7b7b5302b3903c9347eeb1f4a64d657b">json_object_new_string</a> (const char *s)</td></tr>
+<tr class="separator:a7b7b5302b3903c9347eeb1f4a64d657b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a190e9bea8c39b257af69d392dd2ddffb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a190e9bea8c39b257af69d392dd2ddffb">json_object_new_string_len</a> (const char *s, int len)</td></tr>
+<tr class="separator:a190e9bea8c39b257af69d392dd2ddffb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ee29ca8d79896e15007131527f6002e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a9ee29ca8d79896e15007131527f6002e">json_object_get_string</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr class="separator:a9ee29ca8d79896e15007131527f6002e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1d1f95a27a5e5d93bb66a8adfc1a2f4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ac1d1f95a27a5e5d93bb66a8adfc1a2f4">json_object_get_string_len</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr class="separator:ac1d1f95a27a5e5d93bb66a8adfc1a2f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac35013e51cdc0651512801c947df431c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ac35013e51cdc0651512801c947df431c">json_object_set_string</a> (<a class="el" href="structjson__object.html">json_object</a> *obj, const char *new_value)</td></tr>
+<tr class="separator:ac35013e51cdc0651512801c947df431c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae48707a0c8689e14aaa3a9b831db27fc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ae48707a0c8689e14aaa3a9b831db27fc">json_object_set_string_len</a> (<a class="el" href="structjson__object.html">json_object</a> *obj, const char *new_value, int len)</td></tr>
+<tr class="separator:ae48707a0c8689e14aaa3a9b831db27fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a1d4640525e0217059868e312f20579"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a5a1d4640525e0217059868e312f20579">json_object_equal</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj1, struct <a class="el" href="structjson__object.html">json_object</a> *obj2)</td></tr>
+<tr class="separator:a5a1d4640525e0217059868e312f20579"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaac16505f13bc56accfad82604d8bcdc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#aaac16505f13bc56accfad82604d8bcdc">json_object_deep_copy</a> (struct <a class="el" href="structjson__object.html">json_object</a> *src, struct <a class="el" href="structjson__object.html">json_object</a> **dst, <a class="el" href="json__object_8h.html#acfbe0648eb909870e346df0bb42e81e1">json_c_shallow_copy_fn</a> *shallow_copy)</td></tr>
+<tr class="separator:aaac16505f13bc56accfad82604d8bcdc"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
 Variables</h2></td></tr>
-<tr class="memitem:a27427f89f2fc995639e366635fbe58ac"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a27427f89f2fc995639e366635fbe58ac">json_number_chars</a></td></tr>
-<tr class="separator:a27427f89f2fc995639e366635fbe58ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a20dbe4913551cefa6b4b0a77fd4397c4"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a20dbe4913551cefa6b4b0a77fd4397c4">json_hex_chars</a></td></tr>
-<tr class="separator:a20dbe4913551cefa6b4b0a77fd4397c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:adda8476609cc566ee62b80eaed310283"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a3032a61c0ba2d38563b1b765f54ea46f">json_object_delete_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#adda8476609cc566ee62b80eaed310283">json_object_free_userdata</a></td></tr>
+<tr class="memitem:adda8476609cc566ee62b80eaed310283"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a57e58c272b899b7034c3b5137935117f">json_object_delete_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#adda8476609cc566ee62b80eaed310283">json_object_free_userdata</a></td></tr>
 <tr class="separator:adda8476609cc566ee62b80eaed310283"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a8bc341281f4dd60b53b03b2dec0fae28"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a7806d0a6826ac08f6f8b09636207870e">json_object_to_json_string_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a8bc341281f4dd60b53b03b2dec0fae28">json_object_userdata_to_json_string</a></td></tr>
+<tr class="memitem:a8bc341281f4dd60b53b03b2dec0fae28"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#ad689953451ffa828830d349f4cd72563">json_object_to_json_string_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a8bc341281f4dd60b53b03b2dec0fae28">json_object_userdata_to_json_string</a></td></tr>
 <tr class="separator:a8bc341281f4dd60b53b03b2dec0fae28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad79dbd850536be7f59714b52bbd7ec30"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#acfbe0648eb909870e346df0bb42e81e1">json_c_shallow_copy_fn</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ad79dbd850536be7f59714b52bbd7ec30">json_c_shallow_copy_default</a></td></tr>
+<tr class="separator:ad79dbd850536be7f59714b52bbd7ec30"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
-<h2 class="groupheader">Macro Definition Documentation</h2>
-<a class="anchor" id="aa93f0eb578d23995850d61f7d61c55c1"></a>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Core json-c API. Start here, or with <a class="el" href="json__tokener_8h.html" title="Methods to parse an input string into a tree of json_object objects. ">json_tokener.h</a>. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aa93f0eb578d23995850d61f7d61c55c1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa93f0eb578d23995850d61f7d61c55c1">&#9670;&nbsp;</a></span>FALSE</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -216,7 +259,86 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a34f027c147babf69fc530d088f2b49b0"></a>
+<a id="a8cd01c484155ac99043a35b7c85ae411"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8cd01c484155ac99043a35b7c85ae411">&#9670;&nbsp;</a></span>JSON_C_OBJECT_ADD_KEY_IS_NEW</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_OBJECT_ADD_KEY_IS_NEW&#160;&#160;&#160;(1&lt;&lt;1)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A flag for the json_object_object_add_ex function which causes the value to be added without a check if it already exists. Note: it is the responsibilty of the caller to ensure that no key is added multiple times. If this is done, results are unpredictable. While this option is somewhat dangerous, it permits potentially large performance savings in code that knows for sure the key values are unique (e.g. because the code adds a well-known set of constant key values). </p>
+
+</div>
+</div>
+<a id="a134ffafc6116799a20134dc7646b5a37"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a134ffafc6116799a20134dc7646b5a37">&#9670;&nbsp;</a></span>JSON_C_OBJECT_KEY_IS_CONSTANT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_OBJECT_KEY_IS_CONSTANT&#160;&#160;&#160;(1&lt;&lt;2)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A flag for the json_object_object_add_ex function which flags the key as being constant memory. This means that the key will NOT be copied via strdup(), resulting in a potentially huge performance win (malloc, strdup and free are usually performance hogs). It is acceptable to use this flag for keys in non-constant memory blocks if the caller ensure that the memory holding the key lives longer than the corresponding json object. However, this is somewhat dangerous and should only be done if really justified. The general use-case for this flag is cases where the key is given as a real constant value in the function call, e.g. as in json_object_object_add_ex(obj, "ip", json, JSON_C_OBJECT_KEY_IS_CONSTANT); </p>
+
+</div>
+</div>
+<a id="a45837b8c6564f9e605f8a2bc76243750"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a45837b8c6564f9e605f8a2bc76243750">&#9670;&nbsp;</a></span>JSON_C_OPTION_GLOBAL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_OPTION_GLOBAL&#160;&#160;&#160;(0)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the global value of an option, which will apply to all current and future threads that have not set a thread-local value.</p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="json__object_8h.html#a865a9a3f897eb64a0354c21b972e8187">json_c_set_serialization_double_format</a> </dd></dl>
+
+</div>
+</div>
+<a id="a50d1490598fe476d7a53e204e02cdc9d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a50d1490598fe476d7a53e204e02cdc9d">&#9670;&nbsp;</a></span>JSON_C_OPTION_THREAD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_OPTION_THREAD&#160;&#160;&#160;(1)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set a thread-local value of an option, overriding the global value. This will fail if json-c is not compiled with threading enabled, and with the __thread specifier (or equivalent) available.</p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="json__object_8h.html#a865a9a3f897eb64a0354c21b972e8187">json_c_set_serialization_double_format</a> </dd></dl>
+
+</div>
+</div>
+<a id="a5c11d72c55f3ab7c088f19e7bf118163"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5c11d72c55f3ab7c088f19e7bf118163">&#9670;&nbsp;</a></span>JSON_C_TO_STRING_NOSLASHESCAPE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_TO_STRING_NOSLASHESCAPE&#160;&#160;&#160;(1&lt;&lt;4)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Don't escape forward slashes. </p>
+
+</div>
+</div>
+<a id="a34f027c147babf69fc530d088f2b49b0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a34f027c147babf69fc530d088f2b49b0">&#9670;&nbsp;</a></span>JSON_C_TO_STRING_NOZERO</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -229,7 +351,9 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a3294cb92765cdeb497cfd346644d1059"></a>
+<a id="a3294cb92765cdeb497cfd346644d1059"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3294cb92765cdeb497cfd346644d1059">&#9670;&nbsp;</a></span>JSON_C_TO_STRING_PLAIN</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -238,11 +362,13 @@ Variables</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>A flag for the <a class="el" href="json__object_8h.html#a84421dab94ccad42e901e534c6d7b658">json_object_to_json_string_ext()</a> and <a class="el" href="json__util_8h.html#a4e980954930951bf790c1ec3ba68fb76">json_object_to_file_ext()</a> functions which causes the output to have no extra whitespace or formatting applied. </p>
+<p>A flag for the <a class="el" href="json__object_8h.html#a9db613127bd4ef7db42307e43a85fc1b">json_object_to_json_string_ext()</a> and <a class="el" href="json__util_8h.html#a4e980954930951bf790c1ec3ba68fb76">json_object_to_file_ext()</a> functions which causes the output to have no extra whitespace or formatting applied. </p>
 
 </div>
 </div>
-<a class="anchor" id="a2025bc677c35f130e117dfda5bf1ef73"></a>
+<a id="a2025bc677c35f130e117dfda5bf1ef73"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2025bc677c35f130e117dfda5bf1ef73">&#9670;&nbsp;</a></span>JSON_C_TO_STRING_PRETTY</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -251,12 +377,30 @@ Variables</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>A flag for the <a class="el" href="json__object_8h.html#a84421dab94ccad42e901e534c6d7b658">json_object_to_json_string_ext()</a> and <a class="el" href="json__util_8h.html#a4e980954930951bf790c1ec3ba68fb76">json_object_to_file_ext()</a> functions which causes the output to be formatted.</p>
+<p>A flag for the <a class="el" href="json__object_8h.html#a9db613127bd4ef7db42307e43a85fc1b">json_object_to_json_string_ext()</a> and <a class="el" href="json__util_8h.html#a4e980954930951bf790c1ec3ba68fb76">json_object_to_file_ext()</a> functions which causes the output to be formatted.</p>
 <p>See the "Two Space Tab" option at <a href="http://jsonformatter.curiousconcept.com/">http://jsonformatter.curiousconcept.com/</a> for an example of the format. </p>
 
 </div>
 </div>
-<a class="anchor" id="aa821746c8668e6ad62bed90ec9e00103"></a>
+<a id="afc1486af21f6b1653c6f523025bdfd3b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afc1486af21f6b1653c6f523025bdfd3b">&#9670;&nbsp;</a></span>JSON_C_TO_STRING_PRETTY_TAB</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_TO_STRING_PRETTY_TAB&#160;&#160;&#160;(1&lt;&lt;3)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A flag for the <a class="el" href="json__object_8h.html#a9db613127bd4ef7db42307e43a85fc1b">json_object_to_json_string_ext()</a> and <a class="el" href="json__util_8h.html#a4e980954930951bf790c1ec3ba68fb76">json_object_to_file_ext()</a> functions which causes the output to be formatted.</p>
+<p>Instead of a "Two Space Tab" this gives a single tab character. </p>
+
+</div>
+</div>
+<a id="aa821746c8668e6ad62bed90ec9e00103"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa821746c8668e6ad62bed90ec9e00103">&#9670;&nbsp;</a></span>JSON_C_TO_STRING_SPACED</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -265,11 +409,27 @@ Variables</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>A flag for the <a class="el" href="json__object_8h.html#a84421dab94ccad42e901e534c6d7b658">json_object_to_json_string_ext()</a> and <a class="el" href="json__util_8h.html#a4e980954930951bf790c1ec3ba68fb76">json_object_to_file_ext()</a> functions which causes the output to have minimal whitespace inserted to make things slightly more readable. </p>
+<p>A flag for the <a class="el" href="json__object_8h.html#a9db613127bd4ef7db42307e43a85fc1b">json_object_to_json_string_ext()</a> and <a class="el" href="json__util_8h.html#a4e980954930951bf790c1ec3ba68fb76">json_object_to_file_ext()</a> functions which causes the output to have minimal whitespace inserted to make things slightly more readable. </p>
+
+</div>
+</div>
+<a id="a2a31d5c00f3a4712f2d5d62aee66344e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2a31d5c00f3a4712f2d5d62aee66344e">&#9670;&nbsp;</a></span>JSON_EXPORT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_EXPORT&#160;&#160;&#160;extern</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
 
 </div>
 </div>
-<a class="anchor" id="a268a63dd1b2e6d81559e268a4529e9bf"></a>
+<a id="a268a63dd1b2e6d81559e268a4529e9bf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a268a63dd1b2e6d81559e268a4529e9bf">&#9670;&nbsp;</a></span>JSON_OBJECT_DEF_HASH_ENTRIES</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -281,7 +441,9 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="acf5f514a9e0061c10fc08055762639ee"></a>
+<a id="acf5f514a9e0061c10fc08055762639ee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acf5f514a9e0061c10fc08055762639ee">&#9670;&nbsp;</a></span>json_object_object_foreach</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -310,20 +472,11 @@ Variables</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<b>Value:</b><div class="fragment"><div class="line"><span class="keywordtype">char</span> *key;\</div>
-<div class="line">        struct <a class="code" href="structjson__object.html">json_object</a> *val; \</div>
-<div class="line">        struct <a class="code" href="structlh__entry.html">lh_entry</a> *entry ## key; \</div>
-<div class="line">        struct <a class="code" href="structlh__entry.html">lh_entry</a> *entry_next ## key = NULL; \</div>
-<div class="line">        for(entry ## key = <a class="code" href="json__object_8h.html#a9840421d6b45a7d00a42e13e379b54b5">json_object_get_object</a>(obj)-&gt;head; \</div>
-<div class="line">                (entry ## key ? ( \</div>
-<div class="line">                        key = (<span class="keywordtype">char</span>*)entry ## key-&gt;k, \</div>
-<div class="line">                        val = (<span class="keyword">struct</span> <a class="code" href="structjson__object.html">json_object</a>*)entry ## key-&gt;v, \</div>
-<div class="line">                        entry_next ## key = entry ## key-&gt;next, \</div>
-<div class="line">                        entry ## key) : 0); \</div>
-<div class="line">                entry ## key = entry_next ## key)</div>
-<div class="ttc" id="json__object_8h_html_a9840421d6b45a7d00a42e13e379b54b5"><div class="ttname"><a href="json__object_8h.html#a9840421d6b45a7d00a42e13e379b54b5">json_object_get_object</a></div><div class="ttdeci">struct lh_table * json_object_get_object(struct json_object *obj)</div></div>
-<div class="ttc" id="structlh__entry_html"><div class="ttname"><a href="structlh__entry.html">lh_entry</a></div><div class="ttdef"><b>Definition:</b> linkhash.h:62</div></div>
-<div class="ttc" id="structjson__object_html"><div class="ttname"><a href="structjson__object.html">json_object</a></div><div class="ttdef"><b>Definition:</b> json_object_private.h:21</div></div>
+<b>Value:</b><div class="fragment"><div class="line"><span class="keywordtype">char</span> *key;\</div><div class="line">        struct <a class="code" href="structjson__object.html">json_object</a> *val; \</div><div class="line">        struct <a class="code" href="structlh__entry.html">lh_entry</a> *entry ## key; \</div><div class="line">        struct <a class="code" href="structlh__entry.html">lh_entry</a> *entry_next ## key = NULL; \</div><div class="line">        for(entry ## key = <a class="code" href="json__object_8h.html#a2caa52ae1863bd073444f3737138a4db">json_object_get_object</a>(obj)-&gt;head; \</div><div class="line">                (entry ## key ? ( \</div><div class="line">                        key = (<span class="keywordtype">char</span>*)<a class="code" href="linkhash_8h.html#a7579ce28b8366fc9b8656f14270aa3aa">lh_entry_k</a>(entry ## key), \</div><div class="line">                        val = (<span class="keyword">struct </span><a class="code" href="structjson__object.html">json_object</a>*)<a class="code" href="linkhash_8h.html#a0d4052ccfd8c5d351a9c1d3ba07671b3">lh_entry_v</a>(entry ## key), \</div><div class="line">                        entry_next ## key = entry ## key-&gt;next, \</div><div class="line">                        entry ## key) : 0); \</div><div class="line">                entry ## key = entry_next ## key)</div><div class="ttc" id="linkhash_8h_html_a7579ce28b8366fc9b8656f14270aa3aa"><div class="ttname"><a href="linkhash_8h.html#a7579ce28b8366fc9b8656f14270aa3aa">lh_entry_k</a></div><div class="ttdeci">#define lh_entry_k(entry)</div><div class="ttdef"><b>Definition:</b> linkhash.h:392</div></div>
+<div class="ttc" id="linkhash_8h_html_a0d4052ccfd8c5d351a9c1d3ba07671b3"><div class="ttname"><a href="linkhash_8h.html#a0d4052ccfd8c5d351a9c1d3ba07671b3">lh_entry_v</a></div><div class="ttdeci">#define lh_entry_v(entry)</div><div class="ttdef"><b>Definition:</b> linkhash.h:400</div></div>
+<div class="ttc" id="json__object_8h_html_a2caa52ae1863bd073444f3737138a4db"><div class="ttname"><a href="json__object_8h.html#a2caa52ae1863bd073444f3737138a4db">json_object_get_object</a></div><div class="ttdeci">JSON_EXPORT struct lh_table * json_object_get_object(const struct json_object *obj)</div></div>
+<div class="ttc" id="structlh__entry_html"><div class="ttname"><a href="structlh__entry.html">lh_entry</a></div><div class="ttdef"><b>Definition:</b> linkhash.h:85</div></div>
+<div class="ttc" id="structjson__object_html"><div class="ttname"><a href="structjson__object.html">json_object</a></div><div class="ttdef"><b>Definition:</b> json_object_private.h:27</div></div>
 </div><!-- fragment --><p>Iterate through all keys and values of an object.</p>
 <p>Adding keys to the object while iterating is NOT allowed.</p>
 <p>Deleting an existing key, or replacing an existing key with a new value IS allowed.</p>
@@ -338,7 +491,9 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a71f07006c12d78f7bbf4cb716a5af3a6"></a>
+<a id="a71f07006c12d78f7bbf4cb716a5af3a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a71f07006c12d78f7bbf4cb716a5af3a6">&#9670;&nbsp;</a></span>json_object_object_foreachC</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -357,21 +512,27 @@ Variables</h2></td></tr>
         <tr>
           <td></td>
           <td>)</td>
-          <td></td><td>&#160;&#160;&#160;for(iter.entry = <a class="el" href="json__object_8h.html#a9840421d6b45a7d00a42e13e379b54b5">json_object_get_object</a>(obj)-&gt;head; (iter.entry ? (iter.key = (char*)iter.entry-&gt;k, iter.val = (struct <a class="el" href="structjson__object.html">json_object</a>*)iter.entry-&gt;v, iter.entry) : 0); iter.entry = iter.entry-&gt;next)</td>
+          <td></td><td></td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Iterate through all keys and values of an object (ANSI C Safe) </p><dl class="params"><dt>Parameters</dt><dd>
+<b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">for</span>(iter.entry = <a class="code" href="json__object_8h.html#a2caa52ae1863bd073444f3737138a4db">json_object_get_object</a>(obj)-&gt;head; \</div><div class="line">     (iter.entry ? (iter.key = (<span class="keywordtype">char</span>*)<a class="code" href="linkhash_8h.html#a7579ce28b8366fc9b8656f14270aa3aa">lh_entry_k</a>(iter.entry), iter.val = (<span class="keyword">struct </span><a class="code" href="structjson__object.html">json_object</a>*)<a class="code" href="linkhash_8h.html#a0d4052ccfd8c5d351a9c1d3ba07671b3">lh_entry_v</a>(iter.entry), iter.entry) : 0); \</div><div class="line">     iter.entry = iter.entry-&gt;next)</div><div class="ttc" id="linkhash_8h_html_a7579ce28b8366fc9b8656f14270aa3aa"><div class="ttname"><a href="linkhash_8h.html#a7579ce28b8366fc9b8656f14270aa3aa">lh_entry_k</a></div><div class="ttdeci">#define lh_entry_k(entry)</div><div class="ttdef"><b>Definition:</b> linkhash.h:392</div></div>
+<div class="ttc" id="linkhash_8h_html_a0d4052ccfd8c5d351a9c1d3ba07671b3"><div class="ttname"><a href="linkhash_8h.html#a0d4052ccfd8c5d351a9c1d3ba07671b3">lh_entry_v</a></div><div class="ttdeci">#define lh_entry_v(entry)</div><div class="ttdef"><b>Definition:</b> linkhash.h:400</div></div>
+<div class="ttc" id="json__object_8h_html_a2caa52ae1863bd073444f3737138a4db"><div class="ttname"><a href="json__object_8h.html#a2caa52ae1863bd073444f3737138a4db">json_object_get_object</a></div><div class="ttdeci">JSON_EXPORT struct lh_table * json_object_get_object(const struct json_object *obj)</div></div>
+<div class="ttc" id="structjson__object_html"><div class="ttname"><a href="structjson__object.html">json_object</a></div><div class="ttdef"><b>Definition:</b> json_object_private.h:27</div></div>
+</div><!-- fragment --><p>Iterate through all keys and values of an object (ANSI C Safe) </p><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
-    <tr><td class="paramname">iter</td><td>the object iterator </td></tr>
+    <tr><td class="paramname">iter</td><td>the object iterator, use type <a class="el" href="structjson__object__iter.html">json_object_iter</a> </td></tr>
   </table>
   </dd>
 </dl>
 
 </div>
 </div>
-<a class="anchor" id="a84fa70b86686ce202058f63905c90078"></a>
+<a id="a84fa70b86686ce202058f63905c90078"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84fa70b86686ce202058f63905c90078">&#9670;&nbsp;</a></span>THIS_FUNCTION_IS_DEPRECATED</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -387,7 +548,9 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="aa8cecfc5c5c054d2875c03e77b7be15d"></a>
+<a id="aa8cecfc5c5c054d2875c03e77b7be15d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa8cecfc5c5c054d2875c03e77b7be15d">&#9670;&nbsp;</a></span>TRUE</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -400,31 +563,41 @@ Variables</h2></td></tr>
 </div>
 </div>
 <h2 class="groupheader">Typedef Documentation</h2>
-<a class="anchor" id="a6d6d32d8b026ea2025df519b9e90f44a"></a>
+<a id="a81f02022906fafc71eb9197049f07f73"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a81f02022906fafc71eb9197049f07f73">&#9670;&nbsp;</a></span>json_bool</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef struct <a class="el" href="structarray__list.html">array_list</a> <a class="el" href="structarray__list.html">array_list</a></td>
+          <td class="memname">typedef int <a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a></td>
         </tr>
       </table>
 </div><div class="memdoc">
 
 </div>
 </div>
-<a class="anchor" id="a81f02022906fafc71eb9197049f07f73"></a>
+<a id="acfbe0648eb909870e346df0bb42e81e1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acfbe0648eb909870e346df0bb42e81e1">&#9670;&nbsp;</a></span>json_c_shallow_copy_fn</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef int <a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a></td>
+          <td class="memname">typedef int() json_c_shallow_copy_fn(<a class="el" href="structjson__object.html">json_object</a> *src, <a class="el" href="structjson__object.html">json_object</a> *parent, const char *key, size_t index, <a class="el" href="structjson__object.html">json_object</a> **dst)</td>
         </tr>
       </table>
 </div><div class="memdoc">
+<p>Perform a shallow copy of src into *dst as part of an overall <a class="el" href="json__object_8h.html#aaac16505f13bc56accfad82604d8bcdc">json_object_deep_copy()</a>.</p>
+<p>If src is part of a containing object or array, parent will be non-NULL, and key or index will be provided. When shallow_copy is called *dst will be NULL, and must be non-NULL when it returns. src will never be NULL.</p>
+<p>If shallow_copy sets the serializer on an object, return 2 to indicate to json_object_deep_copy that it should not attempt to use the standard userdata copy function.</p>
+<dl class="section return"><dt>Returns</dt><dd>On success 1 or 2, -1 on errors </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="af27907ced0f5a43409ad96430fe0f914"></a>
+<a id="af27907ced0f5a43409ad96430fe0f914"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af27907ced0f5a43409ad96430fe0f914">&#9670;&nbsp;</a></span>json_object</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -434,14 +607,18 @@ Variables</h2></td></tr>
       </table>
 </div><div class="memdoc">
 
+<p>The core type for all type of JSON objects handled by json-c. </p>
+
 </div>
 </div>
-<a class="anchor" id="a3032a61c0ba2d38563b1b765f54ea46f"></a>
+<a id="a57e58c272b899b7034c3b5137935117f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57e58c272b899b7034c3b5137935117f">&#9670;&nbsp;</a></span>json_object_delete_fn</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef void( json_object_delete_fn) (struct <a class="el" href="structjson__object.html">json_object</a> *jso, void *userdata)</td>
+          <td class="memname">typedef void() json_object_delete_fn(struct <a class="el" href="structjson__object.html">json_object</a> *jso, void *userdata)</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -449,7 +626,9 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="af88126730e765f2068968f4b16fd074f"></a>
+<a id="af88126730e765f2068968f4b16fd074f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af88126730e765f2068968f4b16fd074f">&#9670;&nbsp;</a></span>json_object_iter</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -461,12 +640,14 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a7806d0a6826ac08f6f8b09636207870e"></a>
+<a id="ad689953451ffa828830d349f4cd72563"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad689953451ffa828830d349f4cd72563">&#9670;&nbsp;</a></span>json_object_to_json_string_fn</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef int( json_object_to_json_string_fn) (struct <a class="el" href="structjson__object.html">json_object</a> *jso, struct <a class="el" href="structprintbuf.html">printbuf</a> *pb, int level, int flags)</td>
+          <td class="memname">typedef int() json_object_to_json_string_fn(struct <a class="el" href="structjson__object.html">json_object</a> *jso, struct <a class="el" href="structprintbuf.html">printbuf</a> *pb, int level, int flags)</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -474,90 +655,167 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a4dd5e5b65aee7f376f529f86b210ff49"></a>
+<a id="aba5eff84f8638d22f50403175f270c96"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aba5eff84f8638d22f50403175f270c96">&#9670;&nbsp;</a></span>json_type</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef struct <a class="el" href="structjson__tokener.html">json_tokener</a> <a class="el" href="structjson__tokener.html">json_tokener</a></td>
+          <td class="memname">typedef enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a>  <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a></td>
         </tr>
       </table>
 </div><div class="memdoc">
 
 </div>
 </div>
-<a class="anchor" id="aba5eff84f8638d22f50403175f270c96"></a>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a id="ac75c61993722a9b8aaa44704072ec06c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac75c61993722a9b8aaa44704072ec06c">&#9670;&nbsp;</a></span>json_type</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a>  <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a></td>
+          <td class="memname">enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a></td>
         </tr>
       </table>
 </div><div class="memdoc">
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ac75c61993722a9b8aaa44704072ec06ca127e62d156e13517471fcde3378979c1"></a>json_type_null&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="ac75c61993722a9b8aaa44704072ec06ca5d15299e90dbb9935ff6d3e2c22a285c"></a>json_type_boolean&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="ac75c61993722a9b8aaa44704072ec06cac6ac2d9a16577d00210fea64d16b47cd"></a>json_type_double&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="ac75c61993722a9b8aaa44704072ec06ca7bf325c213b43c5f970ae2d4443ab956"></a>json_type_int&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="ac75c61993722a9b8aaa44704072ec06cac966c8008f0b2c07da59ee8a60ad440f"></a>json_type_object&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="ac75c61993722a9b8aaa44704072ec06cae536c8c9da4648e6b9348abddde6113c"></a>json_type_array&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="ac75c61993722a9b8aaa44704072ec06cac9f56e57c09245522d764015a054faa6"></a>json_type_string&#160;</td><td class="fielddoc"></td></tr>
+</table>
 
 </div>
 </div>
-<a class="anchor" id="a766e90057496fc6712d6be0da180a21f"></a>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a865a9a3f897eb64a0354c21b972e8187"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a865a9a3f897eb64a0354c21b972e8187">&#9670;&nbsp;</a></span>json_c_set_serialization_double_format()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef struct <a class="el" href="structlh__table.html">lh_table</a> <a class="el" href="structlh__table.html">lh_table</a></td>
+          <td class="memname">int json_c_set_serialization_double_format </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>double_format</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>global_or_thread</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
         </tr>
       </table>
 </div><div class="memdoc">
+<p>Set a global or thread-local json-c option, depending on whether JSON_C_OPTION_GLOBAL or JSON_C_OPTION_THREAD is passed. Thread-local options default to undefined, and inherit from the global value, even if the global value is changed after the thread is created. Attempting to set thread-local options when threading is not compiled in will result in an error. Be sure to check the return value.</p>
+<p>double_format is a "%g" printf format, such as "%.20g"</p>
+<dl class="section return"><dt>Returns</dt><dd>-1 on errors, 0 on success. </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="ace274df280df67463ff417b1b3392395"></a>
+<a id="a18cdd9a7455e09f36cdf6e5756b7f586"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a18cdd9a7455e09f36cdf6e5756b7f586">&#9670;&nbsp;</a></span>json_object_array_add()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef struct <a class="el" href="structprintbuf.html">printbuf</a> <a class="el" href="structprintbuf.html">printbuf</a></td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_array_add </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>val</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
         </tr>
       </table>
 </div><div class="memdoc">
+<p>Add an element to the end of a <a class="el" href="structjson__object.html">json_object</a> of type json_type_array</p>
+<p>The reference count will <em>not</em> 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</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td class="paramname">val</td><td>the <a class="el" href="structjson__object.html">json_object</a> to be added </td></tr>
+  </table>
+  </dd>
+</dl>
 
 </div>
 </div>
-<h2 class="groupheader">Enumeration Type Documentation</h2>
-<a class="anchor" id="ac75c61993722a9b8aaa44704072ec06c"></a>
+<a id="aed353084ed3ad84e7b7575afbe7e719d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aed353084ed3ad84e7b7575afbe7e719d">&#9670;&nbsp;</a></span>json_object_array_bsearch()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a></td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_object_array_bsearch </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>key</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>jso</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int(*)(const void *, const void *)&#160;</td>
+          <td class="paramname"><em>sort_fn</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
         </tr>
       </table>
 </div><div class="memdoc">
-<table class="fieldtable">
-<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="ac75c61993722a9b8aaa44704072ec06ca127e62d156e13517471fcde3378979c1"></a>json_type_null&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="ac75c61993722a9b8aaa44704072ec06ca5d15299e90dbb9935ff6d3e2c22a285c"></a>json_type_boolean&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="ac75c61993722a9b8aaa44704072ec06cac6ac2d9a16577d00210fea64d16b47cd"></a>json_type_double&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="ac75c61993722a9b8aaa44704072ec06ca7bf325c213b43c5f970ae2d4443ab956"></a>json_type_int&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="ac75c61993722a9b8aaa44704072ec06cac966c8008f0b2c07da59ee8a60ad440f"></a>json_type_object&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="ac75c61993722a9b8aaa44704072ec06cae536c8c9da4648e6b9348abddde6113c"></a>json_type_array&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="ac75c61993722a9b8aaa44704072ec06cac9f56e57c09245522d764015a054faa6"></a>json_type_string&#160;</td><td class="fielddoc">
-</td></tr>
-</table>
+<p>Binary search a sorted array for a specified key object.</p>
+<p>It depends on your compare function what's sufficient as a key. Usually you create some dummy object with the parameter compared in it, to identify the right item you're actually looking for.</p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="json__object_8h.html#a5584e2f2051cd1faa7fafd07ba888fd1">json_object_array_sort()</a> for hints on the compare function.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">key</td><td>a dummy <a class="el" href="structjson__object.html">json_object</a> with the right key </td></tr>
+    <tr><td class="paramname">jso</td><td>the array object we're searching </td></tr>
+    <tr><td class="paramname">sort_fn</td><td>the sort/compare function</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the wanted <a class="el" href="structjson__object.html">json_object</a> instance </dd></dl>
 
 </div>
 </div>
-<h2 class="groupheader">Function Documentation</h2>
-<a class="anchor" id="acc89c0f58947d499e2868ac8b62bed49"></a>
+<a id="a722eca9f578704d3af38b97549242c1f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a722eca9f578704d3af38b97549242c1f">&#9670;&nbsp;</a></span>json_object_array_del_idx()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int json_object_array_add </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_array_del_idx </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em>, </td>
@@ -565,8 +823,14 @@ Variables</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
-          <td class="paramname"><em>val</em>&#160;</td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>idx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>count</em>&#160;</td>
         </tr>
         <tr>
           <td></td>
@@ -575,32 +839,36 @@ Variables</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Add an element to the end of a <a class="el" href="structjson__object.html">json_object</a> of type json_type_array</p>
-<p>The reference count will <em>not</em> 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</p>
+<p>Delete an elements from a specified index in an array (a <a class="el" href="structjson__object.html">json_object</a> of type json_type_array)</p>
+<p>The reference count will be decremented for each of the deleted objects. If there are no more owners of an element that is being deleted, then the value is freed. Otherwise, the reference to the value will remain in memory.</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
-    <tr><td class="paramname">val</td><td>the <a class="el" href="structjson__object.html">json_object</a> to be added </td></tr>
+    <tr><td class="paramname">idx</td><td>the index to start deleting elements at </td></tr>
+    <tr><td class="paramname">count</td><td>the number of elements to delete </td></tr>
   </table>
   </dd>
 </dl>
+<dl class="section return"><dt>Returns</dt><dd>0 if the elements were successfully deleted </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="a5c9120a6d644ea12a61e2ec8520130c6"></a>
+<a id="a676711a76545d4ec65cc75f100f5fd19"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a676711a76545d4ec65cc75f100f5fd19">&#9670;&nbsp;</a></span>json_object_array_get_idx()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_object_array_get_idx </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_object_array_get_idx </td>
           <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">int&#160;</td>
+          <td class="paramtype">size_t&#160;</td>
           <td class="paramname"><em>idx</em>&#160;</td>
         </tr>
         <tr>
@@ -621,14 +889,16 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a2e62d4b19de8f297595f3b4aaa0ec453"></a>
+<a id="ab9ea8f9c72d5adf83fdcbfe69f97fa44"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab9ea8f9c72d5adf83fdcbfe69f97fa44">&#9670;&nbsp;</a></span>json_object_array_length()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int json_object_array_length </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> size_t json_object_array_length </td>
           <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em></td><td>)</td>
           <td></td>
         </tr>
@@ -644,12 +914,14 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a2d19d21b495e1e0d3f711093d97a5104"></a>
+<a id="a1ac0ccdbc13a25da7d8b2dc9e421dfad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1ac0ccdbc13a25da7d8b2dc9e421dfad">&#9670;&nbsp;</a></span>json_object_array_put_idx()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int json_object_array_put_idx </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_array_put_idx </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em>, </td>
@@ -657,7 +929,7 @@ Variables</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">int&#160;</td>
+          <td class="paramtype">size_t&#160;</td>
           <td class="paramname"><em>idx</em>, </td>
         </tr>
         <tr>
@@ -688,12 +960,14 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="aa1b05eeaa9c92f079facece87d6a0149"></a>
+<a id="a5584e2f2051cd1faa7fafd07ba888fd1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5584e2f2051cd1faa7fafd07ba888fd1">&#9670;&nbsp;</a></span>json_object_array_sort()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void json_object_array_sort </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void json_object_array_sort </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>jso</em>, </td>
@@ -712,10 +986,10 @@ Variables</h2></td></tr>
       </table>
 </div><div class="memdoc">
 <p>Sorts the elements of jso of type json_type_array</p>
-<p>Pointers to the <a class="el" href="structjson__object.html">json_object</a> pointers will be passed as the two arguments to </p>
+<p>Pointers to the <a class="el" href="structjson__object.html">json_object</a> pointers will be passed as the two arguments to sort_fn</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td class="paramname">jso</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
     <tr><td class="paramname">sort_fn</td><td>a sorting function </td></tr>
   </table>
   </dd>
@@ -723,67 +997,213 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="acc3628d97c6308dc967006e4268c4e7f"></a>
+<a id="aaac16505f13bc56accfad82604d8bcdc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaac16505f13bc56accfad82604d8bcdc">&#9670;&nbsp;</a></span>json_object_deep_copy()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_object_get </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_deep_copy </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
-          <td class="paramname"><em>obj</em></td><td>)</td>
+          <td class="paramname"><em>src</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> **&#160;</td>
+          <td class="paramname"><em>dst</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="json__object_8h.html#acfbe0648eb909870e346df0bb42e81e1">json_c_shallow_copy_fn</a> *&#160;</td>
+          <td class="paramname"><em>shallow_copy</em>&#160;</td>
+        </tr>
+        <tr>
           <td></td>
+          <td>)</td>
+          <td></td><td></td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Increment the reference count of <a class="el" href="structjson__object.html">json_object</a>, thereby grabbing shared ownership of obj.</p>
+<p>Copy the contents of the JSON object. The destination object must be initialized to NULL, to make sure this function won't overwrite an existing JSON object.</p>
+<p>This does roughly the same thing as <code>json_tokener_parse(json_object_get_string(src))</code>.</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td class="paramname">src</td><td>source JSON object whose contents will be copied </td></tr>
+    <tr><td class="paramname">dst</td><td>pointer to the destination object where the contents of <code>src</code>; make sure this pointer is initialized to NULL </td></tr>
+    <tr><td class="paramname">shallow_copy</td><td>an optional function to copy individual objects, needed when custom serializers are in use. See also <a class="el" href="structjson__object.html">json_object</a> set_serializer.</td></tr>
   </table>
   </dd>
 </dl>
+<dl class="section return"><dt>Returns</dt><dd>0 if the copy went well, -1 if an error occured during copy or if the destination pointer is non-NULL </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="aba4e8df5e00bdc91a89bfb775e04ed70"></a>
+<a id="ada262c62364e3819b6a64b1e3a632336"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ada262c62364e3819b6a64b1e3a632336">&#9670;&nbsp;</a></span>json_object_double_to_json_string()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structarray__list.html">array_list</a>* json_object_get_array </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_double_to_json_string </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
-          <td class="paramname"><em>obj</em></td><td>)</td>
+          <td class="paramname"><em>jso</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structprintbuf.html">printbuf</a> *&#160;</td>
+          <td class="paramname"><em>pb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
           <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>level</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>flags</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Get the arraylist of a <a class="el" href="structjson__object.html">json_object</a> of type json_type_array </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Serialize a <a class="el" href="structjson__object.html">json_object</a> of type json_type_double to a string.</p>
+<p>This function isn't meant to be called directly. Instead, you can set a custom format string for the serialization of this double using the following call (where "%.17g" actually is the default):</p>
+<div class="fragment"><div class="line">jso = <a class="code" href="json__object_8h.html#a594a093bafb9091f843da3197e0638aa">json_object_new_double</a>(d);</div><div class="line"><a class="code" href="json__object_8h.html#a889345512a214b8f78f6a73561523c7c">json_object_set_serializer</a>(jso, <a class="code" href="json__object_8h.html#ada262c62364e3819b6a64b1e3a632336">json_object_double_to_json_string</a>,</div><div class="line">    <span class="stringliteral">&quot;%.17g&quot;</span>, NULL);</div></div><!-- fragment --><dl class="section see"><dt>See also</dt><dd>printf(3) man page for format strings</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td class="paramname">jso</td><td>The json_type_double object that is serialized. </td></tr>
+    <tr><td class="paramname">pb</td><td>The destination buffer. </td></tr>
+    <tr><td class="paramname">level</td><td>Ignored. </td></tr>
+    <tr><td class="paramname">flags</td><td>Ignored. </td></tr>
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>an arraylist </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="a3be3153ae5158ed24a49d74fbf14149f"></a>
+<a id="a5a1d4640525e0217059868e312f20579"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5a1d4640525e0217059868e312f20579">&#9670;&nbsp;</a></span>json_object_equal()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a> json_object_get_boolean </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_equal </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
-          <td class="paramname"><em>obj</em></td><td>)</td>
+          <td class="paramname"><em>obj1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
           <td></td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj2</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Get the json_bool value of a <a class="el" href="structjson__object.html">json_object</a></p>
-<p>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.</p>
+<p>Check if two <a class="el" href="structjson__object.html">json_object</a>'s are equal</p>
+<p>If the passed objects are equal 1 will be returned. Equality is defined as follows:</p><ul>
+<li>json_objects of different types are never equal</li>
+<li>json_objects of the same primitive type are equal if the c-representation of their value is equal</li>
+<li>json-arrays are considered equal if all values at the same indices are equal (same order)</li>
+<li>Complex json_objects are considered equal if all contained objects referenced by their key are equal, regardless their order.</li>
+</ul>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj1</td><td>the first <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td class="paramname">obj2</td><td>the second <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>whether both objects are equal or not </dd></dl>
+
+</div>
+</div>
+<a id="a675aa3a9cced685dbfd1c1a770a0c3e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a675aa3a9cced685dbfd1c1a770a0c3e4">&#9670;&nbsp;</a></span>json_object_get()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_object_get </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Increment the reference count of <a class="el" href="structjson__object.html">json_object</a>, thereby grabbing shared ownership of obj.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a23d20e3f886c1638a7116be66b7b5ec2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a23d20e3f886c1638a7116be66b7b5ec2">&#9670;&nbsp;</a></span>json_object_get_array()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structarray__list.html">array_list</a>* json_object_get_array </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get the arraylist of a <a class="el" href="structjson__object.html">json_object</a> of type json_type_array </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>an arraylist </dd></dl>
+
+</div>
+</div>
+<a id="ac003fb99db7ecd674bb16d983d2f92ee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac003fb99db7ecd674bb16d983d2f92ee">&#9670;&nbsp;</a></span>json_object_get_boolean()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> <a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a> json_object_get_boolean </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get the json_bool value of a <a class="el" href="structjson__object.html">json_object</a></p>
+<p>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.</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
@@ -794,14 +1214,16 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a9cf586fba906a597a121423045cb2a45"></a>
+<a id="a94a70cff6a14398b581b7b10b0792c5b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a94a70cff6a14398b581b7b10b0792c5b">&#9670;&nbsp;</a></span>json_object_get_double()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">double json_object_get_double </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> double json_object_get_double </td>
           <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em></td><td>)</td>
           <td></td>
         </tr>
@@ -822,14 +1244,16 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ae6cab7d4c7c707b9053035a6405d3891"></a>
+<a id="a8c56dc58a02f92cd6789ba5dcb9fe7b1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8c56dc58a02f92cd6789ba5dcb9fe7b1">&#9670;&nbsp;</a></span>json_object_get_int()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int32_t json_object_get_int </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int32_t json_object_get_int </td>
           <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em></td><td>)</td>
           <td></td>
         </tr>
@@ -848,14 +1272,16 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a3493894ebd226249118582e640af6944"></a>
+<a id="a1a14750b3af4df18ec8dc93b090a8e8a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1a14750b3af4df18ec8dc93b090a8e8a">&#9670;&nbsp;</a></span>json_object_get_int64()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int64_t json_object_get_int64 </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int64_t json_object_get_int64 </td>
           <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em></td><td>)</td>
           <td></td>
         </tr>
@@ -874,14 +1300,16 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a9840421d6b45a7d00a42e13e379b54b5"></a>
+<a id="a2caa52ae1863bd073444f3737138a4db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2caa52ae1863bd073444f3737138a4db">&#9670;&nbsp;</a></span>json_object_get_object()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structlh__table.html">lh_table</a>* json_object_get_object </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structlh__table.html">lh_table</a>* json_object_get_object </td>
           <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em></td><td>)</td>
           <td></td>
         </tr>
@@ -897,12 +1325,14 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ad24f1c4c22b2a7d33e7b562c01f2ca65"></a>
+<a id="a9ee29ca8d79896e15007131527f6002e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ee29ca8d79896e15007131527f6002e">&#9670;&nbsp;</a></span>json_object_get_string()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">const char* json_object_get_string </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> const char* json_object_get_string </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em></td><td>)</td>
@@ -911,7 +1341,9 @@ Variables</h2></td></tr>
       </table>
 </div><div class="memdoc">
 <p>Get the string value of a <a class="el" href="structjson__object.html">json_object</a></p>
-<p>If the passed object is not of type json_type_string then the JSON representation of the object is returned.</p>
+<p>If the passed object is of type json_type_null (i.e. obj == NULL), NULL is returned.</p>
+<p>If the passed object of type json_type_string, the string contents are returned.</p>
+<p>Otherwise the JSON representation of the object is returned.</p>
 <p>The returned string memory is managed by the <a class="el" href="structjson__object.html">json_object</a> and will be freed when the reference count of the <a class="el" href="structjson__object.html">json_object</a> drops to zero.</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
@@ -919,18 +1351,20 @@ Variables</h2></td></tr>
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>a string </dd></dl>
+<dl class="section return"><dt>Returns</dt><dd>a string or NULL </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="ad821384d0d8515d5ed4eec44d7101772"></a>
+<a id="ac1d1f95a27a5e5d93bb66a8adfc1a2f4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac1d1f95a27a5e5d93bb66a8adfc1a2f4">&#9670;&nbsp;</a></span>json_object_get_string_len()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int json_object_get_string_len </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_get_string_len </td>
           <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em></td><td>)</td>
           <td></td>
         </tr>
@@ -948,14 +1382,16 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="adc5e998b4897b6e450bd0975a58d2f72"></a>
+<a id="af256a3a7910e271a2b9735e5044c3827"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af256a3a7910e271a2b9735e5044c3827">&#9670;&nbsp;</a></span>json_object_get_type()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a> json_object_get_type </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a> json_object_get_type </td>
           <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em></td><td>)</td>
           <td></td>
         </tr>
@@ -968,16 +1404,43 @@ Variables</h2></td></tr>
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>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, </dd></dl>
+<dl class="section return"><dt>Returns</dt><dd>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 </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="ab6dc8b19f8da310e78f402f83d6ae6c5"></a>
+<a id="ae925f3ec0f61cba5ea3dd50e0315f194"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae925f3ec0f61cba5ea3dd50e0315f194">&#9670;&nbsp;</a></span>json_object_get_userdata()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int json_object_is_type </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void* json_object_get_userdata </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>jso</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Returns the userdata set by <a class="el" href="json__object_8h.html#a4ee4281ccd123c62878e931a0a3bc43b">json_object_set_userdata()</a> or <a class="el" href="json__object_8h.html#a889345512a214b8f78f6a73561523c7c">json_object_set_serializer()</a></p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">jso</td><td>the object to return the userdata for </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a25691322b2d1ab24a3797e5752eb659f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25691322b2d1ab24a3797e5752eb659f">&#9670;&nbsp;</a></span>json_object_int_inc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_int_inc </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em>, </td>
@@ -985,6 +1448,44 @@ Variables</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
+          <td class="paramtype">int64_t&#160;</td>
+          <td class="paramname"><em>val</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Increment a json_type_int object by the given amount, which may be negative.</p>
+<p>If the type of obj is not json_type_int then 0 is returned with no further action taken. If the addition would result in a overflow, the object value is set to INT64_MAX. If the addition would result in a underflow, the object value is set to INT64_MIN. Neither overflow nor underflow affect the return value.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td class="paramname">val</td><td>the value to add </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if the increment succeded, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a8ab506a3d8f4ba5eb6a12ce0a6bbd37b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8ab506a3d8f4ba5eb6a12ce0a6bbd37b">&#9670;&nbsp;</a></span>json_object_is_type()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_is_type </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
           <td class="paramtype">enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a>&#160;</td>
           <td class="paramname"><em>type</em>&#160;</td>
         </tr>
@@ -998,19 +1499,21 @@ Variables</h2></td></tr>
 <p>Check if the <a class="el" href="structjson__object.html">json_object</a> is of a given type </p><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
-    <tr><td class="paramname">type</td><td>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, </td></tr>
+    <tr><td class="paramname">type</td><td>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 </td></tr>
   </table>
   </dd>
 </dl>
 
 </div>
 </div>
-<a class="anchor" id="a9b5af06e9a99e16c6d9b6459a685ea3f"></a>
+<a id="a84f7f8c0774c4600d958561d7548d649"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84f7f8c0774c4600d958561d7548d649">&#9670;&nbsp;</a></span>json_object_new_array()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_array </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_array </td>
           <td>(</td>
           <td class="paramtype">void&#160;</td>
           <td class="paramname"></td><td>)</td>
@@ -1022,12 +1525,14 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a93cfacfdd1000c739ad19df0a080cb85"></a>
+<a id="a2e290acd80e72cca745f89fb4600fb78"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2e290acd80e72cca745f89fb4600fb78">&#9670;&nbsp;</a></span>json_object_new_boolean()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_boolean </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_boolean </td>
           <td>(</td>
           <td class="paramtype"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>&#160;</td>
           <td class="paramname"><em>b</em></td><td>)</td>
@@ -1037,7 +1542,7 @@ Variables</h2></td></tr>
 </div><div class="memdoc">
 <p>Create a new empty <a class="el" href="structjson__object.html">json_object</a> of type json_type_boolean </p><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">b</td><td>a json_bool TRUE or FALSE (0 or 1) </td></tr>
+    <tr><td class="paramname">b</td><td>a json_bool TRUE or FALSE (1 or 0) </td></tr>
   </table>
   </dd>
 </dl>
@@ -1045,12 +1550,14 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a2e9c761833a4f5d0a0c60640377e3cec"></a>
+<a id="a594a093bafb9091f843da3197e0638aa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a594a093bafb9091f843da3197e0638aa">&#9670;&nbsp;</a></span>json_object_new_double()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_double </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_double </td>
           <td>(</td>
           <td class="paramtype">double&#160;</td>
           <td class="paramname"><em>d</em></td><td>)</td>
@@ -1058,7 +1565,9 @@ Variables</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Create a new empty <a class="el" href="structjson__object.html">json_object</a> of type json_type_double </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Create a new empty <a class="el" href="structjson__object.html">json_object</a> of type json_type_double</p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="json__object_8h.html#ada262c62364e3819b6a64b1e3a632336">json_object_double_to_json_string()</a> for how to set a custom format string.</dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">d</td><td>the double </td></tr>
   </table>
@@ -1068,12 +1577,14 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a50c188c8eb9007f05ab1aa0e22eae90c"></a>
+<a id="ae49671c026fe1ada370a75321e4e65f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae49671c026fe1ada370a75321e4e65f6">&#9670;&nbsp;</a></span>json_object_new_double_s()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_double_s </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_double_s </td>
           <td>(</td>
           <td class="paramtype">double&#160;</td>
           <td class="paramname"><em>d</em>, </td>
@@ -1093,11 +1604,10 @@ Variables</h2></td></tr>
 </div><div class="memdoc">
 <p>Create a new <a class="el" href="structjson__object.html">json_object</a> of type json_type_double, using the exact serialized representation of the value.</p>
 <p>This allows for numbers that would otherwise get displayed inefficiently (e.g. 12.3 =&gt; "12.300000000000001") to be serialized with the more convenient form.</p>
-<p>Note: this is used by <a class="el" href="json__tokener_8h.html#a0d9a666c21879647e8831f9cfa691673">json_tokener_parse_ex()</a> to allow for an exact re-serialization of a parsed object.</p>
-<p>An equivalent sequence of calls is: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;jso = json_object_new_double(d);</div>
-<div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;json_object_set_serializer(d, json_object_userdata_to_json_string,</div>
-<div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;    strdup(ds), json_object_free_userdata)</div>
-</div><!-- fragment --><dl class="params"><dt>Parameters</dt><dd>
+<p>Notes:</p>
+<p>This is used by <a class="el" href="json__tokener_8h.html#a61679f178111963a9ffa3c8179553f7a">json_tokener_parse_ex()</a> to allow for an exact re-serialization of a parsed object.</p>
+<p>The userdata field is used to store the string representation, so it can't be used for other data if this function is used.</p>
+<p>An equivalent sequence of calls is: </p><div class="fragment"><div class="line">jso = <a class="code" href="json__object_8h.html#a594a093bafb9091f843da3197e0638aa">json_object_new_double</a>(d);</div><div class="line"><a class="code" href="json__object_8h.html#a889345512a214b8f78f6a73561523c7c">json_object_set_serializer</a>(jso, <a class="code" href="json__object_8h.html#a8bc341281f4dd60b53b03b2dec0fae28">json_object_userdata_to_json_string</a>,</div><div class="line">    strdup(ds), <a class="code" href="json__object_8h.html#adda8476609cc566ee62b80eaed310283">json_object_free_userdata</a>);</div></div><!-- fragment --><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">d</td><td>the numeric value of the double. </td></tr>
     <tr><td class="paramname">ds</td><td>the string representation of the double. This will be copied. </td></tr>
@@ -1107,12 +1617,14 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="aa7db8ceb1afe1b93afc63c10b8c57560"></a>
+<a id="ae92f0770fb4b3c884ce35de52d3d7de8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae92f0770fb4b3c884ce35de52d3d7de8">&#9670;&nbsp;</a></span>json_object_new_int()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_int </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_int </td>
           <td>(</td>
           <td class="paramtype">int32_t&#160;</td>
           <td class="paramname"><em>i</em></td><td>)</td>
@@ -1130,12 +1642,14 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a54a27690a1927354966189166bba6ca3"></a>
+<a id="a7847f74494645c2b076505c37cc4cb93"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7847f74494645c2b076505c37cc4cb93">&#9670;&nbsp;</a></span>json_object_new_int64()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_int64 </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_int64 </td>
           <td>(</td>
           <td class="paramtype">int64_t&#160;</td>
           <td class="paramname"><em>i</em></td><td>)</td>
@@ -1153,12 +1667,14 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="af0ed3555604f39ac74b5e28bc5b1f82c"></a>
+<a id="a68c383f54544fca19b5f2425be397600"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a68c383f54544fca19b5f2425be397600">&#9670;&nbsp;</a></span>json_object_new_object()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_object </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_object </td>
           <td>(</td>
           <td class="paramtype">void&#160;</td>
           <td class="paramname"></td><td>)</td>
@@ -1171,12 +1687,14 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a48eb92a8208e6718e55edf1130e8e4b8"></a>
+<a id="a7b7b5302b3903c9347eeb1f4a64d657b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7b7b5302b3903c9347eeb1f4a64d657b">&#9670;&nbsp;</a></span>json_object_new_string()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_string </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_string </td>
           <td>(</td>
           <td class="paramtype">const char *&#160;</td>
           <td class="paramname"><em>s</em></td><td>)</td>
@@ -1196,12 +1714,14 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a9d14fd03ed7520c4aa33ab53b4569414"></a>
+<a id="a190e9bea8c39b257af69d392dd2ddffb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a190e9bea8c39b257af69d392dd2ddffb">&#9670;&nbsp;</a></span>json_object_new_string_len()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_string_len </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_object_new_string_len </td>
           <td>(</td>
           <td class="paramtype">const char *&#160;</td>
           <td class="paramname"><em>s</em>, </td>
@@ -1222,12 +1742,14 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a04448b1c63173e1bfe49965835732075"></a>
+<a id="a27bd808a022251059a43f1f6370441cd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a27bd808a022251059a43f1f6370441cd">&#9670;&nbsp;</a></span>json_object_object_add()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void json_object_object_add </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_object_add </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em>, </td>
@@ -1258,19 +1780,73 @@ Variables</h2></td></tr>
   <table class="params">
     <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
     <tr><td class="paramname">key</td><td>the object field name (a private copy will be duplicated) </td></tr>
+    <tr><td class="paramname">val</td><td>a <a class="el" href="structjson__object.html">json_object</a> or NULL member to associate with the given field</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>On success, <code>0</code> is returned. On error, a negative value is returned. </dd></dl>
+
+</div>
+</div>
+<a id="a57d3e444dd7db6b4510d21bf3716a002"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57d3e444dd7db6b4510d21bf3716a002">&#9670;&nbsp;</a></span>json_object_object_add_ex()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_object_add_ex </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *const&#160;</td>
+          <td class="paramname"><em>key</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *const&#160;</td>
+          <td class="paramname"><em>val</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const unsigned&#160;</td>
+          <td class="paramname"><em>opts</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add an object field to a <a class="el" href="structjson__object.html">json_object</a> of type json_type_object</p>
+<p>The semantics are identical to json_object_object_add, except that an additional flag fields gives you more control over some detail aspects of processing. See the description of JSON_C_OBJECT_ADD_* flags for more details.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td class="paramname">key</td><td>the object field name (a private copy will be duplicated) </td></tr>
     <tr><td class="paramname">val</td><td>a <a class="el" href="structjson__object.html">json_object</a> or NULL member to associate with the given field </td></tr>
+    <tr><td class="paramname">opts</td><td>process-modifying options. To specify multiple options, use arithmetic or (OPT1|OPT2) </td></tr>
   </table>
   </dd>
 </dl>
 
 </div>
 </div>
-<a class="anchor" id="a03653c18aafccd1ffba1ad318e342845"></a>
+<a id="ac6605fdafca20bd5d33c84f4f80a3bda"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac6605fdafca20bd5d33c84f4f80a3bda">&#9670;&nbsp;</a></span>json_object_object_del()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void json_object_object_del </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void json_object_object_del </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em>, </td>
@@ -1300,14 +1876,55 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="af3f38b3395b1af8e9d3ac73818c3a936"></a>
+<a id="a1a097805abb53b4c8a60d573730a8939"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1a097805abb53b4c8a60d573730a8939">&#9670;&nbsp;</a></span>json_object_object_get()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a> json_object_object_get_ex </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_object_object_get </td>
           <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>key</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get the <a class="el" href="structjson__object.html">json_object</a> associate with a given object field. Deprecated/discouraged: used json_object_object_get_ex instead.</p>
+<p>This returns NULL if the field is found but its value is null, or if the field is not found, or if obj is not a json_type_object. If you need to distinguis between these cases, use <a class="el" href="json__object_8h.html#a90d5f16d58636f01d2ed1a6030c7366a">json_object_object_get_ex()</a>.</p>
+<p><em>No</em> 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 (&amp; don't forget to do a json_object_put or transfer ownership to prevent a memory leak).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td class="paramname">key</td><td>the object field name </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the <a class="el" href="structjson__object.html">json_object</a> associated with the given field name </dd></dl>
+
+</div>
+</div>
+<a id="a90d5f16d58636f01d2ed1a6030c7366a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a90d5f16d58636f01d2ed1a6030c7366a">&#9670;&nbsp;</a></span>json_object_object_get_ex()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> <a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a> json_object_object_get_ex </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em>, </td>
         </tr>
         <tr>
@@ -1344,14 +1961,16 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="acde75a8e4ad28056b3e694ff43afbec0"></a>
+<a id="ad59a0ad2ec914a5eef90af53acae06d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad59a0ad2ec914a5eef90af53acae06d9">&#9670;&nbsp;</a></span>json_object_object_length()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int json_object_object_length </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_object_length </td>
           <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em></td><td>)</td>
           <td></td>
         </tr>
@@ -1366,12 +1985,14 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a1bb50e2d17832c404c3d5f13fbde5bf5"></a>
+<a id="afabf61f932cd64a4122ca8092452eed5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afabf61f932cd64a4122ca8092452eed5">&#9670;&nbsp;</a></span>json_object_put()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int json_object_put </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_put </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>obj</em></td><td>)</td>
@@ -1390,12 +2011,166 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a2ce290cd15dba1c779727c6041d5a2dd"></a>
+<a id="a23863c1503f3a8dd8a460a6405da0a65"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a23863c1503f3a8dd8a460a6405da0a65">&#9670;&nbsp;</a></span>json_object_set_boolean()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void json_object_set_serializer </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_set_boolean </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>&#160;</td>
+          <td class="paramname"><em>new_value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the json_bool value of a <a class="el" href="structjson__object.html">json_object</a></p>
+<p>The type of obj is checked to be a json_type_boolean and 0 is returned if it is not without any further actions. If type of obj is json_type_boolean the obect value is chaned to new_value</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td class="paramname">new_value</td><td>the value to be set </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if value is set correctly, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a3a7b7ce585565558cb69dad8d45d7757"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3a7b7ce585565558cb69dad8d45d7757">&#9670;&nbsp;</a></span>json_object_set_double()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_set_double </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">double&#160;</td>
+          <td class="paramname"><em>new_value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the double value of a <a class="el" href="structjson__object.html">json_object</a></p>
+<p>The type of obj is checked to be a json_type_double and 0 is returned if it is not without any further actions. If type of obj is json_type_double the obect value is chaned to new_value</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td class="paramname">new_value</td><td>the value to be set </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if value is set correctly, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a4ab3568f12e01fd2967e765a72456caa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4ab3568f12e01fd2967e765a72456caa">&#9670;&nbsp;</a></span>json_object_set_int()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_set_int </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>new_value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the int value of a <a class="el" href="structjson__object.html">json_object</a></p>
+<p>The type of obj is checked to be a json_type_int and 0 is returned if it is not without any further actions. If type of obj is json_type_int the obect value is changed to new_value</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td class="paramname">new_value</td><td>the value to be set </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if value is set correctly, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a7d3948600dde732abed0e261264ef53a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7d3948600dde732abed0e261264ef53a">&#9670;&nbsp;</a></span>json_object_set_int64()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_set_int64 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int64_t&#160;</td>
+          <td class="paramname"><em>new_value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the int64_t value of a <a class="el" href="structjson__object.html">json_object</a></p>
+<p>The type of obj is checked to be a json_type_int and 0 is returned if it is not without any further actions. If type of obj is json_type_int the obect value is chaned to new_value</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td class="paramname">new_value</td><td>the value to be set </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if value is set correctly, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a889345512a214b8f78f6a73561523c7c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a889345512a214b8f78f6a73561523c7c">&#9670;&nbsp;</a></span>json_object_set_serializer()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void json_object_set_serializer </td>
           <td>(</td>
           <td class="paramtype"><a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
           <td class="paramname"><em>jso</em>, </td>
@@ -1403,7 +2178,7 @@ Variables</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype"><a class="el" href="json__object_8h.html#a7806d0a6826ac08f6f8b09636207870e">json_object_to_json_string_fn</a>&#160;</td>
+          <td class="paramtype"><a class="el" href="json__object_8h.html#ad689953451ffa828830d349f4cd72563">json_object_to_json_string_fn</a> *&#160;</td>
           <td class="paramname"><em>to_string_func</em>, </td>
         </tr>
         <tr>
@@ -1415,7 +2190,7 @@ Variables</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype"><a class="el" href="json__object_8h.html#a3032a61c0ba2d38563b1b765f54ea46f">json_object_delete_fn</a> *&#160;</td>
+          <td class="paramtype"><a class="el" href="json__object_8h.html#a57e58c272b899b7034c3b5137935117f">json_object_delete_fn</a> *&#160;</td>
           <td class="paramname"><em>user_delete</em>&#160;</td>
         </tr>
         <tr>
@@ -1426,10 +2201,11 @@ Variables</h2></td></tr>
       </table>
 </div><div class="memdoc">
 <p>Set a custom serialization function to be used when this particular object is converted to a string by json_object_to_json_string.</p>
-<p>If a custom serializer is already set on this object, any existing user_delete function is called before the new one is set.</p>
-<p>If to_string_func is NULL, the other parameters are ignored and the default behaviour is reset.</p>
-<p>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.</p>
-<p>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 <a class="el" href="structjson__object.html">json_object</a> is deleted, after it's reference count goes to zero (see <a class="el" href="json__object_8h.html#a1bb50e2d17832c404c3d5f13fbde5bf5">json_object_put()</a>). If this is not provided, it is up to the caller to free the userdata at an appropriate time. (i.e. after the <a class="el" href="structjson__object.html">json_object</a> is deleted)</p>
+<p>If custom userdata is already set on this object, any existing user_delete function is called before the new one is set.</p>
+<p>If to_string_func is NULL the default behaviour is reset (but the userdata and user_delete fields are still set).</p>
+<p>The userdata parameter is optional and may be passed as NULL. It can be used to provide additional data for to_string_func to use. This parameter may be NULL even if user_delete is non-NULL.</p>
+<p>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 <a class="el" href="structjson__object.html">json_object</a> is deleted, after it's reference count goes to zero (see <a class="el" href="json__object_8h.html#afabf61f932cd64a4122ca8092452eed5">json_object_put()</a>). If this is not provided, it is up to the caller to free the userdata at an appropriate time. (i.e. after the <a class="el" href="structjson__object.html">json_object</a> is deleted)</p>
+<p>Note that the userdata is the same as set by <a class="el" href="json__object_8h.html#a4ee4281ccd123c62878e931a0a3bc43b">json_object_set_userdata()</a>, so care must be taken not to overwrite the value when both a custom serializer and <a class="el" href="json__object_8h.html#a4ee4281ccd123c62878e931a0a3bc43b">json_object_set_userdata()</a> are used.</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">jso</td><td>the object to customize </td></tr>
@@ -1442,44 +2218,103 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a1f62a660e2619559d1f3f54cd7483ff8"></a>
+<a id="ac35013e51cdc0651512801c947df431c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac35013e51cdc0651512801c947df431c">&#9670;&nbsp;</a></span>json_object_set_string()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">const char* json_object_to_json_string </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_set_string </td>
           <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
-          <td class="paramname"><em>obj</em></td><td>)</td>
+          <td class="paramtype"><a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>new_value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set the string value of a <a class="el" href="structjson__object.html">json_object</a> with zero terminated strings equivalent to json_object_set_string_len (obj, new_value, strlen(new_value)) </p><dl class="section return"><dt>Returns</dt><dd>1 if value is set correctly, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ae48707a0c8689e14aaa3a9b831db27fc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae48707a0c8689e14aaa3a9b831db27fc">&#9670;&nbsp;</a></span>json_object_set_string_len()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> int json_object_set_string_len </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>new_value</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
           <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Stringify object to json format. Equivalent to json_object_to_json_string_ext(obj, JSON_C_TO_STRING_SPACED) </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Set the string value of a <a class="el" href="structjson__object.html">json_object</a> str</p>
+<p>The type of obj is checked to be a json_type_string and 0 is returned if it is not without any further actions. If type of obj is json_type_string the obect value is chaned to new_value</p>
+<dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td class="paramname">new_value</td><td>the value to be set; Since string legth is given in len this need not be zero terminated </td></tr>
+    <tr><td class="paramname">len</td><td>the length of new_value </td></tr>
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>a string in JSON format </dd></dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if value is set correctly, 0 otherwise </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="a84421dab94ccad42e901e534c6d7b658"></a>
+<a id="a4ee4281ccd123c62878e931a0a3bc43b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4ee4281ccd123c62878e931a0a3bc43b">&#9670;&nbsp;</a></span>json_object_set_userdata()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">const char* json_object_to_json_string_ext </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void json_object_set_userdata </td>
           <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
-          <td class="paramname"><em>obj</em>, </td>
+          <td class="paramtype"><a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>jso</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">int&#160;</td>
-          <td class="paramname"><em>flags</em>&#160;</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>userdata</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="json__object_8h.html#a57e58c272b899b7034c3b5137935117f">json_object_delete_fn</a> *&#160;</td>
+          <td class="paramname"><em>user_delete</em>&#160;</td>
         </tr>
         <tr>
           <td></td>
@@ -1488,10 +2323,40 @@ Variables</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Stringify object to json format </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Set an opaque userdata value for an object</p>
+<p>The userdata can be retrieved using <a class="el" href="json__object_8h.html#ae925f3ec0f61cba5ea3dd50e0315f194">json_object_get_userdata()</a>.</p>
+<p>If custom userdata is already set on this object, any existing user_delete function is called before the new one is set.</p>
+<p>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 <a class="el" href="structjson__object.html">json_object</a> is deleted, after it's reference count goes to zero (see <a class="el" href="json__object_8h.html#afabf61f932cd64a4122ca8092452eed5">json_object_put()</a>). If this is not provided, it is up to the caller to free the userdata at an appropriate time. (i.e. after the <a class="el" href="structjson__object.html">json_object</a> is deleted)</p>
+<p>Note: Objects created by parsing strings may have custom serializers set which expect the userdata to contain specific data (due to use of <a class="el" href="json__object_8h.html#ae49671c026fe1ada370a75321e4e65f6">json_object_new_double_s()</a>). In this case, json_object_set_serialiser() with NULL as to_string_func should be used instead to set the userdata and reset the serializer to its default value.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">jso</td><td>the object to set the userdata for </td></tr>
+    <tr><td class="paramname">userdata</td><td>an optional opaque cookie </td></tr>
+    <tr><td class="paramname">user_delete</td><td>an optional function from freeing userdata </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab7390c22baa1700d977c2af6b22d43a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab7390c22baa1700d977c2af6b22d43a4">&#9670;&nbsp;</a></span>json_object_to_json_string()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> const char* json_object_to_json_string </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Stringify object to json format. Equivalent to json_object_to_json_string_ext(obj, JSON_C_TO_STRING_SPACED) The pointer you get is an internal of your json object. You don't have to free it, later use of <a class="el" href="json__object_8h.html#afabf61f932cd64a4122ca8092452eed5">json_object_put()</a> should be sufficient. If you can not ensure there's no concurrent access to *obj use strdup(). </p><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
-    <tr><td class="paramname">flags</td><td>formatting options, see JSON_C_TO_STRING_PRETTY and other constants </td></tr>
   </table>
   </dd>
 </dl>
@@ -1499,68 +2364,117 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a1345aaf3ee46e9b6185355b733ec362d"></a>
+<a id="a9db613127bd4ef7db42307e43a85fc1b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9db613127bd4ef7db42307e43a85fc1b">&#9670;&nbsp;</a></span>json_object_to_json_string_ext()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">THIS_FUNCTION_IS_DEPRECATED </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> const char* json_object_to_json_string_ext </td>
           <td>(</td>
-          <td class="paramtype">extern struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
-          <td class="paramname"><em>json_object_object_get</em>struct json_object *obj, const char *key</td><td>)</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
           <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>flags</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Get the <a class="el" href="structjson__object.html">json_object</a> associate with a given object field</p>
-<p><em>No</em> 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 (&amp; don't forget to do a json_object_put or transfer ownership to prevent a memory leak).</p>
+<p>Stringify object to json format </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="json__object_8h.html#ab7390c22baa1700d977c2af6b22d43a4">json_object_to_json_string()</a> for details on how to free string. </dd></dl>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
-    <tr><td class="paramname">key</td><td>the object field name </td></tr>
+    <tr><td class="paramname">flags</td><td>formatting options, see JSON_C_TO_STRING_PRETTY and other constants </td></tr>
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>the <a class="el" href="structjson__object.html">json_object</a> associated with the given field name </dd></dl>
-<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>Please use json_object_object_get_ex </dd></dl>
+<dl class="section return"><dt>Returns</dt><dd>a string in JSON format </dd></dl>
 
 </div>
 </div>
-<h2 class="groupheader">Variable Documentation</h2>
-<a class="anchor" id="a20dbe4913551cefa6b4b0a77fd4397c4"></a>
+<a id="add3770a3ba3d01a8f9adedfcd6bd8dbb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#add3770a3ba3d01a8f9adedfcd6bd8dbb">&#9670;&nbsp;</a></span>json_object_to_json_string_length()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">const char* json_hex_chars</td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> const char* json_object_to_json_string_length </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>flags</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t *&#160;</td>
+          <td class="paramname"><em>length</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
         </tr>
       </table>
 </div><div class="memdoc">
+<p>Stringify object to json format </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="json__object_8h.html#ab7390c22baa1700d977c2af6b22d43a4">json_object_to_json_string()</a> for details on how to free string. </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td class="paramname">flags</td><td>formatting options, see JSON_C_TO_STRING_PRETTY and other constants </td></tr>
+    <tr><td class="paramname">length</td><td>a pointer where, if not NULL, the length (without null) is stored </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a string in JSON format and the length if not NULL </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="a27427f89f2fc995639e366635fbe58ac"></a>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="ad79dbd850536be7f59714b52bbd7ec30"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad79dbd850536be7f59714b52bbd7ec30">&#9670;&nbsp;</a></span>json_c_shallow_copy_default</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">const char* json_number_chars</td>
+          <td class="memname"><a class="el" href="json__object_8h.html#acfbe0648eb909870e346df0bb42e81e1">json_c_shallow_copy_fn</a> json_c_shallow_copy_default</td>
         </tr>
       </table>
 </div><div class="memdoc">
+<p>The default shallow copy implementation for use with <a class="el" href="json__object_8h.html#aaac16505f13bc56accfad82604d8bcdc">json_object_deep_copy()</a>. This simply calls the appropriate json_object_new_&lt;type&gt;() function and copies over the serializer function (_to_json_string internal field of the <a class="el" href="structjson__object.html">json_object</a> structure) but not any _userdata or _user_delete values.</p>
+<p>If you're writing a custom shallow_copy function, perhaps because you're using your own custom serializer, you can call this first to create the new object before customizing it with <a class="el" href="json__object_8h.html#a889345512a214b8f78f6a73561523c7c">json_object_set_serializer()</a>.</p>
+<dl class="section return"><dt>Returns</dt><dd>1 on success, -1 on errors, but never 2. </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="adda8476609cc566ee62b80eaed310283"></a>
+<a id="adda8476609cc566ee62b80eaed310283"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adda8476609cc566ee62b80eaed310283">&#9670;&nbsp;</a></span>json_object_free_userdata</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname"><a class="el" href="json__object_8h.html#a3032a61c0ba2d38563b1b765f54ea46f">json_object_delete_fn</a> json_object_free_userdata</td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a57e58c272b899b7034c3b5137935117f">json_object_delete_fn</a> json_object_free_userdata</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Simply call free on the userdata pointer. Can be used with <a class="el" href="json__object_8h.html#a2ce290cd15dba1c779727c6041d5a2dd">json_object_set_serializer()</a>.</p>
+<p>Simply call free on the userdata pointer. Can be used with <a class="el" href="json__object_8h.html#a889345512a214b8f78f6a73561523c7c">json_object_set_serializer()</a>.</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">jso</td><td>unused </td></tr>
@@ -1571,16 +2485,18 @@ Variables</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a8bc341281f4dd60b53b03b2dec0fae28"></a>
+<a id="a8bc341281f4dd60b53b03b2dec0fae28"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8bc341281f4dd60b53b03b2dec0fae28">&#9670;&nbsp;</a></span>json_object_userdata_to_json_string</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname"><a class="el" href="json__object_8h.html#a7806d0a6826ac08f6f8b09636207870e">json_object_to_json_string_fn</a> json_object_userdata_to_json_string</td>
+          <td class="memname"><a class="el" href="json__object_8h.html#ad689953451ffa828830d349f4cd72563">json_object_to_json_string_fn</a> json_object_userdata_to_json_string</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Copy the jso-&gt;_userdata string over to pb as-is. Can be used with <a class="el" href="json__object_8h.html#a2ce290cd15dba1c779727c6041d5a2dd">json_object_set_serializer()</a>.</p>
+<p>Copy the jso-&gt;_userdata string over to pb as-is. Can be used with <a class="el" href="json__object_8h.html#a889345512a214b8f78f6a73561523c7c">json_object_set_serializer()</a>.</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">jso</td><td>The object whose _userdata is used. </td></tr>
@@ -1596,9 +2512,9 @@ Variables</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 17:13:26 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index ed8721c..5cb461b 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: json_object_iterator.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
@@ -51,7 +46,7 @@
 </div><!--header-->
 <div class="contents">
 
-<p>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.  
+<p>An API for iterating over json_type_object objects, styled to be familiar to C++ programmers. Unlike <a class="el" href="json__object_8h.html#acf5f514a9e0061c10fc08055762639ee">json_object_object_foreach()</a> and <a class="el" href="json__object_8h.html#a71f07006c12d78f7bbf4cb716a5af3a6">json_object_object_foreachC()</a>, this avoids the need to expose json-c internals like <a class="el" href="structlh__entry.html">lh_entry</a>.  
 <a href="#details">More...</a></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
@@ -77,7 +72,7 @@ Functions</h2></td></tr>
 <tr class="separator:a878ca25f72b339882aa2607ac938e79c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>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. </p>
+<div class="textblock"><p>An API for iterating over json_type_object objects, styled to be familiar to C++ programmers. Unlike <a class="el" href="json__object_8h.html#acf5f514a9e0061c10fc08055762639ee">json_object_object_foreach()</a> and <a class="el" href="json__object_8h.html#a71f07006c12d78f7bbf4cb716a5af3a6">json_object_object_foreachC()</a>, this avoids the need to expose json-c internals like <a class="el" href="structlh__entry.html">lh_entry</a>. </p>
 <p>Copyright (c) 2009-2012 Hewlett-Packard Development Company, L.P.</p>
 <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.</p>
 <p>API attributes: <br />
@@ -87,7 +82,9 @@ Functions</h2></td></tr>
 <li>Reentrant: NO </li>
 </ul>
 </div><h2 class="groupheader">Function Documentation</h2>
-<a class="anchor" id="a925eb97b5aa5b64986a0f663f53cf0fa"></a>
+<a id="a925eb97b5aa5b64986a0f663f53cf0fa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a925eb97b5aa5b64986a0f663f53cf0fa">&#9670;&nbsp;</a></span>json_object_iter_begin()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -109,23 +106,12 @@ Functions</h2></td></tr>
   </dd>
 </dl>
 <dl class="section return"><dt>Returns</dt><dd><a class="el" href="structjson__object__iterator.html">json_object_iterator</a> 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.</dd></dl>
-<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;struct json_object_iterator it;</div>
-<div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;struct json_object_iterator itEnd;</div>
-<div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;struct json_object* obj;</div>
-<div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;</div>
-<div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;obj = json_tokener_parse(&quot;{&#39;first&#39;:&#39;george&#39;, &#39;age&#39;:100}&quot;);</div>
-<div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;it = json_object_iter_begin(obj);</div>
-<div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;itEnd = json_object_iter_end(obj);</div>
-<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;</div>
-<div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;while (!json_object_iter_equal(&amp;it, &amp;itEnd)) {</div>
-<div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;    printf(&quot;%s\n&quot;,</div>
-<div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;           json_object_iter_peek_name(&amp;it));</div>
-<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;    json_object_iter_next(&amp;it);</div>
-<div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;}</div>
-</div><!-- fragment --> 
+<div class="fragment"><div class="line"><span class="keyword">struct </span><a class="code" href="structjson__object__iterator.html">json_object_iterator</a> it;</div><div class="line"><span class="keyword">struct </span><a class="code" href="structjson__object__iterator.html">json_object_iterator</a> itEnd;</div><div class="line"><span class="keyword">struct </span><a class="code" href="structjson__object.html">json_object</a>* obj;</div><div class="line"></div><div class="line">obj = <a class="code" href="json__tokener_8h.html#a236ef64d079822a4411d13eae7190c4d">json_tokener_parse</a>(<span class="stringliteral">&quot;{&#39;first&#39;:&#39;george&#39;, &#39;age&#39;:100}&quot;</span>);</div><div class="line">it = <a class="code" href="json__object__iterator_8h.html#a925eb97b5aa5b64986a0f663f53cf0fa">json_object_iter_begin</a>(obj);</div><div class="line">itEnd = <a class="code" href="json__object__iterator_8h.html#a1fa3784395fb14496e3f1a1633028fd4">json_object_iter_end</a>(obj);</div><div class="line"></div><div class="line"><span class="keywordflow">while</span> (!<a class="code" href="json__object__iterator_8h.html#a878ca25f72b339882aa2607ac938e79c">json_object_iter_equal</a>(&amp;it, &amp;itEnd)) {</div><div class="line">    printf(<span class="stringliteral">&quot;%s\n&quot;</span>,</div><div class="line">           <a class="code" href="json__object__iterator_8h.html#af17775b9b812a4206a84e4d3fb5774ab">json_object_iter_peek_name</a>(&amp;it));</div><div class="line">    <a class="code" href="json__object__iterator_8h.html#aa98a310c340f6d9b4eeecb673aa5e240">json_object_iter_next</a>(&amp;it);</div><div class="line">}</div></div><!-- fragment --> 
 </div>
 </div>
-<a class="anchor" id="a1fa3784395fb14496e3f1a1633028fd4"></a>
+<a id="a1fa3784395fb14496e3f1a1633028fd4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1fa3784395fb14496e3f1a1633028fd4">&#9670;&nbsp;</a></span>json_object_iter_end()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -154,7 +140,9 @@ For performance reasons, memorize the "end" iterator prior to any loop.</dd></dl
 
 </div>
 </div>
-<a class="anchor" id="a878ca25f72b339882aa2607ac938e79c"></a>
+<a id="a878ca25f72b339882aa2607ac938e79c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a878ca25f72b339882aa2607ac938e79c">&#9670;&nbsp;</a></span>json_object_iter_equal()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -191,7 +179,9 @@ For performance reasons, memorize the "end" iterator prior to any loop.</dd></dl
 
 </div>
 </div>
-<a class="anchor" id="af30f56ca510d59da42e5592f9a436c10"></a>
+<a id="af30f56ca510d59da42e5592f9a436c10"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af30f56ca510d59da42e5592f9a436c10">&#9670;&nbsp;</a></span>json_object_iter_init_default()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -205,16 +195,16 @@ For performance reasons, memorize the "end" iterator prior to any loop.</dd></dl
       </table>
 </div><div class="memdoc">
 <p>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).</p>
-<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;struct json_object_iterator iter = json_object_iter_init_default();</div>
-<div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;MyClass() : iter_(json_object_iter_init_default())</div>
-</div><!-- fragment --><dl class="section note"><dt>Note</dt><dd>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.</dd>
+<div class="fragment"><div class="line"><span class="keyword">struct </span><a class="code" href="structjson__object__iterator.html">json_object_iterator</a> iter = <a class="code" href="json__object__iterator_8h.html#af30f56ca510d59da42e5592f9a436c10">json_object_iter_init_default</a>();</div><div class="line">MyClass() : iter_(<a class="code" href="json__object__iterator_8h.html#af30f56ca510d59da42e5592f9a436c10">json_object_iter_init_default</a>())</div></div><!-- fragment --><dl class="section note"><dt>Note</dt><dd>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.</dd>
 <dd>
 User and internal code MUST NOT make any assumptions about and dependencies on the value of the "default" iterator value.</dd></dl>
 <dl class="section return"><dt>Returns</dt><dd><a class="el" href="structjson__object__iterator.html">json_object_iterator</a> </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="aa98a310c340f6d9b4eeecb673aa5e240"></a>
+<a id="aa98a310c340f6d9b4eeecb673aa5e240"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa98a310c340f6d9b4eeecb673aa5e240">&#9670;&nbsp;</a></span>json_object_iter_next()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -238,7 +228,9 @@ User and internal code MUST NOT make any assumptions about and dependencies on t
 
 </div>
 </div>
-<a class="anchor" id="af17775b9b812a4206a84e4d3fb5774ab"></a>
+<a id="af17775b9b812a4206a84e4d3fb5774ab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af17775b9b812a4206a84e4d3fb5774ab">&#9670;&nbsp;</a></span>json_object_iter_peek_name()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -263,7 +255,9 @@ User and internal code MUST NOT make any assumptions about and dependencies on t
 
 </div>
 </div>
-<a class="anchor" id="a47b0af7f1722c10475dffd29efc0b89d"></a>
+<a id="a47b0af7f1722c10475dffd29efc0b89d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a47b0af7f1722c10475dffd29efc0b89d">&#9670;&nbsp;</a></span>json_object_iter_peek_value()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -284,16 +278,16 @@ User and internal code MUST NOT make any assumptions about and dependencies on t
   </dd>
 </dl>
 <dl class="section warning"><dt>Warning</dt><dd>bad things will happen if invalid or "end" iterator is passed.</dd></dl>
-<dl class="section return"><dt>Returns</dt><dd>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 <a class="el" href="json__object_8h.html#acc3628d97c6308dc967006e4268c4e7f">json_object_get()</a> and <a class="el" href="json__object_8h.html#a1bb50e2d17832c404c3d5f13fbde5bf5">json_object_put()</a>. IMPORTANT: json-c API represents the JSON Null value as a NULL <a class="el" href="structjson__object.html">json_object</a> instance pointer. </dd></dl>
+<dl class="section return"><dt>Returns</dt><dd>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 <a class="el" href="json__object_8h.html#a675aa3a9cced685dbfd1c1a770a0c3e4">json_object_get()</a> and <a class="el" href="json__object_8h.html#afabf61f932cd64a4122ca8092452eed5">json_object_put()</a>. IMPORTANT: json-c API represents the JSON Null value as a NULL <a class="el" href="structjson__object.html">json_object</a> instance pointer. </dd></dl>
 
 </div>
 </div>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 00:47:50 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 63b3a6b..a790faa 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: json_object_private.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
 <a href="#nested-classes">Data Structures</a> &#124;
-<a href="#typedef-members">Typedefs</a>  </div>
+<a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
   <div class="headertitle">
 <div class="title">json_object_private.h File Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
+
+<p>Do not use, json-c internal, may be changed or removed at any time.  
+<a href="#details">More...</a></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
 Data Structures</h2></td></tr>
@@ -58,18 +59,113 @@ Data Structures</h2></td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">union &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionjson__object_1_1data.html">json_object::data</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a227adaf0073e17006f614190d414fa1a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__private_8h.html#a227adaf0073e17006f614190d414fa1a">LEN_DIRECT_STRING_DATA</a>&#160;&#160;&#160;32</td></tr>
+<tr class="separator:a227adaf0073e17006f614190d414fa1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
 Typedefs</h2></td></tr>
-<tr class="memitem:aa7d02026483e5ff3af5d6181d4efd032"><td class="memItemLeft" align="right" valign="top">typedef void(&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__private_8h.html#aa7d02026483e5ff3af5d6181d4efd032">json_object_private_delete_fn</a>) (struct <a class="el" href="structjson__object.html">json_object</a> *o)</td></tr>
-<tr class="separator:aa7d02026483e5ff3af5d6181d4efd032"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a725ac370dfd6c705c02d8d85b78f1050"><td class="memItemLeft" align="right" valign="top">typedef void()&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__private_8h.html#a725ac370dfd6c705c02d8d85b78f1050">json_object_private_delete_fn</a>(struct <a class="el" href="structjson__object.html">json_object</a> *o)</td></tr>
+<tr class="separator:a725ac370dfd6c705c02d8d85b78f1050"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2b38dd2d14fbfa6585de5664b6d61c0c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__private_8h.html#a2b38dd2d14fbfa6585de5664b6d61c0c">_json_c_set_last_err</a> (const char *err_fmt,...)</td></tr>
+<tr class="separator:a2b38dd2d14fbfa6585de5664b6d61c0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a27427f89f2fc995639e366635fbe58ac"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__private_8h.html#a27427f89f2fc995639e366635fbe58ac">json_number_chars</a></td></tr>
+<tr class="separator:a27427f89f2fc995639e366635fbe58ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20dbe4913551cefa6b4b0a77fd4397c4"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__private_8h.html#a20dbe4913551cefa6b4b0a77fd4397c4">json_hex_chars</a></td></tr>
+<tr class="separator:a20dbe4913551cefa6b4b0a77fd4397c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Do not use, json-c internal, may be changed or removed at any time. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a227adaf0073e17006f614190d414fa1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a227adaf0073e17006f614190d414fa1a">&#9670;&nbsp;</a></span>LEN_DIRECT_STRING_DATA</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LEN_DIRECT_STRING_DATA&#160;&#160;&#160;32</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>how many bytes are directly stored in <a class="el" href="structjson__object.html">json_object</a> for strings? </p>
+
+</div>
+</div>
 <h2 class="groupheader">Typedef Documentation</h2>
-<a class="anchor" id="aa7d02026483e5ff3af5d6181d4efd032"></a>
+<a id="a725ac370dfd6c705c02d8d85b78f1050"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a725ac370dfd6c705c02d8d85b78f1050">&#9670;&nbsp;</a></span>json_object_private_delete_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void() json_object_private_delete_fn(struct <a class="el" href="structjson__object.html">json_object</a> *o)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a2b38dd2d14fbfa6585de5664b6d61c0c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2b38dd2d14fbfa6585de5664b6d61c0c">&#9670;&nbsp;</a></span>_json_c_set_last_err()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void _json_c_set_last_err </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>err_fmt</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="a20dbe4913551cefa6b4b0a77fd4397c4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a20dbe4913551cefa6b4b0a77fd4397c4">&#9670;&nbsp;</a></span>json_hex_chars</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* json_hex_chars</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a27427f89f2fc995639e366635fbe58ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a27427f89f2fc995639e366635fbe58ac">&#9670;&nbsp;</a></span>json_number_chars</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef void( json_object_private_delete_fn) (struct <a class="el" href="structjson__object.html">json_object</a> *o)</td>
+          <td class="memname">const char* json_number_chars</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -79,9 +175,9 @@ Typedefs</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 05:40:06 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
diff --git a/doc/html/json__pointer_8h.html b/doc/html/json__pointer_8h.html
new file mode 100644 (file)
index 0000000..7997e31
--- /dev/null
@@ -0,0 +1,272 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>json-c: json_pointer.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">json-c
+   &#160;<span id="projectnumber">0.13</span>
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">json_pointer.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>JSON Pointer (RFC 6901) implementation for retrieving objects from a json-c object tree.  
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abf47f34be3386a5eb510604f05ae9491"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__pointer_8h.html#abf47f34be3386a5eb510604f05ae9491">json_pointer_get</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, const char *path, struct <a class="el" href="structjson__object.html">json_object</a> **res)</td></tr>
+<tr class="separator:abf47f34be3386a5eb510604f05ae9491"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae7eb2cab2f6f50c51053430223a01438"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__pointer_8h.html#ae7eb2cab2f6f50c51053430223a01438">json_pointer_getf</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, struct <a class="el" href="structjson__object.html">json_object</a> **res, const char *path_fmt,...)</td></tr>
+<tr class="separator:ae7eb2cab2f6f50c51053430223a01438"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab06a9fd172593748b2dc8d3a11c74fa0"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__pointer_8h.html#ab06a9fd172593748b2dc8d3a11c74fa0">json_pointer_set</a> (struct <a class="el" href="structjson__object.html">json_object</a> **obj, const char *path, struct <a class="el" href="structjson__object.html">json_object</a> *value)</td></tr>
+<tr class="separator:ab06a9fd172593748b2dc8d3a11c74fa0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a74edfbe357c7428b1a20ae73e3910ac0"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__pointer_8h.html#a74edfbe357c7428b1a20ae73e3910ac0">json_pointer_setf</a> (struct <a class="el" href="structjson__object.html">json_object</a> **obj, struct <a class="el" href="structjson__object.html">json_object</a> *value, const char *path_fmt,...)</td></tr>
+<tr class="separator:a74edfbe357c7428b1a20ae73e3910ac0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>JSON Pointer (RFC 6901) implementation for retrieving objects from a json-c object tree. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="abf47f34be3386a5eb510604f05ae9491"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf47f34be3386a5eb510604f05ae9491">&#9670;&nbsp;</a></span>json_pointer_get()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int json_pointer_get </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>path</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> **&#160;</td>
+          <td class="paramname"><em>res</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Retrieves a JSON sub-object from inside another JSON object using the JSON pointer notation as defined in RFC 6901 <a href="https://tools.ietf.org/html/rfc6901">https://tools.ietf.org/html/rfc6901</a></p>
+<p>The returned JSON sub-object is equivalent to parsing manually the 'obj' JSON tree ; i.e. it's not a new object that is created, but rather a pointer inside the JSON tree.</p>
+<p>Internally, this is equivalent to doing a series of '<a class="el" href="json__object_8h.html#a1a097805abb53b4c8a60d573730a8939">json_object_object_get()</a>' and '<a class="el" href="json__object_8h.html#a676711a76545d4ec65cc75f100f5fd19">json_object_array_get_idx()</a>' along the given 'path'.</p>
+<p>Note that the 'path' string supports 'printf()' type arguments, so, whatever is added after the 'res' param will be treated as an argument for 'path' Example: json_pointer_get(obj, "/foo/%d/%s", &amp;res, 0, bar) This means, that you need to escape '' with '%' (just like in printf())</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance/tree from where to retrieve sub-objects </td></tr>
+    <tr><td class="paramname">path</td><td>a (RFC6901) string notation for the sub-object to retrieve </td></tr>
+    <tr><td class="paramname">res</td><td>a pointer where to store a reference to the <a class="el" href="structjson__object.html">json_object</a> associated with the given path</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>negative if an error (or not found), or 0 if succeeded </dd></dl>
+
+</div>
+</div>
+<a id="ae7eb2cab2f6f50c51053430223a01438"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae7eb2cab2f6f50c51053430223a01438">&#9670;&nbsp;</a></span>json_pointer_getf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int json_pointer_getf </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> **&#160;</td>
+          <td class="paramname"><em>res</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>path_fmt</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This is a variant of '<a class="el" href="json__pointer_8h.html#abf47f34be3386a5eb510604f05ae9491">json_pointer_get()</a>' that supports printf() style arguments.</p>
+<p>Example: json_pointer_getf(obj, res, "/foo/%d/%s", 0, bak) This also means that you need to escape '' with '%' (just like in printf())</p>
+<p>Please take into consideration all recommended 'printf()' format security aspects when using this function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance/tree to which to add a sub-object </td></tr>
+    <tr><td class="paramname">res</td><td>a pointer where to store a reference to the <a class="el" href="structjson__object.html">json_object</a> associated with the given path </td></tr>
+    <tr><td class="paramname">path_fmt</td><td>a printf() style format for the path</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>negative if an error (or not found), or 0 if succeeded </dd></dl>
+
+</div>
+</div>
+<a id="ab06a9fd172593748b2dc8d3a11c74fa0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab06a9fd172593748b2dc8d3a11c74fa0">&#9670;&nbsp;</a></span>json_pointer_set()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int json_pointer_set </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> **&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>path</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sets JSON object 'value' in the 'obj' tree at the location specified by the 'path'. 'path' is JSON pointer notation as defined in RFC 6901 <a href="https://tools.ietf.org/html/rfc6901">https://tools.ietf.org/html/rfc6901</a></p>
+<p>Note that 'obj' is a double pointer, mostly for the "" (empty string) case, where the entire JSON object would be replaced by 'value'. In the case of the "" path, the object at '*obj' will have it's refcount decremented with '<a class="el" href="json__object_8h.html#afabf61f932cd64a4122ca8092452eed5">json_object_put()</a>' and the 'value' object will be assigned to it.</p>
+<p>For other cases (JSON sub-objects) ownership of 'value' will be transferred into '*obj' via '<a class="el" href="json__object_8h.html#a27bd808a022251059a43f1f6370441cd">json_object_object_add()</a>' &amp; '<a class="el" href="json__object_8h.html#a1ac0ccdbc13a25da7d8b2dc9e421dfad">json_object_array_put_idx()</a>', so the only time the refcount should be decremented for 'value' is when the return value of '<a class="el" href="json__pointer_8h.html#ab06a9fd172593748b2dc8d3a11c74fa0">json_pointer_set()</a>' is negative (meaning the 'value' object did not get set into '*obj').</p>
+<p>That also implies that '<a class="el" href="json__pointer_8h.html#ab06a9fd172593748b2dc8d3a11c74fa0">json_pointer_set()</a>' does not do any refcount incrementing. (Just that single decrement that was mentioned above).</p>
+<p>Note that the 'path' string supports 'printf()' type arguments, so, whatever is added after the 'value' param will be treated as an argument for 'path' Example: json_pointer_set(obj, "/foo/%d/%s", value, 0, bak) This means, that you need to escape '' with '%' (just like in printf())</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance/tree to which to add a sub-object </td></tr>
+    <tr><td class="paramname">path</td><td>a (RFC6901) string notation for the sub-object to set in the tree </td></tr>
+    <tr><td class="paramname">value</td><td>object to set at path</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>negative if an error (or not found), or 0 if succeeded </dd></dl>
+
+</div>
+</div>
+<a id="a74edfbe357c7428b1a20ae73e3910ac0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a74edfbe357c7428b1a20ae73e3910ac0">&#9670;&nbsp;</a></span>json_pointer_setf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int json_pointer_setf </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> **&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>value</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>path_fmt</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This is a variant of '<a class="el" href="json__pointer_8h.html#ab06a9fd172593748b2dc8d3a11c74fa0">json_pointer_set()</a>' that supports printf() style arguments.</p>
+<p>Example: json_pointer_setf(obj, value, "/foo/%d/%s", 0, bak) This also means that you need to escape '' with '%' (just like in printf())</p>
+<p>Please take into consideration all recommended 'printf()' format security aspects when using this function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">obj</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance/tree to which to add a sub-object </td></tr>
+    <tr><td class="paramname">value</td><td>object to set at path </td></tr>
+    <tr><td class="paramname">path_fmt</td><td>a printf() style format for the path</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>negative if an error (or not found), or 0 if succeeded </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
index 611cf53..a3e232b 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: json_tokener.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
 <a href="#nested-classes">Data Structures</a> &#124;
 <a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
 <a href="#enum-members">Enumerations</a> &#124;
 <a href="#func-members">Functions</a>  </div>
   <div class="headertitle">
 <div class="title">json_tokener.h File Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
+
+<p>Methods to parse an input string into a tree of <a class="el" href="structjson__object.html">json_object</a> objects.  
+<a href="#details">More...</a></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
 Data Structures</h2></td></tr>
@@ -67,6 +66,11 @@ Macros</h2></td></tr>
 <tr class="memitem:a72be595cb7e090c70b1d29feb1cbfb16"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a72be595cb7e090c70b1d29feb1cbfb16">JSON_TOKENER_STRICT</a>&#160;&#160;&#160;0x01</td></tr>
 <tr class="separator:a72be595cb7e090c70b1d29feb1cbfb16"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a4dd5e5b65aee7f376f529f86b210ff49"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structjson__tokener.html">json_tokener</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a4dd5e5b65aee7f376f529f86b210ff49">json_tokener</a></td></tr>
+<tr class="separator:a4dd5e5b65aee7f376f529f86b210ff49"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
 Enumerations</h2></td></tr>
 <tr class="memitem:a0a31f0df8a532ef8be5c09ba40eacb59"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a> { <br />
@@ -131,27 +135,31 @@ Enumerations</h2></td></tr>
 Functions</h2></td></tr>
 <tr class="memitem:a04c5625212aed3216cc303429e47f642"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a04c5625212aed3216cc303429e47f642">json_tokener_error_desc</a> (enum <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a> jerr)</td></tr>
 <tr class="separator:a04c5625212aed3216cc303429e47f642"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ae8dff7f1ea11702aecf418e0da5574fe"><td class="memItemLeft" align="right" valign="top">enum <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#ae8dff7f1ea11702aecf418e0da5574fe">json_tokener_get_error</a> (struct <a class="el" href="structjson__tokener.html">json_tokener</a> *tok)</td></tr>
-<tr class="separator:ae8dff7f1ea11702aecf418e0da5574fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a55d6e8a6f6d90992c063a39e21769c52"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__tokener.html">json_tokener</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a55d6e8a6f6d90992c063a39e21769c52">json_tokener_new</a> (void)</td></tr>
-<tr class="separator:a55d6e8a6f6d90992c063a39e21769c52"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a8c0696656dba7dde887a71e5c7686057"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__tokener.html">json_tokener</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a8c0696656dba7dde887a71e5c7686057">json_tokener_new_ex</a> (int depth)</td></tr>
-<tr class="separator:a8c0696656dba7dde887a71e5c7686057"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:af6645ff27c0ca82c6e314390814fcbeb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#af6645ff27c0ca82c6e314390814fcbeb">json_tokener_free</a> (struct <a class="el" href="structjson__tokener.html">json_tokener</a> *tok)</td></tr>
-<tr class="separator:af6645ff27c0ca82c6e314390814fcbeb"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ae23dd7ad4737bfc18409af6173ab2b09"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#ae23dd7ad4737bfc18409af6173ab2b09">json_tokener_reset</a> (struct <a class="el" href="structjson__tokener.html">json_tokener</a> *tok)</td></tr>
-<tr class="separator:ae23dd7ad4737bfc18409af6173ab2b09"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:abf031fdf1e5caab71e2225a99588c6bb"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#abf031fdf1e5caab71e2225a99588c6bb">json_tokener_parse</a> (const char *str)</td></tr>
-<tr class="separator:abf031fdf1e5caab71e2225a99588c6bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a1c8f5d8baad383dc8879615d2b02b53c"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a1c8f5d8baad383dc8879615d2b02b53c">json_tokener_parse_verbose</a> (const char *str, enum <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a> *error)</td></tr>
-<tr class="separator:a1c8f5d8baad383dc8879615d2b02b53c"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aaaee020e15fe8a8fcc4ce1e81b610e36"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#aaaee020e15fe8a8fcc4ce1e81b610e36">json_tokener_set_flags</a> (struct <a class="el" href="structjson__tokener.html">json_tokener</a> *tok, int flags)</td></tr>
-<tr class="separator:aaaee020e15fe8a8fcc4ce1e81b610e36"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a0d9a666c21879647e8831f9cfa691673"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a0d9a666c21879647e8831f9cfa691673">json_tokener_parse_ex</a> (struct <a class="el" href="structjson__tokener.html">json_tokener</a> *tok, const char *str, int len)</td></tr>
-<tr class="separator:a0d9a666c21879647e8831f9cfa691673"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af5d7ffd95a0f6e5d5bb5994d233b4197"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> enum <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#af5d7ffd95a0f6e5d5bb5994d233b4197">json_tokener_get_error</a> (struct <a class="el" href="structjson__tokener.html">json_tokener</a> *tok)</td></tr>
+<tr class="separator:af5d7ffd95a0f6e5d5bb5994d233b4197"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ac7e2c350bc592cf2fa7b9935b00ef5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__tokener.html">json_tokener</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a5ac7e2c350bc592cf2fa7b9935b00ef5">json_tokener_new</a> (void)</td></tr>
+<tr class="separator:a5ac7e2c350bc592cf2fa7b9935b00ef5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a1583ddd434e13515d6232de813462e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__tokener.html">json_tokener</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a6a1583ddd434e13515d6232de813462e">json_tokener_new_ex</a> (int depth)</td></tr>
+<tr class="separator:a6a1583ddd434e13515d6232de813462e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a887c4661906fc6b36cc366304e522534"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a887c4661906fc6b36cc366304e522534">json_tokener_free</a> (struct <a class="el" href="structjson__tokener.html">json_tokener</a> *tok)</td></tr>
+<tr class="separator:a887c4661906fc6b36cc366304e522534"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a238649a59737be5152d525aeaf4153ab"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a238649a59737be5152d525aeaf4153ab">json_tokener_reset</a> (struct <a class="el" href="structjson__tokener.html">json_tokener</a> *tok)</td></tr>
+<tr class="separator:a238649a59737be5152d525aeaf4153ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a236ef64d079822a4411d13eae7190c4d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a236ef64d079822a4411d13eae7190c4d">json_tokener_parse</a> (const char *str)</td></tr>
+<tr class="separator:a236ef64d079822a4411d13eae7190c4d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a735f2dc755d57ed5c5b807aaaaef3b14"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a735f2dc755d57ed5c5b807aaaaef3b14">json_tokener_parse_verbose</a> (const char *str, enum <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a> *error)</td></tr>
+<tr class="separator:a735f2dc755d57ed5c5b807aaaaef3b14"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e7a0c0c9dc79e5e47b2608bb8aad7b7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a7e7a0c0c9dc79e5e47b2608bb8aad7b7">json_tokener_set_flags</a> (struct <a class="el" href="structjson__tokener.html">json_tokener</a> *tok, int flags)</td></tr>
+<tr class="separator:a7e7a0c0c9dc79e5e47b2608bb8aad7b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61679f178111963a9ffa3c8179553f7a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a61679f178111963a9ffa3c8179553f7a">json_tokener_parse_ex</a> (struct <a class="el" href="structjson__tokener.html">json_tokener</a> *tok, const char *str, int len)</td></tr>
+<tr class="separator:a61679f178111963a9ffa3c8179553f7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
-<h2 class="groupheader">Macro Definition Documentation</h2>
-<a class="anchor" id="a5ccd346459feb66e4e0af32005360279"></a>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Methods to parse an input string into a tree of <a class="el" href="structjson__object.html">json_object</a> objects. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a5ccd346459feb66e4e0af32005360279"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5ccd346459feb66e4e0af32005360279">&#9670;&nbsp;</a></span>JSON_TOKENER_DEFAULT_DEPTH</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -163,7 +171,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a72be595cb7e090c70b1d29feb1cbfb16"></a>
+<a id="a72be595cb7e090c70b1d29feb1cbfb16"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a72be595cb7e090c70b1d29feb1cbfb16">&#9670;&nbsp;</a></span>JSON_TOKENER_STRICT</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -174,12 +184,30 @@ Functions</h2></td></tr>
 </div><div class="memdoc">
 <p>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.</p>
 <p>This flag is not set by default.</p>
-<dl class="section see"><dt>See also</dt><dd><a class="el" href="json__tokener_8h.html#aaaee020e15fe8a8fcc4ce1e81b610e36">json_tokener_set_flags()</a> </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="json__tokener_8h.html#a7e7a0c0c9dc79e5e47b2608bb8aad7b7">json_tokener_set_flags()</a> </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="a4dd5e5b65aee7f376f529f86b210ff49"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4dd5e5b65aee7f376f529f86b210ff49">&#9670;&nbsp;</a></span>json_tokener</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structjson__tokener.html">json_tokener</a> <a class="el" href="structjson__tokener.html">json_tokener</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000006">Deprecated:</a></b></dt><dd>Unused in json-c code </dd></dl>
 
 </div>
 </div>
 <h2 class="groupheader">Enumeration Type Documentation</h2>
-<a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59"></a>
+<a id="a0a31f0df8a532ef8be5c09ba40eacb59"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0a31f0df8a532ef8be5c09ba40eacb59">&#9670;&nbsp;</a></span>json_tokener_error</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -189,41 +217,28 @@ Functions</h2></td></tr>
       </table>
 </div><div class="memdoc">
 <table class="fieldtable">
-<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59afe2fa9bde03155019b2df30f66a5fcd0"></a>json_tokener_success&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a9b26e920ca765df91c84e999561d8fb0"></a>json_tokener_continue&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a59b2c36d9cc30c3038e09b9ddee6c86c"></a>json_tokener_error_depth&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a8f774f4c7869afdd9b92295fca3a9ded"></a>json_tokener_error_parse_eof&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a3309fa8ea4ab3ee0a81c55b69d223710"></a>json_tokener_error_parse_unexpected&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a641bbb8d881fdd1e463f20a1a203b77c"></a>json_tokener_error_parse_null&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59addbdfe084e20709da3d20c8ae8ca278c"></a>json_tokener_error_parse_boolean&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59ab1b3ad685eb97235d269cc5b9eb7ab81"></a>json_tokener_error_parse_number&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a574846740b785146f164a209dc89574e"></a>json_tokener_error_parse_array&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a2003bd8e96c6680cd22419c5ceafd4c0"></a>json_tokener_error_parse_object_key_name&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59af91a2a819b0d6344d6d4e1d2579f28fd"></a>json_tokener_error_parse_object_key_sep&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a9ddb98741aebf7ac44735b4a43717013"></a>json_tokener_error_parse_object_value_sep&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a033ce89ce7b8f9e591e4bea92121c4c7"></a>json_tokener_error_parse_string&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a3588c05b1da8b909a8cbdef66b0a1a28"></a>json_tokener_error_parse_comment&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a1eeed74de65c0c12c9f9c28cf4f3ff1d"></a>json_tokener_error_size&#160;</td><td class="fielddoc">
-</td></tr>
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59afe2fa9bde03155019b2df30f66a5fcd0"></a>json_tokener_success&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59a9b26e920ca765df91c84e999561d8fb0"></a>json_tokener_continue&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59a59b2c36d9cc30c3038e09b9ddee6c86c"></a>json_tokener_error_depth&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59a8f774f4c7869afdd9b92295fca3a9ded"></a>json_tokener_error_parse_eof&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59a3309fa8ea4ab3ee0a81c55b69d223710"></a>json_tokener_error_parse_unexpected&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59a641bbb8d881fdd1e463f20a1a203b77c"></a>json_tokener_error_parse_null&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59addbdfe084e20709da3d20c8ae8ca278c"></a>json_tokener_error_parse_boolean&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59ab1b3ad685eb97235d269cc5b9eb7ab81"></a>json_tokener_error_parse_number&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59a574846740b785146f164a209dc89574e"></a>json_tokener_error_parse_array&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59a2003bd8e96c6680cd22419c5ceafd4c0"></a>json_tokener_error_parse_object_key_name&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59af91a2a819b0d6344d6d4e1d2579f28fd"></a>json_tokener_error_parse_object_key_sep&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59a9ddb98741aebf7ac44735b4a43717013"></a>json_tokener_error_parse_object_value_sep&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59a033ce89ce7b8f9e591e4bea92121c4c7"></a>json_tokener_error_parse_string&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59a3588c05b1da8b909a8cbdef66b0a1a28"></a>json_tokener_error_parse_comment&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="a0a31f0df8a532ef8be5c09ba40eacb59a1eeed74de65c0c12c9f9c28cf4f3ff1d"></a>json_tokener_error_size&#160;</td><td class="fielddoc"></td></tr>
 </table>
 
 </div>
 </div>
-<a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2"></a>
+<a id="af026dec71e4548e6200eb2f902f1c4e2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af026dec71e4548e6200eb2f902f1c4e2">&#9670;&nbsp;</a></span>json_tokener_state</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -233,62 +248,39 @@ Functions</h2></td></tr>
       </table>
 </div><div class="memdoc">
 <table class="fieldtable">
-<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a9db152607ec1872a000f1fcd8757297d"></a>json_tokener_state_eatws&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a7c4c0bed1ebde45f5a99de4278792d72"></a>json_tokener_state_start&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2ad80b689cb709967b67a348de3d8601d2"></a>json_tokener_state_finish&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a668fb2654c59608945370003403a5792"></a>json_tokener_state_null&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a0ff1d1935d49188aa1e6b998d43e655c"></a>json_tokener_state_comment_start&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a8c2680b8873a8dce85f0b1ac25882dc9"></a>json_tokener_state_comment&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2ad8151350b1ef50298bafbab244ac1162"></a>json_tokener_state_comment_eol&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a62cef297a37a98b1239ea4bbd39723e1"></a>json_tokener_state_comment_end&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2aa90ea4c327a285bfbbce49d42d491d65"></a>json_tokener_state_string&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a1cf793d73587f68c4f2b3b4f65ff728e"></a>json_tokener_state_string_escape&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a6c852da2e694be56799c58c201d6dca0"></a>json_tokener_state_escape_unicode&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a3525b15ecd0a698281b3914115b6bd3e"></a>json_tokener_state_boolean&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a7ce18d281d322af690b45f3b8b599e81"></a>json_tokener_state_number&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2ab3d763300f1914865be09d603ddc11f4"></a>json_tokener_state_array&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2aa2a01798ebe318ea91c38a886418f771"></a>json_tokener_state_array_add&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a4ec7762aeab3424cbb14354c94025865"></a>json_tokener_state_array_sep&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a8c7dbda177a5d83a36a64f7cb99b9a29"></a>json_tokener_state_object_field_start&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a77375940a10806e81d99876d13be67fc"></a>json_tokener_state_object_field&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a0220aea1d9204aadfffde92c7f73f5f7"></a>json_tokener_state_object_field_end&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a4c7b7deac37355491572f6da84f208aa"></a>json_tokener_state_object_value&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2ade6bee72f2147e634b19eb84e58eb162"></a>json_tokener_state_object_value_add&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2adaf3e06c5fc04fd4f04040cd67698215"></a>json_tokener_state_object_sep&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2ab1a0ad626ec662c1ba4fb5bfee1cd0a9"></a>json_tokener_state_array_after_sep&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a3a2c9cf26d076936a10a6ae3ca4eb523"></a>json_tokener_state_object_field_start_after_sep&#160;</td><td class="fielddoc">
-</td></tr>
-<tr><td class="fieldname"><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2ab9f6244bfca4924db61ed3050c780b53"></a>json_tokener_state_inf&#160;</td><td class="fielddoc">
-</td></tr>
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a9db152607ec1872a000f1fcd8757297d"></a>json_tokener_state_eatws&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a7c4c0bed1ebde45f5a99de4278792d72"></a>json_tokener_state_start&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2ad80b689cb709967b67a348de3d8601d2"></a>json_tokener_state_finish&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a668fb2654c59608945370003403a5792"></a>json_tokener_state_null&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a0ff1d1935d49188aa1e6b998d43e655c"></a>json_tokener_state_comment_start&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a8c2680b8873a8dce85f0b1ac25882dc9"></a>json_tokener_state_comment&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2ad8151350b1ef50298bafbab244ac1162"></a>json_tokener_state_comment_eol&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a62cef297a37a98b1239ea4bbd39723e1"></a>json_tokener_state_comment_end&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2aa90ea4c327a285bfbbce49d42d491d65"></a>json_tokener_state_string&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a1cf793d73587f68c4f2b3b4f65ff728e"></a>json_tokener_state_string_escape&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a6c852da2e694be56799c58c201d6dca0"></a>json_tokener_state_escape_unicode&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a3525b15ecd0a698281b3914115b6bd3e"></a>json_tokener_state_boolean&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a7ce18d281d322af690b45f3b8b599e81"></a>json_tokener_state_number&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2ab3d763300f1914865be09d603ddc11f4"></a>json_tokener_state_array&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2aa2a01798ebe318ea91c38a886418f771"></a>json_tokener_state_array_add&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a4ec7762aeab3424cbb14354c94025865"></a>json_tokener_state_array_sep&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a8c7dbda177a5d83a36a64f7cb99b9a29"></a>json_tokener_state_object_field_start&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a77375940a10806e81d99876d13be67fc"></a>json_tokener_state_object_field&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a0220aea1d9204aadfffde92c7f73f5f7"></a>json_tokener_state_object_field_end&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a4c7b7deac37355491572f6da84f208aa"></a>json_tokener_state_object_value&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2ade6bee72f2147e634b19eb84e58eb162"></a>json_tokener_state_object_value_add&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2adaf3e06c5fc04fd4f04040cd67698215"></a>json_tokener_state_object_sep&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2ab1a0ad626ec662c1ba4fb5bfee1cd0a9"></a>json_tokener_state_array_after_sep&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2a3a2c9cf26d076936a10a6ae3ca4eb523"></a>json_tokener_state_object_field_start_after_sep&#160;</td><td class="fielddoc"></td></tr>
+<tr><td class="fieldname"><a id="af026dec71e4548e6200eb2f902f1c4e2ab9f6244bfca4924db61ed3050c780b53"></a>json_tokener_state_inf&#160;</td><td class="fielddoc"></td></tr>
 </table>
 
 </div>
 </div>
 <h2 class="groupheader">Function Documentation</h2>
-<a class="anchor" id="a04c5625212aed3216cc303429e47f642"></a>
+<a id="a04c5625212aed3216cc303429e47f642"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a04c5625212aed3216cc303429e47f642">&#9670;&nbsp;</a></span>json_tokener_error_desc()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -301,17 +293,19 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Given an error previously returned by <a class="el" href="json__tokener_8h.html#ae8dff7f1ea11702aecf418e0da5574fe">json_tokener_get_error()</a>, return a human readable description of the error.</p>
+<p>Given an error previously returned by <a class="el" href="json__tokener_8h.html#af5d7ffd95a0f6e5d5bb5994d233b4197">json_tokener_get_error()</a>, return a human readable description of the error.</p>
 <dl class="section return"><dt>Returns</dt><dd>a generic error message is returned if an invalid error value is provided. </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="af6645ff27c0ca82c6e314390814fcbeb"></a>
+<a id="a887c4661906fc6b36cc366304e522534"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a887c4661906fc6b36cc366304e522534">&#9670;&nbsp;</a></span>json_tokener_free()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void json_tokener_free </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void json_tokener_free </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__tokener.html">json_tokener</a> *&#160;</td>
           <td class="paramname"><em>tok</em></td><td>)</td>
@@ -322,12 +316,14 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ae8dff7f1ea11702aecf418e0da5574fe"></a>
+<a id="af5d7ffd95a0f6e5d5bb5994d233b4197"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af5d7ffd95a0f6e5d5bb5994d233b4197">&#9670;&nbsp;</a></span>json_tokener_get_error()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">enum <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a> json_tokener_get_error </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> enum <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a> json_tokener_get_error </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__tokener.html">json_tokener</a> *&#160;</td>
           <td class="paramname"><em>tok</em></td><td>)</td>
@@ -335,18 +331,20 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Retrieve the error caused by the last call to <a class="el" href="json__tokener_8h.html#a0d9a666c21879647e8831f9cfa691673">json_tokener_parse_ex()</a>, or json_tokener_success if there is no error.</p>
+<p>Retrieve the error caused by the last call to <a class="el" href="json__tokener_8h.html#a61679f178111963a9ffa3c8179553f7a">json_tokener_parse_ex()</a>, or json_tokener_success if there is no error.</p>
 <p>When parsing a JSON string in pieces, if the tokener is in the middle of parsing this will return json_tokener_continue.</p>
 <p>See also <a class="el" href="json__tokener_8h.html#a04c5625212aed3216cc303429e47f642">json_tokener_error_desc()</a>. </p>
 
 </div>
 </div>
-<a class="anchor" id="a55d6e8a6f6d90992c063a39e21769c52"></a>
+<a id="a5ac7e2c350bc592cf2fa7b9935b00ef5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5ac7e2c350bc592cf2fa7b9935b00ef5">&#9670;&nbsp;</a></span>json_tokener_new()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__tokener.html">json_tokener</a>* json_tokener_new </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__tokener.html">json_tokener</a>* json_tokener_new </td>
           <td>(</td>
           <td class="paramtype">void&#160;</td>
           <td class="paramname"></td><td>)</td>
@@ -357,12 +355,14 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a8c0696656dba7dde887a71e5c7686057"></a>
+<a id="a6a1583ddd434e13515d6232de813462e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6a1583ddd434e13515d6232de813462e">&#9670;&nbsp;</a></span>json_tokener_new_ex()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__tokener.html">json_tokener</a>* json_tokener_new_ex </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__tokener.html">json_tokener</a>* json_tokener_new_ex </td>
           <td>(</td>
           <td class="paramtype">int&#160;</td>
           <td class="paramname"><em>depth</em></td><td>)</td>
@@ -373,12 +373,14 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="abf031fdf1e5caab71e2225a99588c6bb"></a>
+<a id="a236ef64d079822a4411d13eae7190c4d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a236ef64d079822a4411d13eae7190c4d">&#9670;&nbsp;</a></span>json_tokener_parse()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_tokener_parse </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_tokener_parse </td>
           <td>(</td>
           <td class="paramtype">const char *&#160;</td>
           <td class="paramname"><em>str</em></td><td>)</td>
@@ -389,12 +391,14 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a0d9a666c21879647e8831f9cfa691673"></a>
+<a id="a61679f178111963a9ffa3c8179553f7a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a61679f178111963a9ffa3c8179553f7a">&#9670;&nbsp;</a></span>json_tokener_parse_ex()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_tokener_parse_ex </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_tokener_parse_ex </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__tokener.html">json_tokener</a> *&#160;</td>
           <td class="paramname"><em>tok</em>, </td>
@@ -419,36 +423,16 @@ Functions</h2></td></tr>
       </table>
 </div><div class="memdoc">
 <p>Parse a string and return a non-NULL <a class="el" href="structjson__object.html">json_object</a> 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.</p>
-<p>A partial JSON string can be parsed. If the parsing is incomplete, NULL will be returned and <a class="el" href="json__tokener_8h.html#ae8dff7f1ea11702aecf418e0da5574fe">json_tokener_get_error()</a> will be return json_tokener_continue. <a class="el" href="json__tokener_8h.html#a0d9a666c21879647e8831f9cfa691673">json_tokener_parse_ex()</a> can then be called with additional bytes in str to continue the parsing.</p>
-<p>If <a class="el" href="json__tokener_8h.html#a0d9a666c21879647e8831f9cfa691673">json_tokener_parse_ex()</a> 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 <a class="el" href="json__tokener_8h.html#ae23dd7ad4737bfc18409af6173ab2b09">json_tokener_reset()</a> is called.</p>
-<p>When a valid JSON value is parsed, a non-NULL <a class="el" href="structjson__object.html">json_object</a> will be returned. Also, <a class="el" href="json__tokener_8h.html#ae8dff7f1ea11702aecf418e0da5574fe">json_tokener_get_error()</a> will return json_tokener_success. Be sure to check the type with <a class="el" href="json__object_8h.html#ab6dc8b19f8da310e78f402f83d6ae6c5">json_object_is_type()</a> or <a class="el" href="json__object_8h.html#adc5e998b4897b6e450bd0975a58d2f72">json_object_get_type()</a> before using the object.</p>
+<p>A partial JSON string can be parsed. If the parsing is incomplete, NULL will be returned and <a class="el" href="json__tokener_8h.html#af5d7ffd95a0f6e5d5bb5994d233b4197">json_tokener_get_error()</a> will return json_tokener_continue. <a class="el" href="json__tokener_8h.html#a61679f178111963a9ffa3c8179553f7a">json_tokener_parse_ex()</a> can then be called with additional bytes in str to continue the parsing.</p>
+<p>If <a class="el" href="json__tokener_8h.html#a61679f178111963a9ffa3c8179553f7a">json_tokener_parse_ex()</a> returns NULL and the error is anything other than json_tokener_continue, a fatal error has occurred and parsing must be halted. Then, the tok object must not be reused until <a class="el" href="json__tokener_8h.html#a238649a59737be5152d525aeaf4153ab">json_tokener_reset()</a> is called.</p>
+<p>When a valid JSON value is parsed, a non-NULL <a class="el" href="structjson__object.html">json_object</a> will be returned. Also, <a class="el" href="json__tokener_8h.html#af5d7ffd95a0f6e5d5bb5994d233b4197">json_tokener_get_error()</a> will return json_tokener_success. Be sure to check the type with <a class="el" href="json__object_8h.html#a8ab506a3d8f4ba5eb6a12ce0a6bbd37b">json_object_is_type()</a> or <a class="el" href="json__object_8h.html#af256a3a7910e271a2b9735e5044c3827">json_object_get_type()</a> before using the object.</p>
 <p><b>XXX</b> 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.</p>
 <p>Extra characters can be detected by comparing the tok-&gt;char_offset against the length of the last len parameter passed in.</p>
 <p>The tokener does <b>not</b> 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.</p>
 <p>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)</p>
-<p>Example: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;json_object *jobj = NULL;</div>
-<div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;const char *mystring = NULL;</div>
-<div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;int stringlen = 0;</div>
-<div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;enum json_tokener_error jerr;</div>
-<div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;do {</div>
-<div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;        mystring = ...  // get JSON string, e.g. read from file, etc...</div>
-<div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;        stringlen = strlen(mystring);</div>
-<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;        jobj = json_tokener_parse_ex(tok, mystring, stringlen);</div>
-<div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;} while ((jerr = json_tokener_get_error(tok)) == json_tokener_continue);</div>
-<div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;if (jerr != json_tokener_success)</div>
-<div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;{</div>
-<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;        fprintf(stderr, &quot;Error: %s\n&quot;, json_tokener_error_desc(jerr));</div>
-<div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;        // Handle errors, as appropriate for your application.</div>
-<div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;}</div>
-<div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;if (tok-&gt;char_offset &lt; stringlen) // XXX shouldn&#39;t access internal fields</div>
-<div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;{</div>
-<div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;        // Handle extra characters after parsed object as desired.</div>
-<div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;        // e.g. issue an error, parse another object from that point, etc...</div>
-<div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;}</div>
-<div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;// Success, use jobj here.</div>
-</div><!-- fragment --><dl class="params"><dt>Parameters</dt><dd>
+<p>Example: </p><div class="fragment"><div class="line"><a class="code" href="structjson__object.html">json_object</a> *jobj = NULL;</div><div class="line"><span class="keyword">const</span> <span class="keywordtype">char</span> *mystring = NULL;</div><div class="line"><span class="keywordtype">int</span> stringlen = 0;</div><div class="line"><span class="keyword">enum</span> <a class="code" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a> jerr;</div><div class="line"><span class="keywordflow">do</span> {</div><div class="line">        mystring = ...  <span class="comment">// get JSON string, e.g. read from file, etc...</span></div><div class="line">        stringlen = strlen(mystring);</div><div class="line">        jobj = <a class="code" href="json__tokener_8h.html#a61679f178111963a9ffa3c8179553f7a">json_tokener_parse_ex</a>(tok, mystring, stringlen);</div><div class="line">} <span class="keywordflow">while</span> ((jerr = <a class="code" href="json__tokener_8h.html#af5d7ffd95a0f6e5d5bb5994d233b4197">json_tokener_get_error</a>(tok)) == <a class="code" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a9b26e920ca765df91c84e999561d8fb0">json_tokener_continue</a>);</div><div class="line"><span class="keywordflow">if</span> (jerr != <a class="code" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59afe2fa9bde03155019b2df30f66a5fcd0">json_tokener_success</a>)</div><div class="line">{</div><div class="line">        fprintf(stderr, <span class="stringliteral">&quot;Error: %s\n&quot;</span>, <a class="code" href="json__tokener_8h.html#a04c5625212aed3216cc303429e47f642">json_tokener_error_desc</a>(jerr));</div><div class="line">        <span class="comment">// Handle errors, as appropriate for your application.</span></div><div class="line">}</div><div class="line"><span class="keywordflow">if</span> (tok-&gt;char_offset &lt; stringlen) <span class="comment">// XXX shouldn&#39;t access internal fields</span></div><div class="line">{</div><div class="line">        <span class="comment">// Handle extra characters after parsed object as desired.</span></div><div class="line">        <span class="comment">// e.g. issue an error, parse another object from that point, etc...</span></div><div class="line">}</div><div class="line"><span class="comment">// Success, use jobj here.</span></div></div><!-- fragment --><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">tok</td><td>a <a class="el" href="structjson__tokener.html">json_tokener</a> previously allocated with <a class="el" href="json__tokener_8h.html#a55d6e8a6f6d90992c063a39e21769c52">json_tokener_new()</a> </td></tr>
+    <tr><td class="paramname">tok</td><td>a <a class="el" href="structjson__tokener.html">json_tokener</a> previously allocated with <a class="el" href="json__tokener_8h.html#a5ac7e2c350bc592cf2fa7b9935b00ef5">json_tokener_new()</a> </td></tr>
     <tr><td class="paramname">str</td><td>an string with any valid JSON expression, or portion of. This does not need to be null terminated. </td></tr>
     <tr><td class="paramname">len</td><td>the length of str </td></tr>
   </table>
@@ -457,12 +441,14 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a1c8f5d8baad383dc8879615d2b02b53c"></a>
+<a id="a735f2dc755d57ed5c5b807aaaaef3b14"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a735f2dc755d57ed5c5b807aaaaef3b14">&#9670;&nbsp;</a></span>json_tokener_parse_verbose()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_tokener_parse_verbose </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> struct <a class="el" href="structjson__object.html">json_object</a>* json_tokener_parse_verbose </td>
           <td>(</td>
           <td class="paramtype">const char *&#160;</td>
           <td class="paramname"><em>str</em>, </td>
@@ -483,12 +469,14 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ae23dd7ad4737bfc18409af6173ab2b09"></a>
+<a id="a238649a59737be5152d525aeaf4153ab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a238649a59737be5152d525aeaf4153ab">&#9670;&nbsp;</a></span>json_tokener_reset()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void json_tokener_reset </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void json_tokener_reset </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__tokener.html">json_tokener</a> *&#160;</td>
           <td class="paramname"><em>tok</em></td><td>)</td>
@@ -499,12 +487,14 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="aaaee020e15fe8a8fcc4ce1e81b610e36"></a>
+<a id="a7e7a0c0c9dc79e5e47b2608bb8aad7b7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7e7a0c0c9dc79e5e47b2608bb8aad7b7">&#9670;&nbsp;</a></span>json_tokener_set_flags()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void json_tokener_set_flags </td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> void json_tokener_set_flags </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structjson__tokener.html">json_tokener</a> *&#160;</td>
           <td class="paramname"><em>tok</em>, </td>
@@ -529,9 +519,9 @@ Functions</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 11:44:54 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index bcd7497..92c110d 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: json_util.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
 <div class="title">json_util.h File Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
+
+<p>Miscllaneous utility functions and macros.  
+<a href="#details">More...</a></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
 Macros</h2></td></tr>
+<tr class="memitem:a3dde282dc23d0eaa3c4840df8dc262d4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#a3dde282dc23d0eaa3c4840df8dc262d4">json_min</a>(a,  b)&#160;&#160;&#160;((a) &lt; (b) ? (a) : (b))</td></tr>
+<tr class="separator:a3dde282dc23d0eaa3c4840df8dc262d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57d63d199d4b9ea40359253618951300"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#a57d63d199d4b9ea40359253618951300">json_max</a>(a,  b)&#160;&#160;&#160;((a) &gt; (b) ? (a) : (b))</td></tr>
+<tr class="separator:a57d63d199d4b9ea40359253618951300"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a084b6afc8f7fbef88976aabe4aca7efd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#a084b6afc8f7fbef88976aabe4aca7efd">JSON_FILE_BUF_SIZE</a>&#160;&#160;&#160;4096</td></tr>
 <tr class="separator:a084b6afc8f7fbef88976aabe4aca7efd"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
@@ -60,10 +62,16 @@ Macros</h2></td></tr>
 Functions</h2></td></tr>
 <tr class="memitem:a8fa0bba6b7ddb149a2159d99bae709ce"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#a8fa0bba6b7ddb149a2159d99bae709ce">json_object_from_file</a> (const char *filename)</td></tr>
 <tr class="separator:a8fa0bba6b7ddb149a2159d99bae709ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62ba7e0f43eb72c418654acf4e263aa6"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#a62ba7e0f43eb72c418654acf4e263aa6">json_object_from_fd</a> (int fd)</td></tr>
+<tr class="separator:a62ba7e0f43eb72c418654acf4e263aa6"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:abbd121df84ec3878a5cb8fefaff12ec7"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#abbd121df84ec3878a5cb8fefaff12ec7">json_object_to_file</a> (const char *filename, struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
 <tr class="separator:abbd121df84ec3878a5cb8fefaff12ec7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a4e980954930951bf790c1ec3ba68fb76"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#a4e980954930951bf790c1ec3ba68fb76">json_object_to_file_ext</a> (const char *filename, struct <a class="el" href="structjson__object.html">json_object</a> *obj, int flags)</td></tr>
 <tr class="separator:a4e980954930951bf790c1ec3ba68fb76"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adc52c3b220effc880270f095cd748433"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#adc52c3b220effc880270f095cd748433">json_object_to_fd</a> (int fd, struct <a class="el" href="structjson__object.html">json_object</a> *obj, int flags)</td></tr>
+<tr class="separator:adc52c3b220effc880270f095cd748433"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a811b1a5a7544337811a44c26fbe88761"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#a811b1a5a7544337811a44c26fbe88761">json_util_get_last_err</a> (void)</td></tr>
+<tr class="separator:a811b1a5a7544337811a44c26fbe88761"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a9bb9882ef2859ca2c1ee17805679bc25"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#a9bb9882ef2859ca2c1ee17805679bc25">json_parse_int64</a> (const char *buf, int64_t *retval)</td></tr>
 <tr class="separator:a9bb9882ef2859ca2c1ee17805679bc25"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a6b5790c15178b6ea97841fc5868b1e1a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#a6b5790c15178b6ea97841fc5868b1e1a">json_parse_double</a> (const char *buf, double *retval)</td></tr>
@@ -71,8 +79,12 @@ Functions</h2></td></tr>
 <tr class="memitem:a74031a1b948dc9fed3f367ea6ce78389"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#a74031a1b948dc9fed3f367ea6ce78389">json_type_to_name</a> (enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a> o_type)</td></tr>
 <tr class="separator:a74031a1b948dc9fed3f367ea6ce78389"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
-<h2 class="groupheader">Macro Definition Documentation</h2>
-<a class="anchor" id="a084b6afc8f7fbef88976aabe4aca7efd"></a>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Miscllaneous utility functions and macros. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a084b6afc8f7fbef88976aabe4aca7efd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a084b6afc8f7fbef88976aabe4aca7efd">&#9670;&nbsp;</a></span>JSON_FILE_BUF_SIZE</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -84,8 +96,87 @@ Functions</h2></td></tr>
 
 </div>
 </div>
+<a id="a57d63d199d4b9ea40359253618951300"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57d63d199d4b9ea40359253618951300">&#9670;&nbsp;</a></span>json_max</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define json_max</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">a, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((a) &gt; (b) ? (a) : (b))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a3dde282dc23d0eaa3c4840df8dc262d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3dde282dc23d0eaa3c4840df8dc262d4">&#9670;&nbsp;</a></span>json_min</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define json_min</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">a, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((a) &lt; (b) ? (a) : (b))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
 <h2 class="groupheader">Function Documentation</h2>
-<a class="anchor" id="a8fa0bba6b7ddb149a2159d99bae709ce"></a>
+<a id="a62ba7e0f43eb72c418654acf4e263aa6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62ba7e0f43eb72c418654acf4e263aa6">&#9670;&nbsp;</a></span>json_object_from_fd()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* json_object_from_fd </td>
+          <td>(</td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>fd</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create a JSON object from already opened file descriptor.</p>
+<p>This function can be helpful, when you opened the file already, e.g. when you have a temp file. Note, that the fd must be readable at the actual position, i.e. use lseek(fd, 0, SEEK_SET) before.</p>
+<p>Returns -1 if something fails. See <a class="el" href="json__util_8h.html#a811b1a5a7544337811a44c26fbe88761">json_util_get_last_err()</a> for details. </p>
+
+</div>
+</div>
+<a id="a8fa0bba6b7ddb149a2159d99bae709ce"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8fa0bba6b7ddb149a2159d99bae709ce">&#9670;&nbsp;</a></span>json_object_from_file()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -98,10 +189,58 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
+<p>Read the full contents of the given file, then convert it to a <a class="el" href="structjson__object.html">json_object</a> using <a class="el" href="json__tokener_8h.html#a236ef64d079822a4411d13eae7190c4d">json_tokener_parse()</a>.</p>
+<p>Returns -1 if something fails. See <a class="el" href="json__util_8h.html#a811b1a5a7544337811a44c26fbe88761">json_util_get_last_err()</a> for details. </p>
+
+</div>
+</div>
+<a id="adc52c3b220effc880270f095cd748433"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adc52c3b220effc880270f095cd748433">&#9670;&nbsp;</a></span>json_object_to_fd()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int json_object_to_fd </td>
+          <td>(</td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>fd</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>flags</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Convert the <a class="el" href="structjson__object.html">json_object</a> to a string and write it to the file descriptor. Handles partial writes and will keep writing until done, or an error occurs.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">fd</td><td>an open, writable file descriptor to write to </td></tr>
+    <tr><td class="paramname">obj</td><td>the object to serializer and write </td></tr>
+    <tr><td class="paramname">flags</td><td>flags to pass to <a class="el" href="json__object_8h.html#a9db613127bd4ef7db42307e43a85fc1b">json_object_to_json_string_ext()</a> </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1 if something fails. See <a class="el" href="json__util_8h.html#a811b1a5a7544337811a44c26fbe88761">json_util_get_last_err()</a> for details. </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="abbd121df84ec3878a5cb8fefaff12ec7"></a>
+<a id="abbd121df84ec3878a5cb8fefaff12ec7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abbd121df84ec3878a5cb8fefaff12ec7">&#9670;&nbsp;</a></span>json_object_to_file()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -124,10 +263,14 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
+<p>Equivalent to: json_object_to_file_ext(filename, obj, JSON_C_TO_STRING_PLAIN);</p>
+<p>Returns -1 if something fails. See <a class="el" href="json__util_8h.html#a811b1a5a7544337811a44c26fbe88761">json_util_get_last_err()</a> for details. </p>
 
 </div>
 </div>
-<a class="anchor" id="a4e980954930951bf790c1ec3ba68fb76"></a>
+<a id="a4e980954930951bf790c1ec3ba68fb76"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4e980954930951bf790c1ec3ba68fb76">&#9670;&nbsp;</a></span>json_object_to_file_ext()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -156,10 +299,14 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
+<p>Open and truncate the given file, creating it if necessary, then convert the <a class="el" href="structjson__object.html">json_object</a> to a string and write it to the file.</p>
+<p>Returns -1 if something fails. See <a class="el" href="json__util_8h.html#a811b1a5a7544337811a44c26fbe88761">json_util_get_last_err()</a> for details. </p>
 
 </div>
 </div>
-<a class="anchor" id="a6b5790c15178b6ea97841fc5868b1e1a"></a>
+<a id="a6b5790c15178b6ea97841fc5868b1e1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6b5790c15178b6ea97841fc5868b1e1a">&#9670;&nbsp;</a></span>json_parse_double()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -185,7 +332,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a9bb9882ef2859ca2c1ee17805679bc25"></a>
+<a id="a9bb9882ef2859ca2c1ee17805679bc25"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9bb9882ef2859ca2c1ee17805679bc25">&#9670;&nbsp;</a></span>json_parse_int64()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -211,7 +360,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a74031a1b948dc9fed3f367ea6ce78389"></a>
+<a id="a74031a1b948dc9fed3f367ea6ce78389"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a74031a1b948dc9fed3f367ea6ce78389">&#9670;&nbsp;</a></span>json_type_to_name()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -228,12 +379,31 @@ Functions</h2></td></tr>
 
 </div>
 </div>
+<a id="a811b1a5a7544337811a44c26fbe88761"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a811b1a5a7544337811a44c26fbe88761">&#9670;&nbsp;</a></span>json_util_get_last_err()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* json_util_get_last_err </td>
+          <td>(</td>
+          <td class="paramtype">void&#160;</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return the last error from various json-c functions, including: json_object_to_file{,<em>ext}, <a class="el" href="json__util_8h.html#adc52c3b220effc880270f095cd748433">json_object_to_fd()</a> or json_object_from</em>{file,fd}, or NULL if there is none. </p>
+
+</div>
+</div>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 02:45:10 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
diff --git a/doc/html/json__visit_8h.html b/doc/html/json__visit_8h.html
new file mode 100644 (file)
index 0000000..e99f353
--- /dev/null
@@ -0,0 +1,250 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>json-c: json_visit.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">json-c
+   &#160;<span id="projectnumber">0.13</span>
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">json_visit.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Methods for walking a tree of objects.  
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ac5be4a96b99b724833943003715dfc1c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__visit_8h.html#ac5be4a96b99b724833943003715dfc1c">JSON_C_VISIT_SECOND</a>&#160;&#160;&#160;0x02</td></tr>
+<tr class="separator:ac5be4a96b99b724833943003715dfc1c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a98b35e1ba1d52d41799dccbfd2c170a1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__visit_8h.html#a98b35e1ba1d52d41799dccbfd2c170a1">JSON_C_VISIT_RETURN_CONTINUE</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a98b35e1ba1d52d41799dccbfd2c170a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adc7ca60a79c4ae870d9463e41527c2a1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__visit_8h.html#adc7ca60a79c4ae870d9463e41527c2a1">JSON_C_VISIT_RETURN_SKIP</a>&#160;&#160;&#160;7547</td></tr>
+<tr class="separator:adc7ca60a79c4ae870d9463e41527c2a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a327a21f1f1c6f84e7a13fbaaf4a51b13"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__visit_8h.html#a327a21f1f1c6f84e7a13fbaaf4a51b13">JSON_C_VISIT_RETURN_POP</a>&#160;&#160;&#160;767</td></tr>
+<tr class="separator:a327a21f1f1c6f84e7a13fbaaf4a51b13"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5956f41bed48f90a127f9b37fad7ea97"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__visit_8h.html#a5956f41bed48f90a127f9b37fad7ea97">JSON_C_VISIT_RETURN_STOP</a>&#160;&#160;&#160;7867</td></tr>
+<tr class="separator:a5956f41bed48f90a127f9b37fad7ea97"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abfacb0713b81c897a8ce5f37ff6ffb9c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__visit_8h.html#abfacb0713b81c897a8ce5f37ff6ffb9c">JSON_C_VISIT_RETURN_ERROR</a>&#160;&#160;&#160;-1</td></tr>
+<tr class="separator:abfacb0713b81c897a8ce5f37ff6ffb9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a9e5b550cfae3f9cecd7a95b2cae336e0"><td class="memItemLeft" align="right" valign="top">typedef int()&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__visit_8h.html#a9e5b550cfae3f9cecd7a95b2cae336e0">json_c_visit_userfunc</a>(<a class="el" href="structjson__object.html">json_object</a> *jso, int flags, <a class="el" href="structjson__object.html">json_object</a> *parent_jso, const char *jso_key, size_t *jso_index, void *userarg)</td></tr>
+<tr class="separator:a9e5b550cfae3f9cecd7a95b2cae336e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac13d0e2e7bf34cd1be6eee3f0f112045"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__visit_8h.html#ac13d0e2e7bf34cd1be6eee3f0f112045">json_c_visit</a> (<a class="el" href="structjson__object.html">json_object</a> *jso, int future_flags, <a class="el" href="json__visit_8h.html#a9e5b550cfae3f9cecd7a95b2cae336e0">json_c_visit_userfunc</a> *userfunc, void *userarg)</td></tr>
+<tr class="separator:ac13d0e2e7bf34cd1be6eee3f0f112045"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Methods for walking a tree of objects. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a98b35e1ba1d52d41799dccbfd2c170a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a98b35e1ba1d52d41799dccbfd2c170a1">&#9670;&nbsp;</a></span>JSON_C_VISIT_RETURN_CONTINUE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_VISIT_RETURN_CONTINUE&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This json_c_visit_userfunc return value indicates that iteration should proceed normally. </p>
+
+</div>
+</div>
+<a id="abfacb0713b81c897a8ce5f37ff6ffb9c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abfacb0713b81c897a8ce5f37ff6ffb9c">&#9670;&nbsp;</a></span>JSON_C_VISIT_RETURN_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_VISIT_RETURN_ERROR&#160;&#160;&#160;-1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This json_c_visit_userfunc return value indicates that iteration should stop immediately, and cause json_c_visit to return an error. </p>
+
+</div>
+</div>
+<a id="a327a21f1f1c6f84e7a13fbaaf4a51b13"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a327a21f1f1c6f84e7a13fbaaf4a51b13">&#9670;&nbsp;</a></span>JSON_C_VISIT_RETURN_POP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_VISIT_RETURN_POP&#160;&#160;&#160;767</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This json_c_visit_userfunc return value indicates that iteration of the fields/elements of the <b>containing</b> object should stop and continue "popped up" a level of the object hierarchy. For example, returning this when handling arg will result in arg3 and any other fields being skipped. The next call to userfunc will be the JSON_C_VISIT_SECOND call on "foo", followed by a userfunc call on "bar". </p><pre>
+{
+  "foo": {
+    "arg1": 1,
+    "arg2": 2,
+    "arg3": 3,
+    ...
+  },
+  "bar": {
+    ...
+  }
+}
+</pre> 
+</div>
+</div>
+<a id="adc7ca60a79c4ae870d9463e41527c2a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adc7ca60a79c4ae870d9463e41527c2a1">&#9670;&nbsp;</a></span>JSON_C_VISIT_RETURN_SKIP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_VISIT_RETURN_SKIP&#160;&#160;&#160;7547</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This json_c_visit_userfunc return value indicates that iteration over the members of the current object should be skipped. If the current object isn't a container (array or object), this is no different than JSON_C_VISIT_RETURN_CONTINUE. </p>
+
+</div>
+</div>
+<a id="a5956f41bed48f90a127f9b37fad7ea97"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5956f41bed48f90a127f9b37fad7ea97">&#9670;&nbsp;</a></span>JSON_C_VISIT_RETURN_STOP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_VISIT_RETURN_STOP&#160;&#160;&#160;7867</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This json_c_visit_userfunc return value indicates that iteration should stop immediately, and cause json_c_visit to return success. </p>
+
+</div>
+</div>
+<a id="ac5be4a96b99b724833943003715dfc1c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac5be4a96b99b724833943003715dfc1c">&#9670;&nbsp;</a></span>JSON_C_VISIT_SECOND</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_VISIT_SECOND&#160;&#160;&#160;0x02</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Passed to json_c_visit_userfunc as one of the flags values to indicate that this is the second time a container (array or object) is being called, after all of it's members have been iterated over. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="a9e5b550cfae3f9cecd7a95b2cae336e0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9e5b550cfae3f9cecd7a95b2cae336e0">&#9670;&nbsp;</a></span>json_c_visit_userfunc</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef int() json_c_visit_userfunc(<a class="el" href="structjson__object.html">json_object</a> *jso, int flags, <a class="el" href="structjson__object.html">json_object</a> *parent_jso, const char *jso_key, size_t *jso_index, void *userarg)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ac13d0e2e7bf34cd1be6eee3f0f112045"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac13d0e2e7bf34cd1be6eee3f0f112045">&#9670;&nbsp;</a></span>json_c_visit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int json_c_visit </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structjson__object.html">json_object</a> *&#160;</td>
+          <td class="paramname"><em>jso</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>future_flags</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="json__visit_8h.html#a9e5b550cfae3f9cecd7a95b2cae336e0">json_c_visit_userfunc</a> *&#160;</td>
+          <td class="paramname"><em>userfunc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>userarg</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Visit each object in the JSON hierarchy starting at jso. For each object, userfunc is called, passing the object and userarg. If the object has a parent (i.e. anything other than jso itself) its parent will be passed as parent_jso, and either jso_key or jso_index will be set, depending on whether the parent is an object or an array.</p>
+<p>Nodes will be visited depth first, but containers (arrays and objects) will be visited twice, the second time with JSON_C_VISIT_SECOND set in flags.</p>
+<p>userfunc must return one of the defined return values, to indicate whether and how to continue visiting nodes, or one of various ways to stop.</p>
+<p>Returns 0 if nodes were visited successfully, even if some were intentionally skipped due to what userfunc returned. Returns &lt;0 if an error occurred during iteration, including if userfunc returned JSON_C_VISIT_RETURN_ERROR. </p>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
index f31b29d..520164a 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: linkhash.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
@@ -52,6 +47,9 @@
 <div class="title">linkhash.h File Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
+
+<p>Internal methods for working with json_type_object objects. Although this is exposed by the <a class="el" href="json__object_8h.html#a2caa52ae1863bd073444f3737138a4db">json_object_get_object()</a> function and within the <a class="el" href="structjson__object__iter.html">json_object_iter</a> type, it is not recommended for direct use.  
+<a href="#details">More...</a></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
 Data Structures</h2></td></tr>
@@ -70,44 +68,56 @@ Macros</h2></td></tr>
 <tr class="separator:a93fad7f8ae44575dc89c9567859972d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ac69428f2de0a6fb080b6fb373d506aa7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#ac69428f2de0a6fb080b6fb373d506aa7">LH_FREED</a>&#160;&#160;&#160;(void*)-2</td></tr>
 <tr class="separator:ac69428f2de0a6fb080b6fb373d506aa7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac32e80138c5be6dd9b0483a9cbcc8799"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#ac32e80138c5be6dd9b0483a9cbcc8799">JSON_C_STR_HASH_DFLT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ac32e80138c5be6dd9b0483a9cbcc8799"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62316f34fd42941b97a8e9a6b6e68faa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a62316f34fd42941b97a8e9a6b6e68faa">JSON_C_STR_HASH_PERLLIKE</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a62316f34fd42941b97a8e9a6b6e68faa"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ad7dd67da915065dce2c6f44cb03e2d82"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#ad7dd67da915065dce2c6f44cb03e2d82">lh_foreach</a>(table,  entry)&#160;&#160;&#160;for(entry = table-&gt;head; entry; entry = entry-&gt;next)</td></tr>
 <tr class="separator:ad7dd67da915065dce2c6f44cb03e2d82"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:abcbb0df08b4976d0649b826b6bacfca1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#abcbb0df08b4976d0649b826b6bacfca1">lh_foreach_safe</a>(table,  entry,  tmp)&#160;&#160;&#160;for(entry = table-&gt;head; entry &amp;&amp; ((tmp = entry-&gt;next) || 1); entry = tmp)</td></tr>
 <tr class="separator:abcbb0df08b4976d0649b826b6bacfca1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77c5cddef96e6f1ab036ccf911783456"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a77c5cddef96e6f1ab036ccf911783456">_LH_INLINE</a>&#160;&#160;&#160;inline</td></tr>
+<tr class="separator:a77c5cddef96e6f1ab036ccf911783456"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afb856ed4a9bcfd090dde5151fa3ad9ae"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#afb856ed4a9bcfd090dde5151fa3ad9ae">_LH_UNCONST</a>(a)&#160;&#160;&#160;((void *)(uintptr_t)(const void *)(a))</td></tr>
+<tr class="separator:afb856ed4a9bcfd090dde5151fa3ad9ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7579ce28b8366fc9b8656f14270aa3aa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a7579ce28b8366fc9b8656f14270aa3aa">lh_entry_k</a>(entry)&#160;&#160;&#160;<a class="el" href="linkhash_8h.html#afb856ed4a9bcfd090dde5151fa3ad9ae">_LH_UNCONST</a>((entry)-&gt;k)</td></tr>
+<tr class="separator:a7579ce28b8366fc9b8656f14270aa3aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0d4052ccfd8c5d351a9c1d3ba07671b3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a0d4052ccfd8c5d351a9c1d3ba07671b3">lh_entry_v</a>(entry)&#160;&#160;&#160;<a class="el" href="linkhash_8h.html#afb856ed4a9bcfd090dde5151fa3ad9ae">_LH_UNCONST</a>((entry)-&gt;v)</td></tr>
+<tr class="separator:a0d4052ccfd8c5d351a9c1d3ba07671b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
 Typedefs</h2></td></tr>
-<tr class="memitem:a0c6811f660b93857aafdbfdf80d9696b"><td class="memItemLeft" align="right" valign="top">typedef void(&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a0c6811f660b93857aafdbfdf80d9696b">lh_entry_free_fn</a>) (struct <a class="el" href="structlh__entry.html">lh_entry</a> *e)</td></tr>
-<tr class="separator:a0c6811f660b93857aafdbfdf80d9696b"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a1780449146b716ad5e6ed0a0207d0417"><td class="memItemLeft" align="right" valign="top">typedef unsigned long(&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a1780449146b716ad5e6ed0a0207d0417">lh_hash_fn</a>) (const void *k)</td></tr>
-<tr class="separator:a1780449146b716ad5e6ed0a0207d0417"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:abcbf0e4849fb0c6279827ac3b66d15c3"><td class="memItemLeft" align="right" valign="top">typedef int(&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#abcbf0e4849fb0c6279827ac3b66d15c3">lh_equal_fn</a>) (const void *k1, const void *k2)</td></tr>
-<tr class="separator:abcbf0e4849fb0c6279827ac3b66d15c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a481b0bb1ab1d6a83713d9c27aa9f07d2"><td class="memItemLeft" align="right" valign="top">typedef void()&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a481b0bb1ab1d6a83713d9c27aa9f07d2">lh_entry_free_fn</a>(struct <a class="el" href="structlh__entry.html">lh_entry</a> *e)</td></tr>
+<tr class="separator:a481b0bb1ab1d6a83713d9c27aa9f07d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a91d16eb45069d235a198d2184a77d0ae"><td class="memItemLeft" align="right" valign="top">typedef unsigned long()&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a91d16eb45069d235a198d2184a77d0ae">lh_hash_fn</a>(const void *k)</td></tr>
+<tr class="separator:a91d16eb45069d235a198d2184a77d0ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af74a0690267598a0ed6f0a9b66674573"><td class="memItemLeft" align="right" valign="top">typedef int()&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#af74a0690267598a0ed6f0a9b66674573">lh_equal_fn</a>(const void *k1, const void *k2)</td></tr>
+<tr class="separator:af74a0690267598a0ed6f0a9b66674573"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a766e90057496fc6712d6be0da180a21f"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structlh__table.html">lh_table</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a766e90057496fc6712d6be0da180a21f">lh_table</a></td></tr>
+<tr class="separator:a766e90057496fc6712d6be0da180a21f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:a2e560f0d3e5a20f6b0bfa4049737db23"><td class="memItemLeft" align="right" valign="top">unsigned long&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a2e560f0d3e5a20f6b0bfa4049737db23">lh_ptr_hash</a> (const void *k)</td></tr>
-<tr class="separator:a2e560f0d3e5a20f6b0bfa4049737db23"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a6ce3cb97560072c40f5caeaba85f756a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a6ce3cb97560072c40f5caeaba85f756a">lh_ptr_equal</a> (const void *k1, const void *k2)</td></tr>
-<tr class="separator:a6ce3cb97560072c40f5caeaba85f756a"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a1fcf495b9c4ce169630cb31f638b8435"><td class="memItemLeft" align="right" valign="top">unsigned long&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a1fcf495b9c4ce169630cb31f638b8435">lh_char_hash</a> (const void *k)</td></tr>
-<tr class="separator:a1fcf495b9c4ce169630cb31f638b8435"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ae4e9f21fb1a556c7a50c6b7ea61f2079"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#ae4e9f21fb1a556c7a50c6b7ea61f2079">lh_char_equal</a> (const void *k1, const void *k2)</td></tr>
-<tr class="separator:ae4e9f21fb1a556c7a50c6b7ea61f2079"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ac3ba464ac43c083397b1f1d34f2ddf55"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__table.html">lh_table</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#ac3ba464ac43c083397b1f1d34f2ddf55">lh_table_new</a> (int size, const char *name, <a class="el" href="linkhash_8h.html#a0c6811f660b93857aafdbfdf80d9696b">lh_entry_free_fn</a> *free_fn, <a class="el" href="linkhash_8h.html#a1780449146b716ad5e6ed0a0207d0417">lh_hash_fn</a> *hash_fn, <a class="el" href="linkhash_8h.html#abcbf0e4849fb0c6279827ac3b66d15c3">lh_equal_fn</a> *equal_fn)</td></tr>
-<tr class="separator:ac3ba464ac43c083397b1f1d34f2ddf55"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a0aaf11e11ee5b0925279a52eab04bc38"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__table.html">lh_table</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a0aaf11e11ee5b0925279a52eab04bc38">lh_kchar_table_new</a> (int size, const char *name, <a class="el" href="linkhash_8h.html#a0c6811f660b93857aafdbfdf80d9696b">lh_entry_free_fn</a> *free_fn)</td></tr>
-<tr class="separator:a0aaf11e11ee5b0925279a52eab04bc38"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a705513954267a16cc1d40a284a7c441e"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__table.html">lh_table</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a705513954267a16cc1d40a284a7c441e">lh_kptr_table_new</a> (int size, const char *name, <a class="el" href="linkhash_8h.html#a0c6811f660b93857aafdbfdf80d9696b">lh_entry_free_fn</a> *free_fn)</td></tr>
-<tr class="separator:a705513954267a16cc1d40a284a7c441e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac8e1d61af44d9c0824d8c7980385bcd3"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#ac8e1d61af44d9c0824d8c7980385bcd3">json_global_set_string_hash</a> (const int h)</td></tr>
+<tr class="separator:ac8e1d61af44d9c0824d8c7980385bcd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9c4f8a71dbe4d3390d9f7adb331beb0e"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__table.html">lh_table</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a9c4f8a71dbe4d3390d9f7adb331beb0e">lh_table_new</a> (int size, <a class="el" href="linkhash_8h.html#a481b0bb1ab1d6a83713d9c27aa9f07d2">lh_entry_free_fn</a> *free_fn, <a class="el" href="linkhash_8h.html#a91d16eb45069d235a198d2184a77d0ae">lh_hash_fn</a> *hash_fn, <a class="el" href="linkhash_8h.html#af74a0690267598a0ed6f0a9b66674573">lh_equal_fn</a> *equal_fn)</td></tr>
+<tr class="separator:a9c4f8a71dbe4d3390d9f7adb331beb0e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6bf630754affe92612639542a6c49c3f"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__table.html">lh_table</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a6bf630754affe92612639542a6c49c3f">lh_kchar_table_new</a> (int size, <a class="el" href="linkhash_8h.html#a481b0bb1ab1d6a83713d9c27aa9f07d2">lh_entry_free_fn</a> *free_fn)</td></tr>
+<tr class="separator:a6bf630754affe92612639542a6c49c3f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af8108563b961dbf5471fe2c0e51f40a5"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__table.html">lh_table</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#af8108563b961dbf5471fe2c0e51f40a5">lh_kptr_table_new</a> (int size, <a class="el" href="linkhash_8h.html#a481b0bb1ab1d6a83713d9c27aa9f07d2">lh_entry_free_fn</a> *free_fn)</td></tr>
+<tr class="separator:af8108563b961dbf5471fe2c0e51f40a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a81653acf740cf8c9fe672e6cd16df0cf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a81653acf740cf8c9fe672e6cd16df0cf">lh_table_free</a> (struct <a class="el" href="structlh__table.html">lh_table</a> *t)</td></tr>
 <tr class="separator:a81653acf740cf8c9fe672e6cd16df0cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a22b897763cc34a98c21c7fe82d151004"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a22b897763cc34a98c21c7fe82d151004">lh_table_insert</a> (struct <a class="el" href="structlh__table.html">lh_table</a> *t, void *k, const void *v)</td></tr>
-<tr class="separator:a22b897763cc34a98c21c7fe82d151004"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a86c0cd547be1e2c2486a73bd58e1352c"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a86c0cd547be1e2c2486a73bd58e1352c">lh_table_insert</a> (struct <a class="el" href="structlh__table.html">lh_table</a> *t, const void *k, const void *v)</td></tr>
+<tr class="separator:a86c0cd547be1e2c2486a73bd58e1352c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4558a9347a422e03a15b0b7a29b82dc3"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a4558a9347a422e03a15b0b7a29b82dc3">lh_table_insert_w_hash</a> (struct <a class="el" href="structlh__table.html">lh_table</a> *t, const void *k, const void *v, const unsigned long h, const unsigned opts)</td></tr>
+<tr class="separator:a4558a9347a422e03a15b0b7a29b82dc3"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ad3b6ca2d967a6c3021ee6c39e014a918"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#ad3b6ca2d967a6c3021ee6c39e014a918">lh_table_lookup_entry</a> (struct <a class="el" href="structlh__table.html">lh_table</a> *t, const void *k)</td></tr>
 <tr class="separator:ad3b6ca2d967a6c3021ee6c39e014a918"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a849aa0ce9fe550c16ce81a215b1765ad"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a849aa0ce9fe550c16ce81a215b1765ad">THIS_FUNCTION_IS_DEPRECATED</a> (extern const void *lh_table_lookup(struct <a class="el" href="structlh__table.html">lh_table</a> *t, const void *k))</td></tr>
-<tr class="separator:a849aa0ce9fe550c16ce81a215b1765ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a59ecaf34ef59280952f4459b2de63677"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a59ecaf34ef59280952f4459b2de63677">lh_table_lookup_entry_w_hash</a> (struct <a class="el" href="structlh__table.html">lh_table</a> *t, const void *k, const unsigned long h)</td></tr>
+<tr class="separator:a59ecaf34ef59280952f4459b2de63677"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49c27f18a174eaf126d1b7953df13cb1"><td class="memItemLeft" align="right" valign="top">const void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a49c27f18a174eaf126d1b7953df13cb1">lh_table_lookup</a> (struct <a class="el" href="structlh__table.html">lh_table</a> *t, const void *k)</td></tr>
+<tr class="separator:a49c27f18a174eaf126d1b7953df13cb1"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a81c270bb0dd9d5c8a3e7ae20bc4d67f3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a81c270bb0dd9d5c8a3e7ae20bc4d67f3">lh_table_lookup_ex</a> (struct <a class="el" href="structlh__table.html">lh_table</a> *t, const void *k, void **v)</td></tr>
 <tr class="separator:a81c270bb0dd9d5c8a3e7ae20bc4d67f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae5885a71c3457190fb1dc2d6e20dde3b"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#ae5885a71c3457190fb1dc2d6e20dde3b">lh_table_delete_entry</a> (struct <a class="el" href="structlh__table.html">lh_table</a> *t, struct <a class="el" href="structlh__entry.html">lh_entry</a> *e)</td></tr>
@@ -118,11 +128,79 @@ Functions</h2></td></tr>
 <tr class="separator:ac9ba631c91fe80fb905f04c7cd526f2b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a1294160fa0e80cee04cd745a401f43a4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a1294160fa0e80cee04cd745a401f43a4">lh_abort</a> (const char *msg,...)</td></tr>
 <tr class="separator:a1294160fa0e80cee04cd745a401f43a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a5322eccf3394af7dc1ebb22af8f8c562"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a5322eccf3394af7dc1ebb22af8f8c562">lh_table_resize</a> (struct <a class="el" href="structlh__table.html">lh_table</a> *t, int new_size)</td></tr>
-<tr class="separator:a5322eccf3394af7dc1ebb22af8f8c562"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a30c8414e31aeee7669acc938116d933f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a30c8414e31aeee7669acc938116d933f">lh_table_resize</a> (struct <a class="el" href="structlh__table.html">lh_table</a> *t, int new_size)</td></tr>
+<tr class="separator:a30c8414e31aeee7669acc938116d933f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
-<h2 class="groupheader">Macro Definition Documentation</h2>
-<a class="anchor" id="a93fad7f8ae44575dc89c9567859972d2"></a>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Internal methods for working with json_type_object objects. Although this is exposed by the <a class="el" href="json__object_8h.html#a2caa52ae1863bd073444f3737138a4db">json_object_get_object()</a> function and within the <a class="el" href="structjson__object__iter.html">json_object_iter</a> type, it is not recommended for direct use. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a77c5cddef96e6f1ab036ccf911783456"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a77c5cddef96e6f1ab036ccf911783456">&#9670;&nbsp;</a></span>_LH_INLINE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define _LH_INLINE&#160;&#160;&#160;inline</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000009">Deprecated:</a></b></dt><dd>Don't use this outside of <a class="el" href="linkhash_8h.html" title="Internal methods for working with json_type_object objects. Although this is exposed by the json_obje...">linkhash.h</a>: </dd></dl>
+
+</div>
+</div>
+<a id="afb856ed4a9bcfd090dde5151fa3ad9ae"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afb856ed4a9bcfd090dde5151fa3ad9ae">&#9670;&nbsp;</a></span>_LH_UNCONST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define _LH_UNCONST</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">a</td><td>)</td>
+          <td>&#160;&#160;&#160;((void *)(uintptr_t)(const void *)(a))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000010">Deprecated:</a></b></dt><dd>Don't use this outside of <a class="el" href="linkhash_8h.html" title="Internal methods for working with json_type_object objects. Although this is exposed by the json_obje...">linkhash.h</a>: </dd></dl>
+
+</div>
+</div>
+<a id="ac32e80138c5be6dd9b0483a9cbcc8799"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac32e80138c5be6dd9b0483a9cbcc8799">&#9670;&nbsp;</a></span>JSON_C_STR_HASH_DFLT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_STR_HASH_DFLT&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>default string hash function </p>
+
+</div>
+</div>
+<a id="a62316f34fd42941b97a8e9a6b6e68faa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62316f34fd42941b97a8e9a6b6e68faa">&#9670;&nbsp;</a></span>JSON_C_STR_HASH_PERLLIKE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_STR_HASH_PERLLIKE&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>perl-like string hash function </p>
+
+</div>
+</div>
+<a id="a93fad7f8ae44575dc89c9567859972d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a93fad7f8ae44575dc89c9567859972d2">&#9670;&nbsp;</a></span>LH_EMPTY</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -135,7 +213,49 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ad7dd67da915065dce2c6f44cb03e2d82"></a>
+<a id="a7579ce28b8366fc9b8656f14270aa3aa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7579ce28b8366fc9b8656f14270aa3aa">&#9670;&nbsp;</a></span>lh_entry_k</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define lh_entry_k</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">entry</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="linkhash_8h.html#afb856ed4a9bcfd090dde5151fa3ad9ae">_LH_UNCONST</a>((entry)-&gt;k)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return a non-const version of <a class="el" href="structlh__entry.html#a79d9f1ef0dc444e17105aaeaf167e22c">lh_entry.k</a>.</p>
+<p><a class="el" href="structlh__entry.html#a79d9f1ef0dc444e17105aaeaf167e22c">lh_entry.k</a> is const to indicate and help ensure that linkhash itself doesn't modify it, but callers are allowed to do what they want with it. See also <a class="el" href="structlh__entry.html#a14f40cc124c32b03f81151ae7934d2e7">lh_entry.k_is_constant</a> </p>
+
+</div>
+</div>
+<a id="a0d4052ccfd8c5d351a9c1d3ba07671b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0d4052ccfd8c5d351a9c1d3ba07671b3">&#9670;&nbsp;</a></span>lh_entry_v</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define lh_entry_v</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">entry</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="linkhash_8h.html#afb856ed4a9bcfd090dde5151fa3ad9ae">_LH_UNCONST</a>((entry)-&gt;v)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return a non-const version of <a class="el" href="structlh__entry.html#a1b676732ab2ad3eeaedf6ec60a6a0835">lh_entry.v</a>.</p>
+<p>v is const to indicate and help ensure that linkhash itself doesn't modify it, but callers are allowed to do what they want with it. </p>
+
+</div>
+</div>
+<a id="ad7dd67da915065dce2c6f44cb03e2d82"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad7dd67da915065dce2c6f44cb03e2d82">&#9670;&nbsp;</a></span>lh_foreach</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -162,7 +282,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="abcbb0df08b4976d0649b826b6bacfca1"></a>
+<a id="abcbb0df08b4976d0649b826b6bacfca1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abcbb0df08b4976d0649b826b6bacfca1">&#9670;&nbsp;</a></span>lh_foreach_safe</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -191,11 +313,21 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>lh_foreach_safe allows calling of deletion routine while iterating. </p>
+<p>lh_foreach_safe allows calling of deletion routine while iterating.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">table</td><td>a struct <a class="el" href="structlh__table.html">lh_table</a> * to iterate over </td></tr>
+    <tr><td class="paramname">entry</td><td>a struct <a class="el" href="structlh__entry.html">lh_entry</a> * variable to hold each element </td></tr>
+    <tr><td class="paramname">tmp</td><td>a struct <a class="el" href="structlh__entry.html">lh_entry</a> * variable to hold a temporary pointer to the next element </td></tr>
+  </table>
+  </dd>
+</dl>
 
 </div>
 </div>
-<a class="anchor" id="ac69428f2de0a6fb080b6fb373d506aa7"></a>
+<a id="ac69428f2de0a6fb080b6fb373d506aa7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac69428f2de0a6fb080b6fb373d506aa7">&#9670;&nbsp;</a></span>LH_FREED</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -208,7 +340,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a66b61772c29d85eb52b697e0b0dc0aaf"></a>
+<a id="a66b61772c29d85eb52b697e0b0dc0aaf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a66b61772c29d85eb52b697e0b0dc0aaf">&#9670;&nbsp;</a></span>LH_LOAD_FACTOR</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -221,7 +355,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a032f1bd115df254dda325437203ce5fb"></a>
+<a id="a032f1bd115df254dda325437203ce5fb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a032f1bd115df254dda325437203ce5fb">&#9670;&nbsp;</a></span>LH_PRIME</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -235,12 +371,14 @@ Functions</h2></td></tr>
 </div>
 </div>
 <h2 class="groupheader">Typedef Documentation</h2>
-<a class="anchor" id="a0c6811f660b93857aafdbfdf80d9696b"></a>
+<a id="a481b0bb1ab1d6a83713d9c27aa9f07d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a481b0bb1ab1d6a83713d9c27aa9f07d2">&#9670;&nbsp;</a></span>lh_entry_free_fn</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef void( lh_entry_free_fn) (struct <a class="el" href="structlh__entry.html">lh_entry</a> *e)</td>
+          <td class="memname">typedef void() lh_entry_free_fn(struct <a class="el" href="structlh__entry.html">lh_entry</a> *e)</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -248,12 +386,14 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="abcbf0e4849fb0c6279827ac3b66d15c3"></a>
+<a id="af74a0690267598a0ed6f0a9b66674573"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af74a0690267598a0ed6f0a9b66674573">&#9670;&nbsp;</a></span>lh_equal_fn</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef int( lh_equal_fn) (const void *k1, const void *k2)</td>
+          <td class="memname">typedef int() lh_equal_fn(const void *k1, const void *k2)</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -261,12 +401,14 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a1780449146b716ad5e6ed0a0207d0417"></a>
+<a id="a91d16eb45069d235a198d2184a77d0ae"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a91d16eb45069d235a198d2184a77d0ae">&#9670;&nbsp;</a></span>lh_hash_fn</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef unsigned long( lh_hash_fn) (const void *k)</td>
+          <td class="memname">typedef unsigned long() lh_hash_fn(const void *k)</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -274,96 +416,57 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<h2 class="groupheader">Function Documentation</h2>
-<a class="anchor" id="a1294160fa0e80cee04cd745a401f43a4"></a>
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void lh_abort </td>
-          <td>(</td>
-          <td class="paramtype">const char *&#160;</td>
-          <td class="paramname"><em>msg</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">&#160;</td>
-          <td class="paramname"><em>...</em>&#160;</td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td>
-        </tr>
-      </table>
-</div><div class="memdoc">
+<a id="a766e90057496fc6712d6be0da180a21f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a766e90057496fc6712d6be0da180a21f">&#9670;&nbsp;</a></span>lh_table</h2>
 
-</div>
-</div>
-<a class="anchor" id="ae4e9f21fb1a556c7a50c6b7ea61f2079"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int lh_char_equal </td>
-          <td>(</td>
-          <td class="paramtype">const void *&#160;</td>
-          <td class="paramname"><em>k1</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">const void *&#160;</td>
-          <td class="paramname"><em>k2</em>&#160;</td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td>
+          <td class="memname">typedef struct <a class="el" href="structlh__table.html">lh_table</a> <a class="el" href="structlh__table.html">lh_table</a></td>
         </tr>
       </table>
 </div><div class="memdoc">
 
 </div>
 </div>
-<a class="anchor" id="a1fcf495b9c4ce169630cb31f638b8435"></a>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ac8e1d61af44d9c0824d8c7980385bcd3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac8e1d61af44d9c0824d8c7980385bcd3">&#9670;&nbsp;</a></span>json_global_set_string_hash()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">unsigned long lh_char_hash </td>
+          <td class="memname">int json_global_set_string_hash </td>
           <td>(</td>
-          <td class="paramtype">const void *&#160;</td>
-          <td class="paramname"><em>k</em></td><td>)</td>
+          <td class="paramtype">const int&#160;</td>
+          <td class="paramname"><em>h</em></td><td>)</td>
           <td></td>
         </tr>
       </table>
 </div><div class="memdoc">
+<p>This function sets the hash function to be used for strings. Must be one of the JSON_C_STR_HASH_* values. </p><dl class="section return"><dt>Returns</dt><dd>0 - ok, -1 if parameter was invalid </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="a0aaf11e11ee5b0925279a52eab04bc38"></a>
+<a id="a1294160fa0e80cee04cd745a401f43a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1294160fa0e80cee04cd745a401f43a4">&#9670;&nbsp;</a></span>lh_abort()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structlh__table.html">lh_table</a>* lh_kchar_table_new </td>
+          <td class="memname">void lh_abort </td>
           <td>(</td>
-          <td class="paramtype">int&#160;</td>
-          <td class="paramname"><em>size</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
           <td class="paramtype">const char *&#160;</td>
-          <td class="paramname"><em>name</em>, </td>
+          <td class="paramname"><em>msg</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype"><a class="el" href="linkhash_8h.html#a0c6811f660b93857aafdbfdf80d9696b">lh_entry_free_fn</a> *&#160;</td>
-          <td class="paramname"><em>free_fn</em>&#160;</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
         </tr>
         <tr>
           <td></td>
@@ -372,24 +475,26 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Convenience function to create a new linkhash table with char keys. </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Prints a message to <code>stdout</code>, then exits the program with an exit code of <code>1</code>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">size</td><td>initial table size. </td></tr>
-    <tr><td class="paramname">name</td><td>table name. </td></tr>
-    <tr><td class="paramname">free_fn</td><td>callback function used to free memory for entries. </td></tr>
+    <tr><td class="paramname">msg</td><td>Message format string, like for <code>printf</code>. </td></tr>
+    <tr><td class="paramname">...</td><td>Format args.</td></tr>
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>a pointer onto the linkhash table. </dd></dl>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000008">Deprecated:</a></b></dt><dd>Since it is not a good idea to exit the entire program because of an internal library failure, json-c will no longer use this function internally. However, because its interface is public, it will remain part of the API on the off chance of legacy software using it externally. </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="a705513954267a16cc1d40a284a7c441e"></a>
+<a id="a6bf630754affe92612639542a6c49c3f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6bf630754affe92612639542a6c49c3f">&#9670;&nbsp;</a></span>lh_kchar_table_new()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structlh__table.html">lh_table</a>* lh_kptr_table_new </td>
+          <td class="memname">struct <a class="el" href="structlh__table.html">lh_table</a>* lh_kchar_table_new </td>
           <td>(</td>
           <td class="paramtype">int&#160;</td>
           <td class="paramname"><em>size</em>, </td>
@@ -397,13 +502,7 @@ Functions</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">const char *&#160;</td>
-          <td class="paramname"><em>name</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype"><a class="el" href="linkhash_8h.html#a0c6811f660b93857aafdbfdf80d9696b">lh_entry_free_fn</a> *&#160;</td>
+          <td class="paramtype"><a class="el" href="linkhash_8h.html#a481b0bb1ab1d6a83713d9c27aa9f07d2">lh_entry_free_fn</a> *&#160;</td>
           <td class="paramname"><em>free_fn</em>&#160;</td>
         </tr>
         <tr>
@@ -413,33 +512,35 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Convenience function to create a new linkhash table with ptr keys. </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Convenience function to create a new linkhash table with char keys.</p>
+<dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">size</td><td>initial table size. </td></tr>
-    <tr><td class="paramname">name</td><td>table name. </td></tr>
     <tr><td class="paramname">free_fn</td><td>callback function used to free memory for entries. </td></tr>
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>a pointer onto the linkhash table. </dd></dl>
+<dl class="section return"><dt>Returns</dt><dd>On success, a pointer to the new linkhash table is returned. On error, a null pointer is returned. </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="a6ce3cb97560072c40f5caeaba85f756a"></a>
+<a id="af8108563b961dbf5471fe2c0e51f40a5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af8108563b961dbf5471fe2c0e51f40a5">&#9670;&nbsp;</a></span>lh_kptr_table_new()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int lh_ptr_equal </td>
+          <td class="memname">struct <a class="el" href="structlh__table.html">lh_table</a>* lh_kptr_table_new </td>
           <td>(</td>
-          <td class="paramtype">const void *&#160;</td>
-          <td class="paramname"><em>k1</em>, </td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>size</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">const void *&#160;</td>
-          <td class="paramname"><em>k2</em>&#160;</td>
+          <td class="paramtype"><a class="el" href="linkhash_8h.html#a481b0bb1ab1d6a83713d9c27aa9f07d2">lh_entry_free_fn</a> *&#160;</td>
+          <td class="paramname"><em>free_fn</em>&#160;</td>
         </tr>
         <tr>
           <td></td>
@@ -448,27 +549,21 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
+<p>Convenience function to create a new linkhash table with ptr keys.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">size</td><td>initial table size. </td></tr>
+    <tr><td class="paramname">free_fn</td><td>callback function used to free memory for entries. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>On success, a pointer to the new linkhash table is returned. On error, a null pointer is returned. </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="a2e560f0d3e5a20f6b0bfa4049737db23"></a>
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">unsigned long lh_ptr_hash </td>
-          <td>(</td>
-          <td class="paramtype">const void *&#160;</td>
-          <td class="paramname"><em>k</em></td><td>)</td>
-          <td></td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Pre-defined hash and equality functions </p>
+<a id="a2fed2c78f70d229edb2d00775ffe593c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2fed2c78f70d229edb2d00775ffe593c">&#9670;&nbsp;</a></span>lh_table_delete()</h2>
 
-</div>
-</div>
-<a class="anchor" id="a2fed2c78f70d229edb2d00775ffe593c"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -491,7 +586,8 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Delete a record from the table. If a callback free function is provided then it is called for the for the item being deleted. </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Delete a record from the table.</p>
+<p>If a callback free function is provided then it is called for the for the item being deleted. </p><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">t</td><td>the table to delete from. </td></tr>
     <tr><td class="paramname">k</td><td>a pointer to the key to delete. </td></tr>
@@ -504,7 +600,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ae5885a71c3457190fb1dc2d6e20dde3b"></a>
+<a id="ae5885a71c3457190fb1dc2d6e20dde3b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae5885a71c3457190fb1dc2d6e20dde3b">&#9670;&nbsp;</a></span>lh_table_delete_entry()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -527,7 +625,8 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Delete a record from the table. If a callback free function is provided then it is called for the for the item being deleted. </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Delete a record from the table.</p>
+<p>If a callback free function is provided then it is called for the for the item being deleted. </p><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">t</td><td>the table to delete from. </td></tr>
     <tr><td class="paramname">e</td><td>a pointer to the entry to delete. </td></tr>
@@ -540,7 +639,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a81653acf740cf8c9fe672e6cd16df0cf"></a>
+<a id="a81653acf740cf8c9fe672e6cd16df0cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a81653acf740cf8c9fe672e6cd16df0cf">&#9670;&nbsp;</a></span>lh_table_free()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -553,7 +654,9 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Free a linkhash table. If a callback free function is provided then it is called for all entries in the table. </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Free a linkhash table.</p>
+<p>If a lh_entry_free_fn callback free function was provided then it is called for all entries in the table.</p>
+<dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">t</td><td>table to free. </td></tr>
   </table>
@@ -562,7 +665,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a22b897763cc34a98c21c7fe82d151004"></a>
+<a id="a86c0cd547be1e2c2486a73bd58e1352c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a86c0cd547be1e2c2486a73bd58e1352c">&#9670;&nbsp;</a></span>lh_table_insert()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -575,7 +680,7 @@ Functions</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">void *&#160;</td>
+          <td class="paramtype">const void *&#160;</td>
           <td class="paramname"><em>k</em>, </td>
         </tr>
         <tr>
@@ -591,18 +696,80 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Insert a record into the table. </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Insert a record into the table.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">t</td><td>the table to insert into. </td></tr>
+    <tr><td class="paramname">k</td><td>a pointer to the key to insert. </td></tr>
+    <tr><td class="paramname">v</td><td>a pointer to the value to insert.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>On success, <code>0</code> is returned. On error, a negative value is returned. </dd></dl>
+
+</div>
+</div>
+<a id="a4558a9347a422e03a15b0b7a29b82dc3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4558a9347a422e03a15b0b7a29b82dc3">&#9670;&nbsp;</a></span>lh_table_insert_w_hash()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lh_table_insert_w_hash </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structlh__table.html">lh_table</a> *&#160;</td>
+          <td class="paramname"><em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>k</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>v</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const unsigned long&#160;</td>
+          <td class="paramname"><em>h</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const unsigned&#160;</td>
+          <td class="paramname"><em>opts</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Insert a record into the table using a precalculated key hash.</p>
+<p>The hash h, which should be calculated with lh_get_hash() on k, is provided by the caller, to allow for optimization when multiple operations with the same key are known to be needed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">t</td><td>the table to insert into. </td></tr>
     <tr><td class="paramname">k</td><td>a pointer to the key to insert. </td></tr>
     <tr><td class="paramname">v</td><td>a pointer to the value to insert. </td></tr>
+    <tr><td class="paramname">h</td><td>hash value of the key to insert </td></tr>
+    <tr><td class="paramname">opts</td><td>if set to JSON_C_OBJECT_KEY_IS_CONSTANT, sets <a class="el" href="structlh__entry.html#a14f40cc124c32b03f81151ae7934d2e7">lh_entry.k_is_constant</a> so t's free function knows to avoid freeing the key. </td></tr>
   </table>
   </dd>
 </dl>
 
 </div>
 </div>
-<a class="anchor" id="ac9ba631c91fe80fb905f04c7cd526f2b"></a>
+<a id="ac9ba631c91fe80fb905f04c7cd526f2b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac9ba631c91fe80fb905f04c7cd526f2b">&#9670;&nbsp;</a></span>lh_table_length()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -618,7 +785,47 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ad3b6ca2d967a6c3021ee6c39e014a918"></a>
+<a id="a49c27f18a174eaf126d1b7953df13cb1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49c27f18a174eaf126d1b7953df13cb1">&#9670;&nbsp;</a></span>lh_table_lookup()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const void* lh_table_lookup </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structlh__table.html">lh_table</a> *&#160;</td>
+          <td class="paramname"><em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>k</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Lookup a record into the table.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">t</td><td>the table to lookup </td></tr>
+    <tr><td class="paramname">k</td><td>a pointer to the key to lookup </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the found value or NULL if it does not exist. </dd></dl>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000007">Deprecated:</a></b></dt><dd>Use <a class="el" href="linkhash_8h.html#a81c270bb0dd9d5c8a3e7ae20bc4d67f3">lh_table_lookup_ex()</a> instead. </dd></dl>
+
+</div>
+</div>
+<a id="ad3b6ca2d967a6c3021ee6c39e014a918"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad3b6ca2d967a6c3021ee6c39e014a918">&#9670;&nbsp;</a></span>lh_table_lookup_entry()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -641,10 +848,56 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Lookup a record into the table. </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Lookup a record in the table.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">t</td><td>the table to lookup </td></tr>
+    <tr><td class="paramname">k</td><td>a pointer to the key to lookup </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the record structure of the value or NULL if it does not exist. </dd></dl>
+
+</div>
+</div>
+<a id="a59ecaf34ef59280952f4459b2de63677"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a59ecaf34ef59280952f4459b2de63677">&#9670;&nbsp;</a></span>lh_table_lookup_entry_w_hash()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structlh__entry.html">lh_entry</a>* lh_table_lookup_entry_w_hash </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structlh__table.html">lh_table</a> *&#160;</td>
+          <td class="paramname"><em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>k</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const unsigned long&#160;</td>
+          <td class="paramname"><em>h</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Lookup a record in the table using a precalculated key hash.</p>
+<p>The hash h, which should be calculated with lh_get_hash() on k, is provided by the caller, to allow for optimization when multiple operations with the same key are known to be needed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">t</td><td>the table to lookup </td></tr>
     <tr><td class="paramname">k</td><td>a pointer to the key to lookup </td></tr>
+    <tr><td class="paramname">h</td><td>hash value of the key to lookup </td></tr>
   </table>
   </dd>
 </dl>
@@ -652,7 +905,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a81c270bb0dd9d5c8a3e7ae20bc4d67f3"></a>
+<a id="a81c270bb0dd9d5c8a3e7ae20bc4d67f3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a81c270bb0dd9d5c8a3e7ae20bc4d67f3">&#9670;&nbsp;</a></span>lh_table_lookup_ex()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -681,7 +936,8 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Lookup a record in the table </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Lookup a record in the table.</p>
+<dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">t</td><td>the table to lookup </td></tr>
     <tr><td class="paramname">k</td><td>a pointer to the key to lookup </td></tr>
@@ -693,7 +949,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ac3ba464ac43c083397b1f1d34f2ddf55"></a>
+<a id="a9c4f8a71dbe4d3390d9f7adb331beb0e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9c4f8a71dbe4d3390d9f7adb331beb0e">&#9670;&nbsp;</a></span>lh_table_new()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -706,25 +964,19 @@ Functions</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">const char *&#160;</td>
-          <td class="paramname"><em>name</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype"><a class="el" href="linkhash_8h.html#a0c6811f660b93857aafdbfdf80d9696b">lh_entry_free_fn</a> *&#160;</td>
+          <td class="paramtype"><a class="el" href="linkhash_8h.html#a481b0bb1ab1d6a83713d9c27aa9f07d2">lh_entry_free_fn</a> *&#160;</td>
           <td class="paramname"><em>free_fn</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype"><a class="el" href="linkhash_8h.html#a1780449146b716ad5e6ed0a0207d0417">lh_hash_fn</a> *&#160;</td>
+          <td class="paramtype"><a class="el" href="linkhash_8h.html#a91d16eb45069d235a198d2184a77d0ae">lh_hash_fn</a> *&#160;</td>
           <td class="paramname"><em>hash_fn</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype"><a class="el" href="linkhash_8h.html#abcbf0e4849fb0c6279827ac3b66d15c3">lh_equal_fn</a> *&#160;</td>
+          <td class="paramtype"><a class="el" href="linkhash_8h.html#af74a0690267598a0ed6f0a9b66674573">lh_equal_fn</a> *&#160;</td>
           <td class="paramname"><em>equal_fn</em>&#160;</td>
         </tr>
         <tr>
@@ -734,26 +986,28 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Create a new linkhash table. </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Create a new linkhash table.</p>
+<dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">size</td><td>initial table size. The table is automatically resized although this incurs a performance penalty. </td></tr>
-    <tr><td class="paramname">name</td><td>the table name. </td></tr>
     <tr><td class="paramname">free_fn</td><td>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. </td></tr>
     <tr><td class="paramname">hash_fn</td><td>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. </td></tr>
     <tr><td class="paramname">equal_fn</td><td>comparison function to compare keys. 2 standard ones defined: lh_ptr_hash and lh_char_hash for comparing pointer values and C strings respectively. </td></tr>
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>a pointer onto the linkhash table. </dd></dl>
+<dl class="section return"><dt>Returns</dt><dd>On success, a pointer to the new linkhash table is returned. On error, a null pointer is returned. </dd></dl>
 
 </div>
 </div>
-<a class="anchor" id="a5322eccf3394af7dc1ebb22af8f8c562"></a>
+<a id="a30c8414e31aeee7669acc938116d933f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a30c8414e31aeee7669acc938116d933f">&#9670;&nbsp;</a></span>lh_table_resize()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void lh_table_resize </td>
+          <td class="memname">int lh_table_resize </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structlh__table.html">lh_table</a> *&#160;</td>
           <td class="paramname"><em>t</em>, </td>
@@ -771,40 +1025,24 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-
-</div>
-</div>
-<a class="anchor" id="a849aa0ce9fe550c16ce81a215b1765ad"></a>
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">THIS_FUNCTION_IS_DEPRECATED </td>
-          <td>(</td>
-          <td class="paramtype">extern const void *&#160;</td>
-          <td class="paramname"><em>lh_table_lookup</em>struct lh_table *t, const void *k</td><td>)</td>
-          <td></td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Lookup a record into the table </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Resizes the specified table.</p>
+<dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">t</td><td>the table to lookup </td></tr>
-    <tr><td class="paramname">k</td><td>a pointer to the key to lookup </td></tr>
+    <tr><td class="paramname">t</td><td>Pointer to table to resize. </td></tr>
+    <tr><td class="paramname">new_size</td><td>New table size. Must be positive.</td></tr>
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>a pointer to the found value or NULL if it does not exist. </dd></dl>
-<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>Use lh_table_lookup_ex instead. </dd></dl>
+<dl class="section return"><dt>Returns</dt><dd>On success, <code>0</code> is returned. On error, a negative value is returned. </dd></dl>
 
 </div>
 </div>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 17:51:50 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index f4dc8f0..b0c6992 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: math_compat.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
   <div class="headertitle">
 <div class="title">math_compat.h File Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
+
+<p>Do not use, json-c internal, may be changed or removed at any time.  
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a956e2723d559858d08644ac99146e910"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="math__compat_8h.html#a956e2723d559858d08644ac99146e910">INFINITY</a>&#160;&#160;&#160;(DBL_MAX + DBL_MAX)</td></tr>
+<tr class="separator:a956e2723d559858d08644ac99146e910"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77914bc4c960d1bfda49328bd0646985"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="math__compat_8h.html#a77914bc4c960d1bfda49328bd0646985">HAVE_DECL_INFINITY</a></td></tr>
+<tr class="separator:a77914bc4c960d1bfda49328bd0646985"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8abfcc76130f3f991d124dd22d7e69bc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="math__compat_8h.html#a8abfcc76130f3f991d124dd22d7e69bc">NAN</a>&#160;&#160;&#160;(<a class="el" href="math__compat_8h.html#a956e2723d559858d08644ac99146e910">INFINITY</a> - <a class="el" href="math__compat_8h.html#a956e2723d559858d08644ac99146e910">INFINITY</a>)</td></tr>
+<tr class="separator:a8abfcc76130f3f991d124dd22d7e69bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9025492cba029d3e372532a1d012f119"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="math__compat_8h.html#a9025492cba029d3e372532a1d012f119">HAVE_DECL_NAN</a></td></tr>
+<tr class="separator:a9025492cba029d3e372532a1d012f119"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Do not use, json-c internal, may be changed or removed at any time. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a77914bc4c960d1bfda49328bd0646985"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a77914bc4c960d1bfda49328bd0646985">&#9670;&nbsp;</a></span>HAVE_DECL_INFINITY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HAVE_DECL_INFINITY</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a9025492cba029d3e372532a1d012f119"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9025492cba029d3e372532a1d012f119">&#9670;&nbsp;</a></span>HAVE_DECL_NAN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define HAVE_DECL_NAN</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a956e2723d559858d08644ac99146e910"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a956e2723d559858d08644ac99146e910">&#9670;&nbsp;</a></span>INFINITY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define INFINITY&#160;&#160;&#160;(DBL_MAX + DBL_MAX)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a8abfcc76130f3f991d124dd22d7e69bc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8abfcc76130f3f991d124dd22d7e69bc">&#9670;&nbsp;</a></span>NAN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define NAN&#160;&#160;&#160;(<a class="el" href="math__compat_8h.html#a956e2723d559858d08644ac99146e910">INFINITY</a> - <a class="el" href="math__compat_8h.html#a956e2723d559858d08644ac99146e910">INFINITY</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 12:59:34 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
diff --git a/doc/html/md_issues_closed_for_0_813.html b/doc/html/md_issues_closed_for_0_813.html
new file mode 100644 (file)
index 0000000..300f8dc
--- /dev/null
@@ -0,0 +1,69 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>json-c: issues_closed_for_0</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">json-c
+   &#160;<span id="projectnumber">0.13</span>
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">issues_closed_for_0 </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>This list was created with:</p>
+<p>curl <a href="https://api.github.com/search/issues?q=">https://api.github.com/search/issues?q=</a>"repo%3Ajson-c%2Fjson-c+closed%3A&gt;2014-04-10+created%3A&lt;2017-12-01&amp;sort=created&amp;order=asc&amp;per_page=400&amp;page=1" &gt; issues1.out curl <a href="https://api.github.com/search/issues?q=">https://api.github.com/search/issues?q=</a>"repo%3Ajson-c%2Fjson-c+closed%3A&gt;2014-04-10+created%3A&lt;2017-12-01&amp;sort=created&amp;order=asc&amp;per_page=400&amp;page=2" &gt; issues2.out curl <a href="https://api.github.com/search/issues?q=">https://api.github.com/search/issues?q=</a>"repo%3Ajson-c%2Fjson-c+closed%3A&gt;2014-04-10+created%3A&lt;2017-12-01&amp;sort=created&amp;order=asc&amp;per_page=400&amp;page=3" &gt; issues3.out jq -r '.items[] | "[" + .title + "](" + .url + ")" | tostring' issues?.out &gt; issues.md #... manual editing ... </p><hr/>
+<p>Issues and Pull Requests closed for the 0.13 release (since commit f84d9c, the 0.12 branch point, 2014-04-10)</p>
+<p><a href="https://api.github.com/repos/json-c/json-c/issues/61">Make json_object_object_add() indicate success or failure, test fix</a> <a href="https://api.github.com/repos/json-c/json-c/issues/113">Build fixes (make dist and make distcheck)</a> <a href="https://api.github.com/repos/json-c/json-c/issues/124">Fixing build</a> <a href="https://api.github.com/repos/json-c/json-c/issues/125">Fix compile error(variable size set but not used) on g++4.6</a> <a href="https://api.github.com/repos/json-c/json-c/issues/126">Removed unused size variable.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/127">remove unused <code>size</code> variable</a> <a href="https://api.github.com/repos/json-c/json-c/issues/128">Remove unused variable from json_tokenizer.c</a> <a href="https://api.github.com/repos/json-c/json-c/issues/130">Failed to compile under Ubuntu 13.10 32bit</a> <a href="https://api.github.com/repos/json-c/json-c/issues/131">undefined symbol: __sync_val_compare_and_swap_4</a> <a href="https://api.github.com/repos/json-c/json-c/issues/132">Remove unused variable 'size'</a> <a href="https://api.github.com/repos/json-c/json-c/issues/133">Update and rename README to README.md</a> <a href="https://api.github.com/repos/json-c/json-c/issues/134">Must remove variable size...</a> <a href="https://api.github.com/repos/json-c/json-c/issues/135">bits.h uses removed json_tokener_errors[error]</a> <a href="https://api.github.com/repos/json-c/json-c/issues/136">Error when running make check</a> <a href="https://api.github.com/repos/json-c/json-c/issues/137">config.h.in should not be in git</a> <a href="https://api.github.com/repos/json-c/json-c/issues/138">Can't build on RHEL 6.5 due to dependency on automake-1.14</a> <a href="https://api.github.com/repos/json-c/json-c/issues/140">Code bug in random_test.c evaluating same expression twice</a> <a href="https://api.github.com/repos/json-c/json-c/issues/141">Removed duplicate check in random_seed test - bug #140</a> <a href="https://api.github.com/repos/json-c/json-c/issues/142">Please undeprecate json_object_object_get</a> <a href="https://api.github.com/repos/json-c/json-c/issues/144">Introduce json_object_from_fd</a> <a href="https://api.github.com/repos/json-c/json-c/issues/145">Handle % character properly</a> <a href="https://api.github.com/repos/json-c/json-c/issues/146">TAGS rename</a> <a href="https://api.github.com/repos/json-c/json-c/issues/148">Bump the soname</a> <a href="https://api.github.com/repos/json-c/json-c/issues/149">SONAME bump</a> <a href="https://api.github.com/repos/json-c/json-c/issues/150">Fix build using MinGW.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/151">Remove json_type enum trailing comma</a> <a href="https://api.github.com/repos/json-c/json-c/issues/152">error while compiling json-c library version 0.11</a> <a href="https://api.github.com/repos/json-c/json-c/issues/153">improve doc for json_object_to_json_string()</a> <a href="https://api.github.com/repos/json-c/json-c/issues/154">double precision</a> <a href="https://api.github.com/repos/json-c/json-c/issues/155">add bsearch for arrays</a> <a href="https://api.github.com/repos/json-c/json-c/issues/156">Remove trailing whitespaces</a> <a href="https://api.github.com/repos/json-c/json-c/issues/157">JSON-C shall not exit on calloc fail.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/158">while using json-c 0.11, I am facing strange crash issue in json_object_put.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/159">json_tokener.c compile error</a> <a href="https://api.github.com/repos/json-c/json-c/issues/160">missing header file on windows??</a> <a href="https://api.github.com/repos/json-c/json-c/issues/161">Is there a way to append to file?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/162">json_util: add directory check for POSIX distros</a> <a href="https://api.github.com/repos/json-c/json-c/issues/163">Fix Win32 build problems</a> <a href="https://api.github.com/repos/json-c/json-c/issues/164">made it compile and link on Widnows (as static library)</a> <a href="https://api.github.com/repos/json-c/json-c/issues/165">json_object_to_json_string_ext length</a> <a href="https://api.github.com/repos/json-c/json-c/issues/167">Can't build on Windows with Visual Studio 2010</a> <a href="https://api.github.com/repos/json-c/json-c/issues/168">Tightening the number parsing algorithm</a> <a href="https://api.github.com/repos/json-c/json-c/issues/169">Doesn't compile on ubuntu 14.04, 64bit</a> <a href="https://api.github.com/repos/json-c/json-c/issues/170">Generated files in repository</a> <a href="https://api.github.com/repos/json-c/json-c/issues/171">Update configuration for VS2010 and win64</a> <a href="https://api.github.com/repos/json-c/json-c/issues/172">Adding support for parsing octal numbers</a> <a href="https://api.github.com/repos/json-c/json-c/issues/173">json_parse_int64 doesn't work correctly at illumos</a> <a href="https://api.github.com/repos/json-c/json-c/issues/174">Adding JSON_C_TO_STRING_PRETTY_TAB flag</a> <a href="https://api.github.com/repos/json-c/json-c/issues/175">make check fails 4 tests with overflows when built with ASAN</a> <a href="https://api.github.com/repos/json-c/json-c/issues/176">Possible to delete an array element at a given idx ?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/177">Fix compiler warnings</a> <a href="https://api.github.com/repos/json-c/json-c/issues/178">Unable to compile on CentOS5</a> <a href="https://api.github.com/repos/json-c/json-c/issues/179">Added array_list_del_idx and json_object_array_del_idx</a> <a href="https://api.github.com/repos/json-c/json-c/issues/180">Enable silent build by default</a> <a href="https://api.github.com/repos/json-c/json-c/issues/181">json_tokener_parse_ex accepts invalid JSON</a> <a href="https://api.github.com/repos/json-c/json-c/issues/182">Link against libm when needed</a> <a href="https://api.github.com/repos/json-c/json-c/issues/183">Apply compile warning fix to master branch</a> <a href="https://api.github.com/repos/json-c/json-c/issues/184">Use only GCC-specific flags when compiling with GCC</a> <a href="https://api.github.com/repos/json-c/json-c/issues/185">compile error</a> <a href="https://api.github.com/repos/json-c/json-c/issues/186">Syntax error</a> <a href="https://api.github.com/repos/json-c/json-c/issues/187">array_list_get_idx and negative indexes.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/188">json_object_object_foreach warnings</a> <a href="https://api.github.com/repos/json-c/json-c/issues/189">noisy json_object_from_file: error opening file</a> <a href="https://api.github.com/repos/json-c/json-c/issues/190">warning: initialization discards const qualifier from pointer target type [enabled by default]</a> <a href="https://api.github.com/repos/json-c/json-c/issues/192">json_tokener_parse accepts invalid JSON {"key": "value" , }</a> <a href="https://api.github.com/repos/json-c/json-c/issues/193">Make serialization format of doubles configurable</a> <a href="https://api.github.com/repos/json-c/json-c/issues/194">Add utility function for comparing json_objects</a> <a href="https://api.github.com/repos/json-c/json-c/issues/195">Call uselocale instead of setlocale</a> <a href="https://api.github.com/repos/json-c/json-c/issues/196">Performance improvements</a> <a href="https://api.github.com/repos/json-c/json-c/issues/197">Time for a new release?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/198">Fix possible memory leak and remove superfluous NULL checks before free()</a> <a href="https://api.github.com/repos/json-c/json-c/issues/199">Fix build in Visual Studio</a> <a href="https://api.github.com/repos/json-c/json-c/issues/200">Add build scripts for CI platforms</a> <a href="https://api.github.com/repos/json-c/json-c/issues/201">disable forward-slash escaping?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/202">Array with objects support</a> <a href="https://api.github.com/repos/json-c/json-c/issues/203">Add source position/coordinates to API</a> <a href="https://api.github.com/repos/json-c/json-c/issues/204">json-c/json.h not found</a> <a href="https://api.github.com/repos/json-c/json-c/issues/205">json-c Compiled with Visual Studios</a> <a href="https://api.github.com/repos/json-c/json-c/issues/206">what do i use in place of json_object_object_get?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/207">Add support for property pairs directly added to arrays</a> <a href="https://api.github.com/repos/json-c/json-c/issues/208">Performance enhancements (mainly) to json_object_to_json_string()</a> <a href="https://api.github.com/repos/json-c/json-c/issues/209">fix regression from 2d549662be832da838aa063da2efa78ee3b99668</a> <a href="https://api.github.com/repos/json-c/json-c/issues/210">Use size_t for arrays</a> <a href="https://api.github.com/repos/json-c/json-c/issues/211">Atomic updates for the refcount</a> <a href="https://api.github.com/repos/json-c/json-c/issues/212">Refcount doesn't work between threads</a> <a href="https://api.github.com/repos/json-c/json-c/issues/213">fix to compile with microsoft visual c++ 2010</a> <a href="https://api.github.com/repos/json-c/json-c/issues/214">Some non-GNU systems support __sync_val_compare_and_swap</a> <a href="https://api.github.com/repos/json-c/json-c/issues/215">Build json-c for window 64 bit.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/216">configure: check realloc with AC_CHECK_FUNCS() to fix cross-compilation.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/217">Checking for functions in float.h</a> <a href="https://api.github.com/repos/json-c/json-c/issues/218">Use a macro to indicate C99 to the compiler</a> <a href="https://api.github.com/repos/json-c/json-c/issues/219">Fix various potential null ptr deref and int32 overflows</a> <a href="https://api.github.com/repos/json-c/json-c/issues/220">Add utility function for comparing json_objects</a> <a href="https://api.github.com/repos/json-c/json-c/issues/221">JSON_C_TO_STRING_NOSLASHESCAPE works incorrectly</a> <a href="https://api.github.com/repos/json-c/json-c/issues/222">Fix issue #221: JSON_C_TO_STRING_NOSLASHESCAPE works incorrectly</a> <a href="https://api.github.com/repos/json-c/json-c/issues/223">Clarify json_object_get_string documentation of NULL handling &amp; return</a> <a href="https://api.github.com/repos/json-c/json-c/issues/224">json_tokener.c - all warnings being treated as errors</a> <a href="https://api.github.com/repos/json-c/json-c/issues/225">Hi, will you support clib as a "registry"?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/227">Bump SOVERSION to 3</a> <a href="https://api.github.com/repos/json-c/json-c/issues/228">avoid double slashes from json</a> <a href="https://api.github.com/repos/json-c/json-c/issues/229">configure fails: checking size of size_t... configure: error: cannot determine a size for size_t</a> <a href="https://api.github.com/repos/json-c/json-c/issues/230">Use stdint.h to check for size_t size</a> <a href="https://api.github.com/repos/json-c/json-c/issues/231">Fix size_t size check for first-time builds</a> <a href="https://api.github.com/repos/json-c/json-c/issues/232">tests/tests1: fix printf format for size_t arguments</a> <a href="https://api.github.com/repos/json-c/json-c/issues/233">Include stddef.h in json_object.h</a> <a href="https://api.github.com/repos/json-c/json-c/issues/234">Add public API to use userdata independently of custom serializer</a> <a href="https://api.github.com/repos/json-c/json-c/issues/235">Undefined symbols Error for architecture x86_64 on Mac</a> <a href="https://api.github.com/repos/json-c/json-c/issues/236">Building a project which uses json-c with flag -Wcast-qual causes compilation errors</a> <a href="https://api.github.com/repos/json-c/json-c/issues/237">handle escaped utf-8</a> <a href="https://api.github.com/repos/json-c/json-c/issues/238">linkhash.c: optimised the table_free path</a> <a href="https://api.github.com/repos/json-c/json-c/issues/239">initialize null terminator of new printbuf</a> <a href="https://api.github.com/repos/json-c/json-c/issues/240">Compile error: Variable set but not used</a> <a href="https://api.github.com/repos/json-c/json-c/issues/241">getting error in date string 19\/07\/2016, fixed for error 19/07/2016</a> <a href="https://api.github.com/repos/json-c/json-c/issues/242">json_tokener_parse error</a> <a href="https://api.github.com/repos/json-c/json-c/issues/243">Fix #165</a> <a href="https://api.github.com/repos/json-c/json-c/issues/244">Error while compiling source from RHEL5, could you please help me to fix this</a> <a href="https://api.github.com/repos/json-c/json-c/issues/245">json-c compile in window xp</a> <a href="https://api.github.com/repos/json-c/json-c/issues/246">Mac: uselocale failed to build</a> <a href="https://api.github.com/repos/json-c/json-c/issues/247">json_object_array_del_idx function has segment fault error?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/248">Minor changes in C source code</a> <a href="https://api.github.com/repos/json-c/json-c/issues/249">Improving README</a> <a href="https://api.github.com/repos/json-c/json-c/issues/250">Improving .gitignore</a> <a href="https://api.github.com/repos/json-c/json-c/issues/251">Adding a file for EditorConfig</a> <a href="https://api.github.com/repos/json-c/json-c/issues/252">Very minor changes not related to C source code</a> <a href="https://api.github.com/repos/json-c/json-c/issues/253">Adding a test with cppcheck for Travis CI</a> <a href="https://api.github.com/repos/json-c/json-c/issues/254">Very minor changes to some tests</a> <a href="https://api.github.com/repos/json-c/json-c/issues/255">Minor changes in C source code</a> <a href="https://api.github.com/repos/json-c/json-c/issues/256">Mailing list dead?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/257">Defining a coding style</a> <a href="https://api.github.com/repos/json-c/json-c/issues/258">Enable CI services</a> <a href="https://api.github.com/repos/json-c/json-c/issues/259">Fails to parse valid json</a> <a href="https://api.github.com/repos/json-c/json-c/issues/260">Adding an object to itself</a> <a href="https://api.github.com/repos/json-c/json-c/issues/261">Lack of proper documentation</a> <a href="https://api.github.com/repos/json-c/json-c/issues/262">Add Cmakefile and fix compiler warning.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/263">Compiler Warnings with VS2015</a> <a href="https://api.github.com/repos/json-c/json-c/issues/264">successed in simple test while failed in my project</a> <a href="https://api.github.com/repos/json-c/json-c/issues/265">Conformance report for reference</a> <a href="https://api.github.com/repos/json-c/json-c/issues/266">crash perhaps related to reference counting</a> <a href="https://api.github.com/repos/json-c/json-c/issues/267">Removes me as Win32 maintainer, because I'm not.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/268">Documentation of json_object_to_json_string gives no information about memory management</a> <a href="https://api.github.com/repos/json-c/json-c/issues/269">json_object_&lt;type&gt;_set(json_object *o,&lt;type&gt; value) API for value setting in json object private structure</a> <a href="https://api.github.com/repos/json-c/json-c/issues/270">new API json_object_new_double_f(doubel d,const char * fmt);</a> <a href="https://api.github.com/repos/json-c/json-c/issues/271">Cannot compile using CMake on macOS</a> <a href="https://api.github.com/repos/json-c/json-c/issues/273">fixed wrong object name in json_object_all_values_equal</a> <a href="https://api.github.com/repos/json-c/json-c/issues/274">Support for 64 bit pointers on Windows</a> <a href="https://api.github.com/repos/json-c/json-c/issues/275">Out-of-bounds read in json_tokener_parse_ex</a> <a href="https://api.github.com/repos/json-c/json-c/issues/276">./configure for centos release 6.7(final) failure</a> <a href="https://api.github.com/repos/json-c/json-c/issues/277">Json object set xxx</a> <a href="https://api.github.com/repos/json-c/json-c/issues/278">Serialization of double with no fractional component drops trailing zero</a> <a href="https://api.github.com/repos/json-c/json-c/issues/279">Segmentation fault in array_list_length()</a> <a href="https://api.github.com/repos/json-c/json-c/issues/280">Should json_object_array_get_idx check whether input obj is array?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/281">how to pretty print json-c?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/282">ignore temporary files</a> <a href="https://api.github.com/repos/json-c/json-c/issues/283">json_pointer: add first revision based on RFC 6901</a> <a href="https://api.github.com/repos/json-c/json-c/issues/284">Resusing json_tokener object</a> <a href="https://api.github.com/repos/json-c/json-c/issues/285">Revert "compat/strdup.h: move common compat check for strdup() to own&lt;/a&gt;
+&lt;a href="https://api.github.com/repos/json-c/json-c/issues/286"&gt;json_tokener_parse_ex() returns json_tokener_continue on zero-length string&lt;/a&gt;
+&lt;a href="https://api.github.com/repos/json-c/json-c/issues/287"&gt;json_pointer: extend setter &amp; getter with printf() style arguments&lt;/a&gt;
+&lt;a href="https://api.github.com/repos/json-c/json-c/issues/288"&gt;Fix _GNU_SOURCE define for vasprintf&lt;/a&gt;
+&lt;a href="https://api.github.com/repos/json-c/json-c/issues/289"&gt;bugfix: floating point representaion without fractional part&lt;/a&gt;
+&lt;a href="https://api.github.com/repos/json-c/json-c/issues/290"&gt;duplicate an json_object&lt;/a&gt;
+&lt;a href="https://api.github.com/repos/json-c/json-c/issues/291"&gt;isspace assert error&lt;/a&gt;
+&lt;a href="https://api.github.com/repos/json-c/json-c/issues/292"&gt;configure error "./configure: line 13121: syntax error near unexpected token `-Wall'"&lt;/a&gt;
+&lt;a href="https://api.github.com/repos/json-c/json-c/issues/293"&gt;how to make with bitcode for ios&lt;/a&gt;
+&lt;a href="https://api.github.com/repos/json-c/json-c/issues/294"&gt;Adding UTF-8 validation. Fixes #122&lt;/a&gt;
+&lt;a href="https://api.github.com/repos/json-c/json-c/issues/295"&gt;cross compile w/ mingw&lt;/a&gt;
+&lt;a href="https://api.github.com/repos/json-c/json-c/issues/296"&gt;Missing functions header in json_object.h&lt;/a&gt;
+&lt;a href="https://api.github.com/repos/json-c/json-c/issues/297"&gt;could not parse string to Json object? Like string str=\"helloworld;E\test\log\;end"</a> <a href="https://api.github.com/repos/json-c/json-c/issues/298">Building using CMake doesn't work</a> <a href="https://api.github.com/repos/json-c/json-c/issues/299">Improve json_object -&gt; string performance</a> <a href="https://api.github.com/repos/json-c/json-c/issues/300">Running tests with MinGW build</a> <a href="https://api.github.com/repos/json-c/json-c/issues/301">How to deep copy json_object in C++ ?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/302">json_tokener_parse_ex doesn't parse JSON values</a> <a href="https://api.github.com/repos/json-c/json-c/issues/303">fix doc in tokener header file</a> <a href="https://api.github.com/repos/json-c/json-c/issues/304">(.text+0x72846): undefined reference to `is_error'</a> <a href="https://api.github.com/repos/json-c/json-c/issues/305">Fix compilation without C-99 option</a> <a href="https://api.github.com/repos/json-c/json-c/issues/306">./configure: line 12748 -error=deprecated-declarations</a> <a href="https://api.github.com/repos/json-c/json-c/issues/307">Memory leak in json_tokener_parse</a> <a href="https://api.github.com/repos/json-c/json-c/issues/308">AM_PROG_LIBTOOL not found on Linux</a> <a href="https://api.github.com/repos/json-c/json-c/issues/309">GCC 7 reports various -Wimplicit-fallthrough= errors</a> <a href="https://api.github.com/repos/json-c/json-c/issues/310">Add FALLTHRU comment to handle GCC7 warnings.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/311">Fix error C3688 when compiling on Visual Studio 2015</a> <a href="https://api.github.com/repos/json-c/json-c/issues/312">Fix CMake Build process improved for MinGW and MSYS2</a> <a href="https://api.github.com/repos/json-c/json-c/issues/313">VERBOSE=1 make check; tests/test_util_file.test.c and tests/test_util_file.expected out of sync</a> <a href="https://api.github.com/repos/json-c/json-c/issues/315">Passing -1 to json_tokener_parse_ex is possibly unsafe</a> <a href="https://api.github.com/repos/json-c/json-c/issues/316">Memory Returned by json_object_to_json_string not freed</a> <a href="https://api.github.com/repos/json-c/json-c/issues/317">json_object_get_string gives segmentation error</a> <a href="https://api.github.com/repos/json-c/json-c/issues/318">PVS-Studio static analyzer analyze results</a> <a href="https://api.github.com/repos/json-c/json-c/issues/319">Windows: Fix dynamic library build with Visual Studio</a> <a href="https://api.github.com/repos/json-c/json-c/issues/320">Can't compile in Mac OS X El Capitan</a> <a href="https://api.github.com/repos/json-c/json-c/issues/321">build,cmake: fix vasprintf implicit definition and generate both static &amp; shared libs</a> <a href="https://api.github.com/repos/json-c/json-c/issues/322">can not link with libjson-c.a</a> <a href="https://api.github.com/repos/json-c/json-c/issues/323">implicit fallthrough detected by gcc 7.1</a> <a href="https://api.github.com/repos/json-c/json-c/issues/324">JsonPath like function?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/325">Fix stack buffer overflow in json_object_double_to_json_string_format()</a> <a href="https://api.github.com/repos/json-c/json-c/issues/327">why json-c so hard to compile</a> <a href="https://api.github.com/repos/json-c/json-c/issues/328">json_object: implement json_object_deep_copy() function</a> <a href="https://api.github.com/repos/json-c/json-c/issues/329">build,cmake: build,cmake: rename libjson-c-static.a to libjson-c.a</a> <a href="https://api.github.com/repos/json-c/json-c/issues/330">tests: symlink basic tests to a single file that has the common code</a> <a href="https://api.github.com/repos/json-c/json-c/issues/331">Safe use of snprintf() / vsnprintf() for Visual studio, and thread-safety fix</a> <a href="https://api.github.com/repos/json-c/json-c/issues/332">Valgrind: invalid read after json_object_array_del_idx.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/333">Replace obsolete AM_PROG_LIBTOOL</a> <a href="https://api.github.com/repos/json-c/json-c/issues/335">README.md: show build status tag from travis-ci.org</a> <a href="https://api.github.com/repos/json-c/json-c/issues/336">tests: fix tests in travis-ci.org</a> <a href="https://api.github.com/repos/json-c/json-c/issues/337">Synchronize "potentially racy" random seed in lh_char_hash()</a> <a href="https://api.github.com/repos/json-c/json-c/issues/338">implement json_object_int_inc(json_object *, int64_t)</a> <a href="https://api.github.com/repos/json-c/json-c/issues/339">Json schema validation</a> <a href="https://api.github.com/repos/json-c/json-c/issues/340">strerror_override: add extern "C" and JSON_EXPORT specifiers for Visual C++ compilers</a> <a href="https://api.github.com/repos/json-c/json-c/issues/341">character "/" parse as "\/"</a> <a href="https://api.github.com/repos/json-c/json-c/issues/342">No such file or directory "/usr/include/json.h"</a> <a href="https://api.github.com/repos/json-c/json-c/issues/343">Can't parse json</a> <a href="https://api.github.com/repos/json-c/json-c/issues/344">Fix Mingw build</a> <a href="https://api.github.com/repos/json-c/json-c/issues/345">Fix make dist and make distcheck</a> <a href="https://api.github.com/repos/json-c/json-c/issues/346">Clamp double to int32 when narrowing in json_object_get_int.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/347">MSVC linker error json_c_strerror</a> <a href="https://api.github.com/repos/json-c/json-c/issues/348">why</a> <a href="https://api.github.com/repos/json-c/json-c/issues/349"><code>missing</code> is missing?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/350">stderror-override and disable-shared</a> <a href="https://api.github.com/repos/json-c/json-c/issues/351">SIZE_T_MAX redefined from limits.h</a> <a href="https://api.github.com/repos/json-c/json-c/issues/352"><code>INSTALL</code> overrides an automake script.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/353">Documentation issues</a> <a href="https://api.github.com/repos/json-c/json-c/issues/354">Fixes #351 #352 #353</a> <a href="https://api.github.com/repos/json-c/json-c/issues/355">1.make it can been compiled with Visual Studio 2010 by modify the CMakeList.txt and others</a> <a href="https://api.github.com/repos/json-c/json-c/issues/356">VS2008 test test_util_file.cpp err!</a> <a href="https://api.github.com/repos/json-c/json-c/issues/357">__json_c_strerror incompatibility with link-time optimization</a> <a href="https://api.github.com/repos/json-c/json-c/issues/358">make issue</a> <a href="https://api.github.com/repos/json-c/json-c/issues/359">update CMakeLists.txt for compile with visual studio at least 2010</a> <a href="https://api.github.com/repos/json-c/json-c/issues/360">Use strtoll() to parse ints</a> <a href="https://api.github.com/repos/json-c/json-c/issues/361">Fix double to int cast overflow in json_object_get_int64.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/362">CMake Package Config</a> <a href="https://api.github.com/repos/json-c/json-c/issues/363">Issue #338, add json_object_add_int functions</a> <a href="https://api.github.com/repos/json-c/json-c/issues/364">Cmake is Errir</a> <a href="https://api.github.com/repos/json-c/json-c/issues/365">added fallthrough for gcc7</a> <a href="https://api.github.com/repos/json-c/json-c/issues/366">how to check the json string,crash!</a> <a href="https://api.github.com/repos/json-c/json-c/issues/367">Is json-c support "redirect" semantic?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/368">Add examples</a> <a href="https://api.github.com/repos/json-c/json-c/issues/369">How to build json-c library for android?</a> <a href="https://api.github.com/repos/json-c/json-c/issues/370">Compiling using clang-cl</a> <a href="https://api.github.com/repos/json-c/json-c/issues/371">Invalid parsing for Infinity with json-c 0.12</a> <a href="https://api.github.com/repos/json-c/json-c/issues/372">Json-c 0.12: Fixed Infinity bug</a> <a href="https://api.github.com/repos/json-c/json-c/issues/373">build: fix build on appveyor CI</a> <a href="https://api.github.com/repos/json-c/json-c/issues/374">Undefined symbols for architecture x86_64:</a> <a href="https://api.github.com/repos/json-c/json-c/issues/375">what would happened when json_object_object_add add the same key</a> <a href="https://api.github.com/repos/json-c/json-c/issues/376">Eclipse error</a> <a href="https://api.github.com/repos/json-c/json-c/issues/377">on gcc 7.2.0 on my linux distribution with json-c 2013-04-02 source</a> <a href="https://api.github.com/repos/json-c/json-c/issues/378">Eclipse: library (libjson-c) not found, but configured</a> <a href="https://api.github.com/repos/json-c/json-c/issues/379">error: this statement may fall through [-Werror=implicit-fallthrough=]</a> <a href="https://api.github.com/repos/json-c/json-c/issues/380">Build on Windows</a> <a href="https://api.github.com/repos/json-c/json-c/issues/381">Fix makedist</a> <a href="https://api.github.com/repos/json-c/json-c/issues/382">Memory leak for json_tokener_parse_ex for version 0.12.1</a> <a href="https://api.github.com/repos/json-c/json-c/issues/383">Fix a compiler warning.</a> <a href="https://api.github.com/repos/json-c/json-c/issues/384">Fix a VS 2015 compiler warnings.</a> </p>
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
diff --git a/doc/html/menu.js b/doc/html/menu.js
new file mode 100644 (file)
index 0000000..97db4c2
--- /dev/null
@@ -0,0 +1,26 @@
+function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
+  function makeTree(data,relPath) {
+    var result='';
+    if ('children' in data) {
+      result+='<ul>';
+      for (var i in data.children) {
+        result+='<li><a href="'+relPath+data.children[i].url+'">'+
+                                data.children[i].text+'</a>'+
+                                makeTree(data.children[i],relPath)+'</li>';
+      }
+      result+='</ul>';
+    }
+    return result;
+  }
+
+  $('#main-nav').append(makeTree(menudata,relPath));
+  $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
+  if (searchEnabled) {
+    if (serverSide) {
+      $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.png" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
+    } else {
+      $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.png" alt=""/></a></span></div></li>');
+    }
+  }
+  $('#main-menu').smartmenus();
+}
diff --git a/doc/html/menudata.js b/doc/html/menudata.js
new file mode 100644 (file)
index 0000000..138ce5b
--- /dev/null
@@ -0,0 +1,92 @@
+var menudata={children:[
+{text:"Main Page",url:"index.html"},
+{text:"Related Pages",url:"pages.html"},
+{text:"Data Structures",url:"annotated.html",children:[
+{text:"Data Structures",url:"annotated.html"},
+{text:"Data Fields",url:"functions.html",children:[
+{text:"All",url:"functions.html",children:[
+{text:"_",url:"functions.html#index__"},
+{text:"a",url:"functions.html#index_a"},
+{text:"b",url:"functions.html#index_b"},
+{text:"c",url:"functions.html#index_c"},
+{text:"d",url:"functions.html#index_d"},
+{text:"e",url:"functions.html#index_e"},
+{text:"f",url:"functions.html#index_f"},
+{text:"h",url:"functions.html#index_h"},
+{text:"i",url:"functions.html#index_i"},
+{text:"k",url:"functions.html#index_k"},
+{text:"l",url:"functions.html#index_l"},
+{text:"m",url:"functions.html#index_m"},
+{text:"n",url:"functions.html#index_n"},
+{text:"o",url:"functions.html#index_o"},
+{text:"p",url:"functions.html#index_p"},
+{text:"q",url:"functions.html#index_q"},
+{text:"s",url:"functions.html#index_s"},
+{text:"t",url:"functions.html#index_t"},
+{text:"u",url:"functions.html#index_u"},
+{text:"v",url:"functions.html#index_v"}]},
+{text:"Variables",url:"functions_vars.html",children:[
+{text:"_",url:"functions_vars.html#index__"},
+{text:"a",url:"functions_vars.html#index_a"},
+{text:"b",url:"functions_vars.html#index_b"},
+{text:"c",url:"functions_vars.html#index_c"},
+{text:"d",url:"functions_vars.html#index_d"},
+{text:"e",url:"functions_vars.html#index_e"},
+{text:"f",url:"functions_vars.html#index_f"},
+{text:"h",url:"functions_vars.html#index_h"},
+{text:"i",url:"functions_vars.html#index_i"},
+{text:"k",url:"functions_vars.html#index_k"},
+{text:"l",url:"functions_vars.html#index_l"},
+{text:"m",url:"functions_vars.html#index_m"},
+{text:"n",url:"functions_vars.html#index_n"},
+{text:"o",url:"functions_vars.html#index_o"},
+{text:"p",url:"functions_vars.html#index_p"},
+{text:"q",url:"functions_vars.html#index_q"},
+{text:"s",url:"functions_vars.html#index_s"},
+{text:"t",url:"functions_vars.html#index_t"},
+{text:"u",url:"functions_vars.html#index_u"},
+{text:"v",url:"functions_vars.html#index_v"}]}]}]},
+{text:"Files",url:"files.html",children:[
+{text:"File List",url:"files.html"},
+{text:"Globals",url:"globals.html",children:[
+{text:"All",url:"globals.html",children:[
+{text:"_",url:"globals.html#index__"},
+{text:"a",url:"globals_a.html#index_a"},
+{text:"e",url:"globals_e.html#index_e"},
+{text:"f",url:"globals_f.html#index_f"},
+{text:"h",url:"globals_h.html#index_h"},
+{text:"i",url:"globals_i.html#index_i"},
+{text:"j",url:"globals_j.html#index_j"},
+{text:"l",url:"globals_l.html#index_l"},
+{text:"m",url:"globals_m.html#index_m"},
+{text:"n",url:"globals_n.html#index_n"},
+{text:"p",url:"globals_p.html#index_p"},
+{text:"s",url:"globals_s.html#index_s"},
+{text:"t",url:"globals_t.html#index_t"}]},
+{text:"Functions",url:"globals_func.html",children:[
+{text:"_",url:"globals_func.html#index__"},
+{text:"a",url:"globals_func.html#index_a"},
+{text:"j",url:"globals_func.html#index_j"},
+{text:"l",url:"globals_func.html#index_l"},
+{text:"m",url:"globals_func.html#index_m"},
+{text:"p",url:"globals_func.html#index_p"},
+{text:"s",url:"globals_func.html#index_s"}]},
+{text:"Variables",url:"globals_vars.html"},
+{text:"Typedefs",url:"globals_type.html"},
+{text:"Enumerations",url:"globals_enum.html"},
+{text:"Enumerator",url:"globals_eval.html",children:[
+{text:"j",url:"globals_eval.html#index_j"}]},
+{text:"Macros",url:"globals_defs.html",children:[
+{text:"_",url:"globals_defs.html#index__"},
+{text:"a",url:"globals_defs.html#index_a"},
+{text:"e",url:"globals_defs.html#index_e"},
+{text:"f",url:"globals_defs.html#index_f"},
+{text:"h",url:"globals_defs.html#index_h"},
+{text:"i",url:"globals_defs.html#index_i"},
+{text:"j",url:"globals_defs.html#index_j"},
+{text:"l",url:"globals_defs.html#index_l"},
+{text:"m",url:"globals_defs.html#index_m"},
+{text:"n",url:"globals_defs.html#index_n"},
+{text:"p",url:"globals_defs.html#index_p"},
+{text:"s",url:"globals_defs.html#index_s"},
+{text:"t",url:"globals_defs.html#index_t"}]}]}]}]}
index 6591f7e..8c36160 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: Related Pages</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
 <div class="contents">
 <div class="textblock">Here is a list of all related documentation pages:</div><div class="directory">
 <table class="directory">
-<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="deprecated.html" target="_self">Deprecated List</a></td><td class="desc"></td></tr>
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_issues_closed_for_0_813.html" target="_self">issues_closed_for_0</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="deprecated.html" target="_self">Deprecated List</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 11:51:18 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index f0434ec..4b310fe 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: printbuf.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
 <a href="#nested-classes">Data Structures</a> &#124;
 <a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
 <a href="#func-members">Functions</a>  </div>
   <div class="headertitle">
 <div class="title">printbuf.h File Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
+
+<p>Internal string buffer handing. Unless you're writing a json_object_to_json_string_fn implementation for use with <a class="el" href="json__object_8h.html#a889345512a214b8f78f6a73561523c7c">json_object_set_serializer()</a> direct use of this is not recommended.  
+<a href="#details">More...</a></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
 Data Structures</h2></td></tr>
@@ -63,6 +62,15 @@ Macros</h2></td></tr>
 <tr class="separator:a6f3a4dc87fab41c37e3eff42f40dc346"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:acdd84ad88987c0166b7ba0e3f1f8f1bb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="printbuf_8h.html#acdd84ad88987c0166b7ba0e3f1f8f1bb">printbuf_length</a>(p)&#160;&#160;&#160;((p)-&gt;bpos)</td></tr>
 <tr class="separator:acdd84ad88987c0166b7ba0e3f1f8f1bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab009973c5e15aae191e610cd70752603"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="printbuf_8h.html#ab009973c5e15aae191e610cd70752603">_printbuf_check_literal</a>(mystr)&#160;&#160;&#160;(&quot;&quot; mystr)</td></tr>
+<tr class="separator:ab009973c5e15aae191e610cd70752603"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f30492682f5fbc59a8749b428e0e4ba"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="printbuf_8h.html#a2f30492682f5fbc59a8749b428e0e4ba">printbuf_strappend</a>(pb,  str)&#160;&#160;&#160;<a class="el" href="printbuf_8h.html#a22f09779a19db59a83e7cb8c2ce4c75f">printbuf_memappend</a> ((pb), <a class="el" href="printbuf_8h.html#ab009973c5e15aae191e610cd70752603">_printbuf_check_literal</a>(str), sizeof(str) - 1)</td></tr>
+<tr class="separator:a2f30492682f5fbc59a8749b428e0e4ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ace274df280df67463ff417b1b3392395"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structprintbuf.html">printbuf</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="printbuf_8h.html#ace274df280df67463ff417b1b3392395">printbuf</a></td></tr>
+<tr class="separator:ace274df280df67463ff417b1b3392395"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
 Functions</h2></td></tr>
@@ -79,8 +87,31 @@ Functions</h2></td></tr>
 <tr class="memitem:ab525221c767ac65c58ddeea8a655a4e8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="printbuf_8h.html#ab525221c767ac65c58ddeea8a655a4e8">printbuf_free</a> (struct <a class="el" href="structprintbuf.html">printbuf</a> *p)</td></tr>
 <tr class="separator:ab525221c767ac65c58ddeea8a655a4e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
-<h2 class="groupheader">Macro Definition Documentation</h2>
-<a class="anchor" id="acdd84ad88987c0166b7ba0e3f1f8f1bb"></a>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Internal string buffer handing. Unless you're writing a json_object_to_json_string_fn implementation for use with <a class="el" href="json__object_8h.html#a889345512a214b8f78f6a73561523c7c">json_object_set_serializer()</a> direct use of this is not recommended. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ab009973c5e15aae191e610cd70752603"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab009973c5e15aae191e610cd70752603">&#9670;&nbsp;</a></span>_printbuf_check_literal</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define _printbuf_check_literal</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">mystr</td><td>)</td>
+          <td>&#160;&#160;&#160;(&quot;&quot; mystr)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Results in a compile error if the argument is not a string literal. </p>
+
+</div>
+</div>
+<a id="acdd84ad88987c0166b7ba0e3f1f8f1bb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acdd84ad88987c0166b7ba0e3f1f8f1bb">&#9670;&nbsp;</a></span>printbuf_length</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -96,7 +127,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a6f3a4dc87fab41c37e3eff42f40dc346"></a>
+<a id="a6f3a4dc87fab41c37e3eff42f40dc346"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6f3a4dc87fab41c37e3eff42f40dc346">&#9670;&nbsp;</a></span>printbuf_memappend_fast</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -125,19 +158,59 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">do</span> {                                                         \</div>
-<div class="line">  if ((p-&gt;size - p-&gt;bpos) &gt; bufsize) {                       \</div>
-<div class="line">    memcpy(p-&gt;buf + p-&gt;bpos, (bufptr), bufsize);             \</div>
-<div class="line">    p-&gt;bpos += bufsize;                                      \</div>
-<div class="line">    p-&gt;buf[p-&gt;bpos]= <span class="charliteral">&#39;\0&#39;</span>;                                   \</div>
-<div class="line">  } <span class="keywordflow">else</span> {  <a class="code" href="printbuf_8h.html#a22f09779a19db59a83e7cb8c2ce4c75f">printbuf_memappend</a>(p, (bufptr), bufsize); }      \</div>
-<div class="line">} <span class="keywordflow">while</span> (0)</div>
-<div class="ttc" id="printbuf_8h_html_a22f09779a19db59a83e7cb8c2ce4c75f"><div class="ttname"><a href="printbuf_8h.html#a22f09779a19db59a83e7cb8c2ce4c75f">printbuf_memappend</a></div><div class="ttdeci">int printbuf_memappend(struct printbuf *p, const char *buf, int size)</div></div>
+<b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">do</span> {                                                         \</div><div class="line">  if ((p-&gt;size - p-&gt;bpos) &gt; bufsize) {                       \</div><div class="line">    memcpy(p-&gt;buf + p-&gt;bpos, (bufptr), bufsize);             \</div><div class="line">    p-&gt;bpos += bufsize;                                      \</div><div class="line">    p-&gt;buf[p-&gt;bpos]= <span class="charliteral">&#39;\0&#39;</span>;                                   \</div><div class="line">  } <span class="keywordflow">else</span> {  <a class="code" href="printbuf_8h.html#a22f09779a19db59a83e7cb8c2ce4c75f">printbuf_memappend</a>(p, (bufptr), bufsize); }      \</div><div class="line">} <span class="keywordflow">while</span> (0)</div><div class="ttc" id="printbuf_8h_html_a22f09779a19db59a83e7cb8c2ce4c75f"><div class="ttname"><a href="printbuf_8h.html#a22f09779a19db59a83e7cb8c2ce4c75f">printbuf_memappend</a></div><div class="ttdeci">int printbuf_memappend(struct printbuf *p, const char *buf, int size)</div></div>
 </div><!-- fragment -->
 </div>
 </div>
+<a id="a2f30492682f5fbc59a8749b428e0e4ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2f30492682f5fbc59a8749b428e0e4ba">&#9670;&nbsp;</a></span>printbuf_strappend</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define printbuf_strappend</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">pb, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">str&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="printbuf_8h.html#a22f09779a19db59a83e7cb8c2ce4c75f">printbuf_memappend</a> ((pb), <a class="el" href="printbuf_8h.html#ab009973c5e15aae191e610cd70752603">_printbuf_check_literal</a>(str), sizeof(str) - 1)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This is an optimization wrapper around <a class="el" href="printbuf_8h.html#a22f09779a19db59a83e7cb8c2ce4c75f">printbuf_memappend()</a> that is useful for appending string literals. Since the size of string constants is known at compile time, using this macro can avoid a costly strlen() call. This is especially helpful when a constant string must be appended many times. If you got here because of a compilation error caused by passing something other than a string literal, use <a class="el" href="printbuf_8h.html#a6f3a4dc87fab41c37e3eff42f40dc346">printbuf_memappend_fast()</a> in conjunction with strlen().</p>
+<p>See also: <a class="el" href="printbuf_8h.html#a6f3a4dc87fab41c37e3eff42f40dc346">printbuf_memappend_fast()</a> <a class="el" href="printbuf_8h.html#a22f09779a19db59a83e7cb8c2ce4c75f">printbuf_memappend()</a> <a class="el" href="printbuf_8h.html#adf6214db6c8ce994c7f7f1180863c8a4">sprintbuf()</a> </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="ace274df280df67463ff417b1b3392395"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ace274df280df67463ff417b1b3392395">&#9670;&nbsp;</a></span>printbuf</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structprintbuf.html">printbuf</a> <a class="el" href="structprintbuf.html">printbuf</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
 <h2 class="groupheader">Function Documentation</h2>
-<a class="anchor" id="ab525221c767ac65c58ddeea8a655a4e8"></a>
+<a id="ab525221c767ac65c58ddeea8a655a4e8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab525221c767ac65c58ddeea8a655a4e8">&#9670;&nbsp;</a></span>printbuf_free()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -153,7 +226,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a22f09779a19db59a83e7cb8c2ce4c75f"></a>
+<a id="a22f09779a19db59a83e7cb8c2ce4c75f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a22f09779a19db59a83e7cb8c2ce4c75f">&#9670;&nbsp;</a></span>printbuf_memappend()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -185,7 +260,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ad7fc6ec4c296e85abf404244614cded5"></a>
+<a id="ad7fc6ec4c296e85abf404244614cded5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad7fc6ec4c296e85abf404244614cded5">&#9670;&nbsp;</a></span>printbuf_memset()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -226,7 +303,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a3e390ebc7660a18335edd89f640fd415"></a>
+<a id="a3e390ebc7660a18335edd89f640fd415"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3e390ebc7660a18335edd89f640fd415">&#9670;&nbsp;</a></span>printbuf_new()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -242,7 +321,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a4393ee3dedb376af11c96fe97532292e"></a>
+<a id="a4393ee3dedb376af11c96fe97532292e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4393ee3dedb376af11c96fe97532292e">&#9670;&nbsp;</a></span>printbuf_reset()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -258,7 +339,9 @@ Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="adf6214db6c8ce994c7f7f1180863c8a4"></a>
+<a id="adf6214db6c8ce994c7f7f1180863c8a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adf6214db6c8ce994c7f7f1180863c8a4">&#9670;&nbsp;</a></span>sprintbuf()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -287,15 +370,18 @@ Functions</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
+<p>Formatted print to printbuf.</p>
+<p>This function is the most expensive of the available functions for appending string data to a printbuf and should be used only where convenience is more important than speed. Avoid using this function in high performance code or tight loops; in these scenarios, consider using snprintf() with a static buffer in conjunction with one of the printbuf_*append() functions.</p>
+<p>See also: <a class="el" href="printbuf_8h.html#a6f3a4dc87fab41c37e3eff42f40dc346">printbuf_memappend_fast()</a> <a class="el" href="printbuf_8h.html#a22f09779a19db59a83e7cb8c2ce4c75f">printbuf_memappend()</a> <a class="el" href="printbuf_8h.html#a2f30492682f5fbc59a8749b428e0e4ba">printbuf_strappend()</a> </p>
 
 </div>
 </div>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 20:51:02 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 10efb44..6578c86 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: random_seed.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li class="current"><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="files.html"><span>File&#160;List</span></a></li>
-      <li><a href="globals.html"><span>Globals</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
 <div class="title">random_seed.h File Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
+
+<p>Do not use, json-c internal, may be changed or removed at any time.  
+<a href="#details">More...</a></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
 Functions</h2></td></tr>
 <tr class="memitem:ae190c6819d7687e110d6ec59a16d006f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="random__seed_8h.html#ae190c6819d7687e110d6ec59a16d006f">json_c_get_random_seed</a> ()</td></tr>
 <tr class="separator:ae190c6819d7687e110d6ec59a16d006f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
-<h2 class="groupheader">Function Documentation</h2>
-<a class="anchor" id="ae190c6819d7687e110d6ec59a16d006f"></a>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Do not use, json-c internal, may be changed or removed at any time. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="ae190c6819d7687e110d6ec59a16d006f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae190c6819d7687e110d6ec59a16d006f">&#9670;&nbsp;</a></span>json_c_get_random_seed()</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -74,9 +76,9 @@ Functions</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 03:49:10 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
diff --git a/doc/html/snprintf__compat_8h.html b/doc/html/snprintf__compat_8h.html
new file mode 100644 (file)
index 0000000..7575fba
--- /dev/null
@@ -0,0 +1,58 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>json-c: snprintf_compat.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">json-c
+   &#160;<span id="projectnumber">0.13</span>
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">snprintf_compat.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Do not use, json-c internal, may be changed or removed at any time.  
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Do not use, json-c internal, may be changed or removed at any time. </p>
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
diff --git a/doc/html/strdup__compat_8h.html b/doc/html/strdup__compat_8h.html
new file mode 100644 (file)
index 0000000..0656971
--- /dev/null
@@ -0,0 +1,58 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>json-c: strdup_compat.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">json-c
+   &#160;<span id="projectnumber">0.13</span>
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">strdup_compat.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Do not use, json-c internal, may be changed or removed at any time.  
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Do not use, json-c internal, may be changed or removed at any time. </p>
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
diff --git a/doc/html/strerror__override_8h.html b/doc/html/strerror__override_8h.html
new file mode 100644 (file)
index 0000000..274a7c6
--- /dev/null
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>json-c: strerror_override.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">json-c
+   &#160;<span id="projectnumber">0.13</span>
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">strerror_override.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Do not use, json-c internal, may be changed or removed at any time.  
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a9dae36435b1668856ec610d6d5238754"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="strerror__override_8h.html#a9dae36435b1668856ec610d6d5238754">strerror</a>&#160;&#160;&#160;<a class="el" href="strerror__override_8h.html#a2affa276d0d7b0a446105e324560576f">_json_c_strerror</a></td></tr>
+<tr class="separator:a9dae36435b1668856ec610d6d5238754"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2affa276d0d7b0a446105e324560576f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="strerror__override_8h.html#a2affa276d0d7b0a446105e324560576f">_json_c_strerror</a> (int errno_in)</td></tr>
+<tr class="separator:a2affa276d0d7b0a446105e324560576f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Do not use, json-c internal, may be changed or removed at any time. </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a9dae36435b1668856ec610d6d5238754"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9dae36435b1668856ec610d6d5238754">&#9670;&nbsp;</a></span>strerror</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define strerror&#160;&#160;&#160;<a class="el" href="strerror__override_8h.html#a2affa276d0d7b0a446105e324560576f">_json_c_strerror</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a2affa276d0d7b0a446105e324560576f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2affa276d0d7b0a446105e324560576f">&#9670;&nbsp;</a></span>_json_c_strerror()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object_8h.html#a2a31d5c00f3a4712f2d5d62aee66344e">JSON_EXPORT</a> char* _json_c_strerror </td>
+          <td>(</td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>errno_in</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
diff --git a/doc/html/strerror__override__private_8h.html b/doc/html/strerror__override__private_8h.html
new file mode 100644 (file)
index 0000000..da7a3f9
--- /dev/null
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>json-c: strerror_override_private.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">json-c
+   &#160;<span id="projectnumber">0.13</span>
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<div class="title">strerror_override_private.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Do not use, json-c internal, may be changed or removed at any time.  
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ac00e7d4121efe4b2e6ad8961e35e88ba"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="strerror__override__private_8h.html#ac00e7d4121efe4b2e6ad8961e35e88ba">_json_c_strerror_enable</a></td></tr>
+<tr class="separator:ac00e7d4121efe4b2e6ad8961e35e88ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Do not use, json-c internal, may be changed or removed at any time. </p>
+</div><h2 class="groupheader">Variable Documentation</h2>
+<a id="ac00e7d4121efe4b2e6ad8961e35e88ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac00e7d4121efe4b2e6ad8961e35e88ba">&#9670;&nbsp;</a></span>_json_c_strerror_enable</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int _json_c_strerror_enable</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
index 446e3b6..0d27773 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: array_list Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
 Data Fields</h2></td></tr>
 <tr class="memitem:a7ba65feda2b156148c08667cf155b657"><td class="memItemLeft" align="right" valign="top">void **&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structarray__list.html#a7ba65feda2b156148c08667cf155b657">array</a></td></tr>
 <tr class="separator:a7ba65feda2b156148c08667cf155b657"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a442fcfde196a3cc95a647f0708de814d"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structarray__list.html#a442fcfde196a3cc95a647f0708de814d">length</a></td></tr>
-<tr class="separator:a442fcfde196a3cc95a647f0708de814d"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aba48a197d3c8f1d56682da23fe883d0a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structarray__list.html#aba48a197d3c8f1d56682da23fe883d0a">size</a></td></tr>
-<tr class="separator:aba48a197d3c8f1d56682da23fe883d0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ab7989cdde357e5c7819c562c7680ab74"><td class="memItemLeft" align="right" valign="top"><a class="el" href="arraylist_8h.html#a41e5f51b1befa448b861e61a2c352bd6">array_list_free_fn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structarray__list.html#ab7989cdde357e5c7819c562c7680ab74">free_fn</a></td></tr>
+<tr class="memitem:a5638022574f4ddb0f80d62535085bf4f"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structarray__list.html#a5638022574f4ddb0f80d62535085bf4f">length</a></td></tr>
+<tr class="separator:a5638022574f4ddb0f80d62535085bf4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a11b92f48ed715b187f8609351405342f"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structarray__list.html#a11b92f48ed715b187f8609351405342f">size</a></td></tr>
+<tr class="separator:a11b92f48ed715b187f8609351405342f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab7989cdde357e5c7819c562c7680ab74"><td class="memItemLeft" align="right" valign="top"><a class="el" href="arraylist_8h.html#a90d2ce204a483fa38f5514bad67222aa">array_list_free_fn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structarray__list.html#ab7989cdde357e5c7819c562c7680ab74">free_fn</a></td></tr>
 <tr class="separator:ab7989cdde357e5c7819c562c7680ab74"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <h2 class="groupheader">Field Documentation</h2>
-<a class="anchor" id="a7ba65feda2b156148c08667cf155b657"></a>
+<a id="a7ba65feda2b156148c08667cf155b657"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7ba65feda2b156148c08667cf155b657">&#9670;&nbsp;</a></span>array</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -74,36 +71,42 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ab7989cdde357e5c7819c562c7680ab74"></a>
+<a id="ab7989cdde357e5c7819c562c7680ab74"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab7989cdde357e5c7819c562c7680ab74">&#9670;&nbsp;</a></span>free_fn</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname"><a class="el" href="arraylist_8h.html#a41e5f51b1befa448b861e61a2c352bd6">array_list_free_fn</a>* array_list::free_fn</td>
+          <td class="memname"><a class="el" href="arraylist_8h.html#a90d2ce204a483fa38f5514bad67222aa">array_list_free_fn</a>* array_list::free_fn</td>
         </tr>
       </table>
 </div><div class="memdoc">
 
 </div>
 </div>
-<a class="anchor" id="a442fcfde196a3cc95a647f0708de814d"></a>
+<a id="a5638022574f4ddb0f80d62535085bf4f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5638022574f4ddb0f80d62535085bf4f">&#9670;&nbsp;</a></span>length</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int array_list::length</td>
+          <td class="memname">size_t array_list::length</td>
         </tr>
       </table>
 </div><div class="memdoc">
 
 </div>
 </div>
-<a class="anchor" id="aba48a197d3c8f1d56682da23fe883d0a"></a>
+<a id="a11b92f48ed715b187f8609351405342f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a11b92f48ed715b187f8609351405342f">&#9670;&nbsp;</a></span>size</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int array_list::size</td>
+          <td class="memname">size_t array_list::size</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -116,9 +119,9 @@ Data Fields</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 16:37:10 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 631c772..283d06d 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: json_object Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
@@ -60,9 +55,9 @@ Data Structures</h2></td></tr>
 Data Fields</h2></td></tr>
 <tr class="memitem:a28307a4a3fe6cefe27e28fec56b76b3e"><td class="memItemLeft" align="right" valign="top">enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#a28307a4a3fe6cefe27e28fec56b76b3e">o_type</a></td></tr>
 <tr class="separator:a28307a4a3fe6cefe27e28fec56b76b3e"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a63666be714a8ce8907d56142c1d9dfb7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object__private_8h.html#aa7d02026483e5ff3af5d6181d4efd032">json_object_private_delete_fn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#a63666be714a8ce8907d56142c1d9dfb7">_delete</a></td></tr>
+<tr class="memitem:a63666be714a8ce8907d56142c1d9dfb7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object__private_8h.html#a725ac370dfd6c705c02d8d85b78f1050">json_object_private_delete_fn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#a63666be714a8ce8907d56142c1d9dfb7">_delete</a></td></tr>
 <tr class="separator:a63666be714a8ce8907d56142c1d9dfb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a077a02daac4653f91584dd7f47c3d632"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a7806d0a6826ac08f6f8b09636207870e">json_object_to_json_string_fn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#a077a02daac4653f91584dd7f47c3d632">_to_json_string</a></td></tr>
+<tr class="memitem:a077a02daac4653f91584dd7f47c3d632"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#ad689953451ffa828830d349f4cd72563">json_object_to_json_string_fn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#a077a02daac4653f91584dd7f47c3d632">_to_json_string</a></td></tr>
 <tr class="separator:a077a02daac4653f91584dd7f47c3d632"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aca9b93573ba6bb8cf66d87c170a575b2"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#aca9b93573ba6bb8cf66d87c170a575b2">_ref_count</a></td></tr>
 <tr class="separator:aca9b93573ba6bb8cf66d87c170a575b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -70,25 +65,29 @@ Data Fields</h2></td></tr>
 <tr class="separator:afdcaa9e24bce7c86c33cb6f6ae65cb56"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a33aff83ffea02b934235c4821cca8cf0"><td class="memItemLeft" align="right" valign="top">union <a class="el" href="unionjson__object_1_1data.html">json_object::data</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#a33aff83ffea02b934235c4821cca8cf0">o</a></td></tr>
 <tr class="separator:a33aff83ffea02b934235c4821cca8cf0"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ad9e57edb1cbd63578490081b2a9636ad"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a3032a61c0ba2d38563b1b765f54ea46f">json_object_delete_fn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#ad9e57edb1cbd63578490081b2a9636ad">_user_delete</a></td></tr>
+<tr class="memitem:ad9e57edb1cbd63578490081b2a9636ad"><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a57e58c272b899b7034c3b5137935117f">json_object_delete_fn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#ad9e57edb1cbd63578490081b2a9636ad">_user_delete</a></td></tr>
 <tr class="separator:ad9e57edb1cbd63578490081b2a9636ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a592a5391c3717ff7e8930476027226fe"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#a592a5391c3717ff7e8930476027226fe">_userdata</a></td></tr>
 <tr class="separator:a592a5391c3717ff7e8930476027226fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <h2 class="groupheader">Field Documentation</h2>
-<a class="anchor" id="a63666be714a8ce8907d56142c1d9dfb7"></a>
+<a id="a63666be714a8ce8907d56142c1d9dfb7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a63666be714a8ce8907d56142c1d9dfb7">&#9670;&nbsp;</a></span>_delete</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname"><a class="el" href="json__object__private_8h.html#aa7d02026483e5ff3af5d6181d4efd032">json_object_private_delete_fn</a>* json_object::_delete</td>
+          <td class="memname"><a class="el" href="json__object__private_8h.html#a725ac370dfd6c705c02d8d85b78f1050">json_object_private_delete_fn</a>* json_object::_delete</td>
         </tr>
       </table>
 </div><div class="memdoc">
 
 </div>
 </div>
-<a class="anchor" id="afdcaa9e24bce7c86c33cb6f6ae65cb56"></a>
+<a id="afdcaa9e24bce7c86c33cb6f6ae65cb56"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afdcaa9e24bce7c86c33cb6f6ae65cb56">&#9670;&nbsp;</a></span>_pb</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -100,7 +99,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="aca9b93573ba6bb8cf66d87c170a575b2"></a>
+<a id="aca9b93573ba6bb8cf66d87c170a575b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aca9b93573ba6bb8cf66d87c170a575b2">&#9670;&nbsp;</a></span>_ref_count</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -112,31 +113,37 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a077a02daac4653f91584dd7f47c3d632"></a>
+<a id="a077a02daac4653f91584dd7f47c3d632"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a077a02daac4653f91584dd7f47c3d632">&#9670;&nbsp;</a></span>_to_json_string</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname"><a class="el" href="json__object_8h.html#a7806d0a6826ac08f6f8b09636207870e">json_object_to_json_string_fn</a>* json_object::_to_json_string</td>
+          <td class="memname"><a class="el" href="json__object_8h.html#ad689953451ffa828830d349f4cd72563">json_object_to_json_string_fn</a>* json_object::_to_json_string</td>
         </tr>
       </table>
 </div><div class="memdoc">
 
 </div>
 </div>
-<a class="anchor" id="ad9e57edb1cbd63578490081b2a9636ad"></a>
+<a id="ad9e57edb1cbd63578490081b2a9636ad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad9e57edb1cbd63578490081b2a9636ad">&#9670;&nbsp;</a></span>_user_delete</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname"><a class="el" href="json__object_8h.html#a3032a61c0ba2d38563b1b765f54ea46f">json_object_delete_fn</a>* json_object::_user_delete</td>
+          <td class="memname"><a class="el" href="json__object_8h.html#a57e58c272b899b7034c3b5137935117f">json_object_delete_fn</a>* json_object::_user_delete</td>
         </tr>
       </table>
 </div><div class="memdoc">
 
 </div>
 </div>
-<a class="anchor" id="a592a5391c3717ff7e8930476027226fe"></a>
+<a id="a592a5391c3717ff7e8930476027226fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a592a5391c3717ff7e8930476027226fe">&#9670;&nbsp;</a></span>_userdata</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -148,7 +155,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a33aff83ffea02b934235c4821cca8cf0"></a>
+<a id="a33aff83ffea02b934235c4821cca8cf0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a33aff83ffea02b934235c4821cca8cf0">&#9670;&nbsp;</a></span>o</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -160,7 +169,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a28307a4a3fe6cefe27e28fec56b76b3e"></a>
+<a id="a28307a4a3fe6cefe27e28fec56b76b3e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a28307a4a3fe6cefe27e28fec56b76b3e">&#9670;&nbsp;</a></span>o_type</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -178,9 +189,9 @@ Data Fields</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 09:28:22 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 2471cb4..a1ba7bf 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: json_object_iter Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
@@ -59,8 +54,12 @@ Data Fields</h2></td></tr>
 <tr class="memitem:a64e326f050826c644c02ed5bcd214faa"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object__iter.html#a64e326f050826c644c02ed5bcd214faa">entry</a></td></tr>
 <tr class="separator:a64e326f050826c644c02ed5bcd214faa"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
-<h2 class="groupheader">Field Documentation</h2>
-<a class="anchor" id="a64e326f050826c644c02ed5bcd214faa"></a>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A structure to use with <a class="el" href="json__object_8h.html#a71f07006c12d78f7bbf4cb716a5af3a6">json_object_object_foreachC()</a> loops. Contains key, val and entry members. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a64e326f050826c644c02ed5bcd214faa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a64e326f050826c644c02ed5bcd214faa">&#9670;&nbsp;</a></span>entry</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -72,7 +71,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a0b76228b3a039075e9d84f88fa72ff53"></a>
+<a id="a0b76228b3a039075e9d84f88fa72ff53"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0b76228b3a039075e9d84f88fa72ff53">&#9670;&nbsp;</a></span>key</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -84,7 +85,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="aaae14a8d17aacddacb0a57234e0a4491"></a>
+<a id="aaae14a8d17aacddacb0a57234e0a4491"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaae14a8d17aacddacb0a57234e0a4491">&#9670;&nbsp;</a></span>val</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -102,9 +105,9 @@ Data Fields</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 23:31:02 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 815c794..38cbfd6 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: json_object_iterator Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
@@ -58,7 +53,9 @@ Data Fields</h2></td></tr>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>The opaque iterator that references a name/value pair within a JSON Object instance or the "end" iterator value. </p>
 </div><h2 class="groupheader">Field Documentation</h2>
-<a class="anchor" id="a69c61c14f5a36b1dc2217e49cd987f47"></a>
+<a id="a69c61c14f5a36b1dc2217e49cd987f47"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a69c61c14f5a36b1dc2217e49cd987f47">&#9670;&nbsp;</a></span>opaque_</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -76,9 +73,9 @@ Data Fields</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 16:47:50 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 13653ef..9ca6755 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: json_tokener Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
@@ -78,7 +73,9 @@ Data Fields</h2></td></tr>
 <tr class="separator:aabfdcf2825154108669ffa3f4ab9c4ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <h2 class="groupheader">Field Documentation</h2>
-<a class="anchor" id="a9daae2516fd6df23555d33ef01020a76"></a>
+<a id="a9daae2516fd6df23555d33ef01020a76"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9daae2516fd6df23555d33ef01020a76">&#9670;&nbsp;</a></span>char_offset</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -90,7 +87,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ae0e5102b44cc1fc680be3e0fb5fff028"></a>
+<a id="ae0e5102b44cc1fc680be3e0fb5fff028"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae0e5102b44cc1fc680be3e0fb5fff028">&#9670;&nbsp;</a></span>depth</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -102,7 +101,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="adef37cdc2578d8f8920db14315728cbd"></a>
+<a id="adef37cdc2578d8f8920db14315728cbd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adef37cdc2578d8f8920db14315728cbd">&#9670;&nbsp;</a></span>err</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -114,7 +115,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="aabfdcf2825154108669ffa3f4ab9c4ea"></a>
+<a id="aabfdcf2825154108669ffa3f4ab9c4ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aabfdcf2825154108669ffa3f4ab9c4ea">&#9670;&nbsp;</a></span>flags</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -126,7 +129,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ad3bf0aa728ea14549d5aa6ca8dcba070"></a>
+<a id="ad3bf0aa728ea14549d5aa6ca8dcba070"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad3bf0aa728ea14549d5aa6ca8dcba070">&#9670;&nbsp;</a></span>is_double</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -138,7 +143,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a9d9b33c3982925349627dc6a3edca940"></a>
+<a id="a9d9b33c3982925349627dc6a3edca940"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9d9b33c3982925349627dc6a3edca940">&#9670;&nbsp;</a></span>max_depth</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -150,7 +157,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a1cdc7f85d7bde95f81bb08b7e61d6684"></a>
+<a id="a1cdc7f85d7bde95f81bb08b7e61d6684"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1cdc7f85d7bde95f81bb08b7e61d6684">&#9670;&nbsp;</a></span>pb</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -162,7 +171,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="aea488b73085ac7c5969ae7fc29e25fa0"></a>
+<a id="aea488b73085ac7c5969ae7fc29e25fa0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aea488b73085ac7c5969ae7fc29e25fa0">&#9670;&nbsp;</a></span>quote_char</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -174,7 +185,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a8eed213c0a37d09c1df66c8567e44471"></a>
+<a id="a8eed213c0a37d09c1df66c8567e44471"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8eed213c0a37d09c1df66c8567e44471">&#9670;&nbsp;</a></span>st_pos</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -186,7 +199,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a3521d62906eb0e15d07d7b4f64a5fac3"></a>
+<a id="a3521d62906eb0e15d07d7b4f64a5fac3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3521d62906eb0e15d07d7b4f64a5fac3">&#9670;&nbsp;</a></span>stack</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -198,7 +213,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a9772e2170322a19d8da6ce5d7dc46895"></a>
+<a id="a9772e2170322a19d8da6ce5d7dc46895"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9772e2170322a19d8da6ce5d7dc46895">&#9670;&nbsp;</a></span>str</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -210,7 +227,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a32fa73e43fb760e6845231a8482eb064"></a>
+<a id="a32fa73e43fb760e6845231a8482eb064"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a32fa73e43fb760e6845231a8482eb064">&#9670;&nbsp;</a></span>ucs_char</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -228,9 +247,9 @@ Data Fields</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 08:39:18 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index cf6c795..390b76d 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: json_tokener_srec Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
@@ -62,7 +57,9 @@ Data Fields</h2></td></tr>
 <tr class="separator:a99551c172e97ac2e7a3849a50b4f51ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <h2 class="groupheader">Field Documentation</h2>
-<a class="anchor" id="a466f192f920368a5a6375aeba1e2757f"></a>
+<a id="a466f192f920368a5a6375aeba1e2757f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a466f192f920368a5a6375aeba1e2757f">&#9670;&nbsp;</a></span>current</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -74,7 +71,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ad2bb71affec1da5ba1d9952c3bf2c12a"></a>
+<a id="ad2bb71affec1da5ba1d9952c3bf2c12a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad2bb71affec1da5ba1d9952c3bf2c12a">&#9670;&nbsp;</a></span>obj</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -86,7 +85,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a99551c172e97ac2e7a3849a50b4f51ca"></a>
+<a id="a99551c172e97ac2e7a3849a50b4f51ca"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a99551c172e97ac2e7a3849a50b4f51ca">&#9670;&nbsp;</a></span>obj_field_name</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -98,7 +99,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a868b9912dbb1e4813a630c944f522d48"></a>
+<a id="a868b9912dbb1e4813a630c944f522d48"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a868b9912dbb1e4813a630c944f522d48">&#9670;&nbsp;</a></span>saved_state</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -116,9 +119,9 @@ Data Fields</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 16:13:42 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 1f898d2..d347bbc 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: lh_entry Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Data Fields</h2></td></tr>
-<tr class="memitem:a6b176b3582c9cf553af6431750f5c3b6"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__entry.html#a6b176b3582c9cf553af6431750f5c3b6">k</a></td></tr>
-<tr class="separator:a6b176b3582c9cf553af6431750f5c3b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a79d9f1ef0dc444e17105aaeaf167e22c"><td class="memItemLeft" align="right" valign="top">const void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__entry.html#a79d9f1ef0dc444e17105aaeaf167e22c">k</a></td></tr>
+<tr class="separator:a79d9f1ef0dc444e17105aaeaf167e22c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a14f40cc124c32b03f81151ae7934d2e7"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__entry.html#a14f40cc124c32b03f81151ae7934d2e7">k_is_constant</a></td></tr>
+<tr class="separator:a14f40cc124c32b03f81151ae7934d2e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a1b676732ab2ad3eeaedf6ec60a6a0835"><td class="memItemLeft" align="right" valign="top">const void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__entry.html#a1b676732ab2ad3eeaedf6ec60a6a0835">v</a></td></tr>
 <tr class="separator:a1b676732ab2ad3eeaedf6ec60a6a0835"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a7c40c46e72d9a0ba071a8d49d535bc67"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__entry.html#a7c40c46e72d9a0ba071a8d49d535bc67">next</a></td></tr>
@@ -64,20 +61,39 @@ Data Fields</h2></td></tr>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>An entry in the hash table </p>
 </div><h2 class="groupheader">Field Documentation</h2>
-<a class="anchor" id="a6b176b3582c9cf553af6431750f5c3b6"></a>
+<a id="a79d9f1ef0dc444e17105aaeaf167e22c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a79d9f1ef0dc444e17105aaeaf167e22c">&#9670;&nbsp;</a></span>k</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void* lh_entry::k</td>
+          <td class="memname">const void* lh_entry::k</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>The key. </p>
+<p>The key. Use <a class="el" href="linkhash_8h.html#a7579ce28b8366fc9b8656f14270aa3aa">lh_entry_k()</a> instead of accessing this directly. </p>
 
 </div>
 </div>
-<a class="anchor" id="a7c40c46e72d9a0ba071a8d49d535bc67"></a>
+<a id="a14f40cc124c32b03f81151ae7934d2e7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a14f40cc124c32b03f81151ae7934d2e7">&#9670;&nbsp;</a></span>k_is_constant</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lh_entry::k_is_constant</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>A flag for users of linkhash to know whether or not they need to free k. </p>
+
+</div>
+</div>
+<a id="a7c40c46e72d9a0ba071a8d49d535bc67"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7c40c46e72d9a0ba071a8d49d535bc67">&#9670;&nbsp;</a></span>next</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -90,7 +106,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a6fb9c3de01fb5af67d8d429921cc6a3b"></a>
+<a id="a6fb9c3de01fb5af67d8d429921cc6a3b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6fb9c3de01fb5af67d8d429921cc6a3b">&#9670;&nbsp;</a></span>prev</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -103,7 +121,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a1b676732ab2ad3eeaedf6ec60a6a0835"></a>
+<a id="a1b676732ab2ad3eeaedf6ec60a6a0835"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1b676732ab2ad3eeaedf6ec60a6a0835">&#9670;&nbsp;</a></span>v</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -112,7 +132,7 @@ Data Fields</h2></td></tr>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>The value. </p>
+<p>The value. Use <a class="el" href="linkhash_8h.html#a0d4052ccfd8c5d351a9c1d3ba07671b3">lh_entry_v()</a> instead of accessing this directly. </p>
 
 </div>
 </div>
@@ -122,9 +142,9 @@ Data Fields</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 03:08:38 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 232b99d..09cf5df 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: lh_table Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
@@ -56,48 +51,25 @@ Data Fields</h2></td></tr>
 <tr class="separator:ae251575ec2935bcb0e0589ca8e243839"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aa172ed8fe205367b54e0e2cdf9ea8c6c"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#aa172ed8fe205367b54e0e2cdf9ea8c6c">count</a></td></tr>
 <tr class="separator:aa172ed8fe205367b54e0e2cdf9ea8c6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a9458e41d842ce40cd37dc13458ced133"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#a9458e41d842ce40cd37dc13458ced133">collisions</a></td></tr>
-<tr class="separator:a9458e41d842ce40cd37dc13458ced133"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ab4cde49bd9ce7a07daaf99af34ddb67e"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#ab4cde49bd9ce7a07daaf99af34ddb67e">resizes</a></td></tr>
-<tr class="separator:ab4cde49bd9ce7a07daaf99af34ddb67e"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:afd0385c645413d26e682f725a6f52164"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#afd0385c645413d26e682f725a6f52164">lookups</a></td></tr>
-<tr class="separator:afd0385c645413d26e682f725a6f52164"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:afd64becd0d2cfbc91a4c9c9a117498b9"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#afd64becd0d2cfbc91a4c9c9a117498b9">inserts</a></td></tr>
-<tr class="separator:afd64becd0d2cfbc91a4c9c9a117498b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a8348bdd7e61c8d72b402f6a152013fbf"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#a8348bdd7e61c8d72b402f6a152013fbf">deletes</a></td></tr>
-<tr class="separator:a8348bdd7e61c8d72b402f6a152013fbf"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aebf4001cde3746ec8025c1d87d4e6279"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#aebf4001cde3746ec8025c1d87d4e6279">name</a></td></tr>
-<tr class="separator:aebf4001cde3746ec8025c1d87d4e6279"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aa7d986a3b12a9fa47e349713794c30fb"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#aa7d986a3b12a9fa47e349713794c30fb">head</a></td></tr>
 <tr class="separator:aa7d986a3b12a9fa47e349713794c30fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a479895e45db2bdf9bf5d173fa4b7e277"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#a479895e45db2bdf9bf5d173fa4b7e277">tail</a></td></tr>
 <tr class="separator:a479895e45db2bdf9bf5d173fa4b7e277"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a4fd9c5aba38791b26ab0ec614a5caf8f"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#a4fd9c5aba38791b26ab0ec614a5caf8f">table</a></td></tr>
 <tr class="separator:a4fd9c5aba38791b26ab0ec614a5caf8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a30ea5903f4f8126abd6aa489ffe14737"><td class="memItemLeft" align="right" valign="top"><a class="el" href="linkhash_8h.html#a0c6811f660b93857aafdbfdf80d9696b">lh_entry_free_fn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#a30ea5903f4f8126abd6aa489ffe14737">free_fn</a></td></tr>
+<tr class="memitem:a30ea5903f4f8126abd6aa489ffe14737"><td class="memItemLeft" align="right" valign="top"><a class="el" href="linkhash_8h.html#a481b0bb1ab1d6a83713d9c27aa9f07d2">lh_entry_free_fn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#a30ea5903f4f8126abd6aa489ffe14737">free_fn</a></td></tr>
 <tr class="separator:a30ea5903f4f8126abd6aa489ffe14737"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a1488d1a4a320b1a9bb2f441859544be1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="linkhash_8h.html#a1780449146b716ad5e6ed0a0207d0417">lh_hash_fn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#a1488d1a4a320b1a9bb2f441859544be1">hash_fn</a></td></tr>
+<tr class="memitem:a1488d1a4a320b1a9bb2f441859544be1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="linkhash_8h.html#a91d16eb45069d235a198d2184a77d0ae">lh_hash_fn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#a1488d1a4a320b1a9bb2f441859544be1">hash_fn</a></td></tr>
 <tr class="separator:a1488d1a4a320b1a9bb2f441859544be1"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aa646c287a6a46e09da6c7457c981a359"><td class="memItemLeft" align="right" valign="top"><a class="el" href="linkhash_8h.html#abcbf0e4849fb0c6279827ac3b66d15c3">lh_equal_fn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#aa646c287a6a46e09da6c7457c981a359">equal_fn</a></td></tr>
+<tr class="memitem:aa646c287a6a46e09da6c7457c981a359"><td class="memItemLeft" align="right" valign="top"><a class="el" href="linkhash_8h.html#af74a0690267598a0ed6f0a9b66674573">lh_equal_fn</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#aa646c287a6a46e09da6c7457c981a359">equal_fn</a></td></tr>
 <tr class="separator:aa646c287a6a46e09da6c7457c981a359"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>The hash table structure. </p>
 </div><h2 class="groupheader">Field Documentation</h2>
-<a class="anchor" id="a9458e41d842ce40cd37dc13458ced133"></a>
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">int lh_table::collisions</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Number of collisions. </p>
+<a id="aa172ed8fe205367b54e0e2cdf9ea8c6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa172ed8fe205367b54e0e2cdf9ea8c6c">&#9670;&nbsp;</a></span>count</h2>
 
-</div>
-</div>
-<a class="anchor" id="aa172ed8fe205367b54e0e2cdf9ea8c6c"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -110,122 +82,67 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a8348bdd7e61c8d72b402f6a152013fbf"></a>
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">int lh_table::deletes</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Number of deletes. </p>
+<a id="aa646c287a6a46e09da6c7457c981a359"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa646c287a6a46e09da6c7457c981a359">&#9670;&nbsp;</a></span>equal_fn</h2>
 
-</div>
-</div>
-<a class="anchor" id="aa646c287a6a46e09da6c7457c981a359"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname"><a class="el" href="linkhash_8h.html#abcbf0e4849fb0c6279827ac3b66d15c3">lh_equal_fn</a>* lh_table::equal_fn</td>
+          <td class="memname"><a class="el" href="linkhash_8h.html#af74a0690267598a0ed6f0a9b66674573">lh_equal_fn</a>* lh_table::equal_fn</td>
         </tr>
       </table>
 </div><div class="memdoc">
 
 </div>
 </div>
-<a class="anchor" id="a30ea5903f4f8126abd6aa489ffe14737"></a>
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="linkhash_8h.html#a0c6811f660b93857aafdbfdf80d9696b">lh_entry_free_fn</a>* lh_table::free_fn</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>A pointer onto the function responsible for freeing an entry. </p>
+<a id="a30ea5903f4f8126abd6aa489ffe14737"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a30ea5903f4f8126abd6aa489ffe14737">&#9670;&nbsp;</a></span>free_fn</h2>
 
-</div>
-</div>
-<a class="anchor" id="a1488d1a4a320b1a9bb2f441859544be1"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname"><a class="el" href="linkhash_8h.html#a1780449146b716ad5e6ed0a0207d0417">lh_hash_fn</a>* lh_table::hash_fn</td>
+          <td class="memname"><a class="el" href="linkhash_8h.html#a481b0bb1ab1d6a83713d9c27aa9f07d2">lh_entry_free_fn</a>* lh_table::free_fn</td>
         </tr>
       </table>
 </div><div class="memdoc">
+<p>A pointer onto the function responsible for freeing an entry. </p>
 
 </div>
 </div>
-<a class="anchor" id="aa7d986a3b12a9fa47e349713794c30fb"></a>
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">struct <a class="el" href="structlh__entry.html">lh_entry</a>* lh_table::head</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>The first entry. </p>
+<a id="a1488d1a4a320b1a9bb2f441859544be1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1488d1a4a320b1a9bb2f441859544be1">&#9670;&nbsp;</a></span>hash_fn</h2>
 
-</div>
-</div>
-<a class="anchor" id="afd64becd0d2cfbc91a4c9c9a117498b9"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int lh_table::inserts</td>
+          <td class="memname"><a class="el" href="linkhash_8h.html#a91d16eb45069d235a198d2184a77d0ae">lh_hash_fn</a>* lh_table::hash_fn</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Number of inserts. </p>
 
 </div>
 </div>
-<a class="anchor" id="afd0385c645413d26e682f725a6f52164"></a>
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">int lh_table::lookups</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Number of lookups. </p>
+<a id="aa7d986a3b12a9fa47e349713794c30fb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa7d986a3b12a9fa47e349713794c30fb">&#9670;&nbsp;</a></span>head</h2>
 
-</div>
-</div>
-<a class="anchor" id="aebf4001cde3746ec8025c1d87d4e6279"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">const char* lh_table::name</td>
+          <td class="memname">struct <a class="el" href="structlh__entry.html">lh_entry</a>* lh_table::head</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Name of the hash table. </p>
+<p>The first entry. </p>
 
 </div>
 </div>
-<a class="anchor" id="ab4cde49bd9ce7a07daaf99af34ddb67e"></a>
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">int lh_table::resizes</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Number of resizes. </p>
+<a id="ae251575ec2935bcb0e0589ca8e243839"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae251575ec2935bcb0e0589ca8e243839">&#9670;&nbsp;</a></span>size</h2>
 
-</div>
-</div>
-<a class="anchor" id="ae251575ec2935bcb0e0589ca8e243839"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -238,7 +155,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a4fd9c5aba38791b26ab0ec614a5caf8f"></a>
+<a id="a4fd9c5aba38791b26ab0ec614a5caf8f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4fd9c5aba38791b26ab0ec614a5caf8f">&#9670;&nbsp;</a></span>table</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -250,7 +169,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a479895e45db2bdf9bf5d173fa4b7e277"></a>
+<a id="a479895e45db2bdf9bf5d173fa4b7e277"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a479895e45db2bdf9bf5d173fa4b7e277">&#9670;&nbsp;</a></span>tail</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -269,9 +190,9 @@ Data Fields</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 11:08:38 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 0d39780..bb5a1c6 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: printbuf Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
@@ -60,7 +55,9 @@ Data Fields</h2></td></tr>
 <tr class="separator:a12ce6440eaa06a55b96ebdc5a9778dd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <h2 class="groupheader">Field Documentation</h2>
-<a class="anchor" id="aba980ad7406329e32f557dfa0eb7b1b2"></a>
+<a id="aba980ad7406329e32f557dfa0eb7b1b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aba980ad7406329e32f557dfa0eb7b1b2">&#9670;&nbsp;</a></span>bpos</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -72,7 +69,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a5d7cf8ac260f1f7c50fecaf9bd7bc651"></a>
+<a id="a5d7cf8ac260f1f7c50fecaf9bd7bc651"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5d7cf8ac260f1f7c50fecaf9bd7bc651">&#9670;&nbsp;</a></span>buf</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -84,7 +83,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a12ce6440eaa06a55b96ebdc5a9778dd5"></a>
+<a id="a12ce6440eaa06a55b96ebdc5a9778dd5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a12ce6440eaa06a55b96ebdc5a9778dd5">&#9670;&nbsp;</a></span>size</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -102,9 +103,9 @@ Data Fields</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 13:14:30 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
index 9cf578f..a28614b 100644 (file)
@@ -1,60 +1 @@
-.tabs, .tabs2, .tabs3 {
-    background-image: url('tab_b.png');
-    width: 100%;
-    z-index: 101;
-    font-size: 13px;
-    font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
-}
-
-.tabs2 {
-    font-size: 10px;
-}
-.tabs3 {
-    font-size: 9px;
-}
-
-.tablist {
-    margin: 0;
-    padding: 0;
-    display: table;
-}
-
-.tablist li {
-    float: left;
-    display: table-cell;
-    background-image: url('tab_b.png');
-    line-height: 36px;
-    list-style: none;
-}
-
-.tablist a {
-    display: block;
-    padding: 0 20px;
-    font-weight: bold;
-    background-image:url('tab_s.png');
-    background-repeat:no-repeat;
-    background-position:right;
-    color: #283A5D;
-    text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
-    text-decoration: none;
-    outline: none;
-}
-
-.tabs3 .tablist a {
-    padding: 0 10px;
-}
-
-.tablist a:hover {
-    background-image: url('tab_h.png');
-    background-repeat:repeat-x;
-    color: #fff;
-    text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
-    text-decoration: none;
-}
-
-.tablist li.current a {
-    background-image: url('tab_a.png');
-    background-repeat:repeat-x;
-    color: #fff;
-    text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
-}
+.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#doc-content{overflow:auto;display:block;padding:0;margin:0;-webkit-overflow-scrolling:touch}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}}
\ No newline at end of file
index 9812b89..02cef20 100644 (file)
@@ -3,7 +3,8 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.9.1"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>json-c: json_object::data Union Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
@@ -16,9 +17,9 @@
 <table cellspacing="0" cellpadding="0">
  <tbody>
  <tr style="height: 56px;">
-  <td style="padding-left: 0.5em;">
+  <td id="projectalign" style="padding-left: 0.5em;">
    <div id="projectname">json-c
-   &#160;<span id="projectnumber">0.12.1</span>
+   &#160;<span id="projectnumber">0.13</span>
    </div>
   </td>
  </tr>
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.9.1 -->
-  <div id="navrow1" class="tabs">
-    <ul class="tablist">
-      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
-      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
-      <li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="files.html"><span>Files</span></a></li>
-    </ul>
-  </div>
-  <div id="navrow2" class="tabs2">
-    <ul class="tablist">
-      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
-      <li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
-    </ul>
-  </div>
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
 <div id="nav-path" class="navpath">
   <ul>
 <li class="navelem"><a class="el" href="structjson__object.html">json_object</a></li><li class="navelem"><a class="el" href="unionjson__object_1_1data.html">data</a></li>  </ul>
@@ -67,15 +62,22 @@ Data Fields</h2></td></tr>
 <tr class="memitem:a4ad6bf2fd6d8718f55850509edfe2e45"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structarray__list.html">array_list</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionjson__object_1_1data.html#a4ad6bf2fd6d8718f55850509edfe2e45">c_array</a></td></tr>
 <tr class="separator:a4ad6bf2fd6d8718f55850509edfe2e45"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:af9cd2e329ad7ab0a86b1b622290a663a"><td class="memItemLeft" >struct {</td></tr>
-<tr class="memitem:a5094b14d7ae35023791c9bc000d1dceb"><td class="memItemLeft" >&#160;&#160;&#160;char *&#160;&#160;&#160;<a class="el" href="unionjson__object_1_1data.html#a18a82441c3972195a3bf698bb286634b">str</a></td></tr>
-<tr class="separator:a5094b14d7ae35023791c9bc000d1dceb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20198ef37cc78a5d345d77a872c2bff5"><td class="memItemLeft" >&#160;&#160;&#160;union {</td></tr>
+<tr class="memitem:a87fe6ecb0f5f70902b68c67ca656906e"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;char *&#160;&#160;&#160;<a class="el" href="unionjson__object_1_1data.html#ad3f2798f4679c5a3cc7f67a42365b71f">ptr</a></td></tr>
+<tr class="separator:a87fe6ecb0f5f70902b68c67ca656906e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a60313c060834ec5e66a2e50c59e3d953"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;char&#160;&#160;&#160;<a class="el" href="unionjson__object_1_1data.html#aaa742eb1b88b4b25ec4c27431d1576d7">data</a> [<a class="el" href="json__object__private_8h.html#a227adaf0073e17006f614190d414fa1a">LEN_DIRECT_STRING_DATA</a>]</td></tr>
+<tr class="separator:a60313c060834ec5e66a2e50c59e3d953"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20198ef37cc78a5d345d77a872c2bff5"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="unionjson__object_1_1data.html#a51a177df2ef6d27590696975a4f4a7ee">str</a></td></tr>
+<tr class="separator:a20198ef37cc78a5d345d77a872c2bff5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a814b57740e61d15648c111078c47f39b"><td class="memItemLeft" >&#160;&#160;&#160;int&#160;&#160;&#160;<a class="el" href="unionjson__object_1_1data.html#ac2386853b8a4e7d0b28a27ed599ccef7">len</a></td></tr>
 <tr class="separator:a814b57740e61d15648c111078c47f39b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:af9cd2e329ad7ab0a86b1b622290a663a"><td class="memItemLeft" valign="top">}&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionjson__object_1_1data.html#af9cd2e329ad7ab0a86b1b622290a663a">c_string</a></td></tr>
 <tr class="separator:af9cd2e329ad7ab0a86b1b622290a663a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <h2 class="groupheader">Field Documentation</h2>
-<a class="anchor" id="a4ad6bf2fd6d8718f55850509edfe2e45"></a>
+<a id="a4ad6bf2fd6d8718f55850509edfe2e45"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4ad6bf2fd6d8718f55850509edfe2e45">&#9670;&nbsp;</a></span>c_array</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -87,7 +89,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a98a3964e5fb0b3a0e9d8786b8facde5c"></a>
+<a id="a98a3964e5fb0b3a0e9d8786b8facde5c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a98a3964e5fb0b3a0e9d8786b8facde5c">&#9670;&nbsp;</a></span>c_boolean</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -99,7 +103,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a9cc4abdb21302913701ac0c8dc75e55a"></a>
+<a id="a9cc4abdb21302913701ac0c8dc75e55a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9cc4abdb21302913701ac0c8dc75e55a">&#9670;&nbsp;</a></span>c_double</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -111,7 +117,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a7733181cdb631570913e3a2abfd6937c"></a>
+<a id="a7733181cdb631570913e3a2abfd6937c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7733181cdb631570913e3a2abfd6937c">&#9670;&nbsp;</a></span>c_int64</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -123,7 +131,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a68089c942f154d4df590d8ecb476a69b"></a>
+<a id="a68089c942f154d4df590d8ecb476a69b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a68089c942f154d4df590d8ecb476a69b">&#9670;&nbsp;</a></span>c_object</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -135,7 +145,9 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="af9cd2e329ad7ab0a86b1b622290a663a"></a>
+<a id="af9cd2e329ad7ab0a86b1b622290a663a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af9cd2e329ad7ab0a86b1b622290a663a">&#9670;&nbsp;</a></span>c_string</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -147,7 +159,23 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ac2386853b8a4e7d0b28a27ed599ccef7"></a>
+<a id="aaa742eb1b88b4b25ec4c27431d1576d7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaa742eb1b88b4b25ec4c27431d1576d7">&#9670;&nbsp;</a></span>data</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char <a class="el" href="unionjson__object_1_1data.html">json_object::data::data</a>[<a class="el" href="json__object__private_8h.html#a227adaf0073e17006f614190d414fa1a">LEN_DIRECT_STRING_DATA</a>]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac2386853b8a4e7d0b28a27ed599ccef7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac2386853b8a4e7d0b28a27ed599ccef7">&#9670;&nbsp;</a></span>len</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -159,12 +187,28 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a18a82441c3972195a3bf698bb286634b"></a>
+<a id="ad3f2798f4679c5a3cc7f67a42365b71f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad3f2798f4679c5a3cc7f67a42365b71f">&#9670;&nbsp;</a></span>ptr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* json_object::data::ptr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a51a177df2ef6d27590696975a4f4a7ee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a51a177df2ef6d27590696975a4f4a7ee">&#9670;&nbsp;</a></span>str</h2>
+
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">char* json_object::data::str</td>
+          <td class="memname">union { ... }   json_object::data::str</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -177,9 +221,9 @@ Data Fields</h2></td></tr>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 7 2016 20:53:10 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.9.1
+</a> 1.8.13
 </small></address>
 </body>
 </html>
diff --git a/doc/html/vasprintf__compat_8h.html b/doc/html/vasprintf__compat_8h.html
new file mode 100644 (file)
index 0000000..82e8637
--- /dev/null
@@ -0,0 +1,58 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>json-c: vasprintf_compat.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">json-c
+   &#160;<span id="projectnumber">0.13</span>
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">vasprintf_compat.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Do not use, json-c internal, may be changed or removed at any time.  
+<a href="#details">More...</a></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Do not use, json-c internal, may be changed or removed at any time. </p>
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 7 2017 18:06:04 for json-c by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
index b12c0f7..756420d 100755 (executable)
 #!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2011-11-20.07; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
 #
-# $NetBSD: install-sh.in,v 1.6 2012/01/11 13:07:31 hans Exp $
-# This script now also installs multiple files, but might choke on installing
-# multiple files with spaces in the file names.
+# Copyright (C) 1994 X Consortium
 #
-# install - install a program, script, or datafile
-# This comes from X11R5 (mit/util/scripts/install.sh).
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
 #
-# Copyright 1991 by the Massachusetts Institute of Technology
 #
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of M.I.T. not be used in advertising or
-# publicity pertaining to distribution of the software without specific,
-# written prior permission.  M.I.T. makes no representations about the
-# suitability of this software for any purpose.  It is provided "as is"
-# without express or implied warranty.
+# FSF changes to this file are in the public domain.
 #
 # Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
+# 'make' implicit rules from creating a file called install from it
 # when there is no Makefile.
 #
 # This script is compatible with the BSD install script, but was written
 # from scratch.
 
+nl='
+'
+IFS=" ""       $nl"
+
 # set DOITPROG to echo to test this script
 
 # Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-awkprog="${AWKPROG-awk}"
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-instcmd="$cpprog"
-instflags=""
-pathcompchmodcmd="$chmodprog 755"
-chmodcmd="$chmodprog 755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-stripflags=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-msrc=""
-dst=""
-dir_arg=""
-suffix=""
-suffixfmt=""
-
-while [ x"$1" != x ]; do
-    case $1 in
-       -b) suffix=".old"
-           shift
-           continue;;
-
-       -B) suffixfmt="$2"
-           shift
-           shift
-           continue;;
-
-       -c) instcmd="$cpprog"
-           shift
-           continue;;
-
-       -d) dir_arg=true
-           shift
-           continue;;
-
-       -m) chmodcmd="$chmodprog $2"
-           shift
-           shift
-           continue;;
-
-       -m*)
-           chmodcmd="$chmodprog ${1#-m}"
-           shift
-           continue;;
-
-       -o) chowncmd="$chownprog $2"
-           shift
-           shift
-           continue;;
-
-       -g) chgrpcmd="$chgrpprog $2"
-           shift
-           shift
-           continue;;
-
-       -s) stripcmd="$stripprog"
-           shift
-           continue;;
-
-       -S) stripcmd="$stripprog"
-           stripflags="-S $2 $stripflags"
-           shift
-           shift
-           continue;;
-
-       -p) instflags="-p"
-           shift
-           continue;;
-
-       *)  if [ x"$msrc" = x ]
-           then
-               msrc="$dst"
-           else
-               msrc="$msrc $dst"
-           fi
-           src="$dst"
-           dst="$1"
-           shift
-           continue;;
-    esac
-done
-
-if [ x"$dir_arg" = x ]
-then
-       dstisfile=""
-       if [ ! -d "$dst" ]
-       then
-               if [ x"$msrc" = x"$src" ]
-               then
-                       dstisfile=true
-               else
-                       echo "install: destination is not a directory"
-                       exit 1
-               fi
-       fi
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
 else
-       msrc="$msrc $dst"
+  doit_exec=$doit
 fi
 
-if [ x"$msrc" = x ]
-then
-       echo "install: no destination specified"
-       exit 1
-fi      
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
 
-for srcarg in $msrc; do
+posix_mkdir=
 
-if [ x"$dir_arg" != x ]; then
+# Desired mode of installed file.
+mode=0755
 
-       dstarg="$srcarg"
-else
-       dstarg="$dst"
-
-# Waiting for this to be detected by the "$instcmd $srcarg $dsttmp" command
-# might cause directories to be created, which would be especially bad 
-# if $src (and thus $dsttmp) contains '*'.
-
-       if [ -f "$srcarg" ]
-       then
-               doinst="$instcmd $instflags"
-       elif [ -d "$srcarg" ]
-       then
-               echo "install: $srcarg: not a regular file"
-               exit 1
-       elif [ "$srcarg" = "/dev/null" ]
-       then
-               doinst="$cpprog"
-       else
-               echo "install:  $srcarg does not exist"
-               exit 1
-       fi
-       
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
 
-       if [ -d "$dstarg" ]
-       then
-               dstarg="$dstarg"/`basename "$srcarg"`
-       fi
-fi
+src=
+dst=
+dir_arg=
+dst_arg=
 
-## this sed command emulates the dirname command
-dstdir=`echo "$dstarg" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+copy_on_change=false
+no_target_directory=
 
-# Make sure that the destination directory exists.
-#  this part is taken from Noah Friedman's mkinstalldirs script
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
 
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='   
-'
-IFS="${IFS-${defaultIFS}}"
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
 
-oIFS="${IFS}"
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS="${oIFS}"
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
 
-pathcomp=''
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
 
-while [ $# -ne 0 ] ; do
-       pathcomp="${pathcomp}${1}"
-       shift
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
 
-       if [ ! -d "${pathcomp}" ] ;
-        then
-               $doit $mkdirprog "${pathcomp}"
-               if [ x"$chowncmd" != x ]; then $doit $chowncmd "${pathcomp}"; else true ; fi &&
-               if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "${pathcomp}"; else true ; fi &&
-               if [ x"$pathcompchmodcmd" != x ]; then $doit $pathcompchmodcmd "${pathcomp}"; else true ; fi
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
 
-       else
-               true
-       fi
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+       shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+       case $mode in
+         *' '* | *'    '* | *'
+'*       | *'*'* | *'?'* | *'['*)
+           echo "$0: invalid mode: $mode" >&2
+           exit 1;;
+       esac
+       shift;;
+
+    -o) chowncmd="$chownprog $2"
+       shift;;
+
+    -s) stripcmd=$stripprog;;
 
-       pathcomp="${pathcomp}/"
+    -t) dst_arg=$2
+       # Protect names problematic for 'test' and other utilities.
+       case $dst_arg in
+         -* | [=\(\)!]) dst_arg=./$dst_arg;;
+       esac
+       shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)        shift
+       break;;
+
+    -*)        echo "$0: invalid option: $1" >&2
+       exit 1;;
+
+    *)  break;;
+  esac
+  shift
 done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for 'test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
 fi
 
-       if [ x"$dir_arg" != x ]
-       then
-               if [ -d "$dstarg" ]; then
-                       true
-               else
-                       $doit $mkdirprog "$dstarg" &&
-
-                       if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dstarg"; else true ; fi &&
-                       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dstarg"; else true ; fi &&
-                       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dstarg"; else true ; fi
-               fi
-       else
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call 'install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+       u_plus_rw=
+      else
+       u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+       u_plus_rw=
+      else
+       u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
 
-               if [ x"$dstisfile" = x ]
-               then
-                       file=$srcarg
-               else
-                       file=$dst
-               fi
-
-               dstfile=`basename "$file"`
-               dstfinal="$dstdir/$dstfile"
-
-# Make a temp file name in the proper directory.
-
-               dsttmp=$dstdir/#inst.$$#
-
-# Make a backup file name in the proper directory.
-               case x$suffixfmt in
-               *%*)    suffix=`echo x |
-                       $awkprog -v bname="$dstfinal" -v fmt="$suffixfmt" '
-                       { cnt = 0;
-                         do {
-                               sfx = sprintf(fmt, cnt++);
-                               name = bname sfx;
-                         } while (system("test -f " name) == 0);
-                         print sfx; }' -`;;
-               x)      ;;
-               *)      suffix="$suffixfmt";;
-               esac
-               dstbackup="$dstfinal$suffix"
-
-# Move or copy the file name to the temp name
-
-               $doit $doinst $srcarg "$dsttmp" &&
-
-               trap "rm -f ${dsttmp}" 0 &&
-
-# and set any options; do chmod last to preserve setuid bits
-
-# If any of these fail, we abort the whole thing.  If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
-
-               if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else true;fi &&
-               if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else true;fi &&
-               if [ x"$stripcmd" != x ]; then $doit $stripcmd $stripflags "$dsttmp"; else true;fi &&
-               if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else true;fi &&
-
-# Now rename the file to the real destination.
-
-               if [ x"$suffix" != x ] && [ -f "$dstfinal" ]
-               then
-                       $doit $mvcmd "$dstfinal" "$dstbackup"
-               else
-                       $doit $rmcmd -f "$dstfinal"
-               fi &&
-               $doit $mvcmd "$dsttmp" "$dstfinal"
+for src
+do
+  # Protect names problematic for 'test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+       echo "$0: $dst_arg: Is a directory" >&2
+       exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+       (dirname "$dst") 2>/dev/null ||
+       expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+            X"$dst" : 'X\(//\)[^/]' \| \
+            X"$dst" : 'X\(//\)$' \| \
+            X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+       echo X"$dst" |
+           sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)[^/].*/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\).*/{
+                  s//\1/
+                  q
+                }
+                s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+       # Create intermediate dirs using mode 755 as modified by the umask.
+       # This is like FreeBSD 'install' as of 1997-10-28.
+       umask=`umask`
+       case $stripcmd.$umask in
+         # Optimize common cases.
+         *[2367][2367]) mkdir_umask=$umask;;
+         .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+         *[0-7])
+           mkdir_umask=`expr $umask + 22 \
+             - $umask % 100 % 40 + $umask % 20 \
+             - $umask % 10 % 4 + $umask % 2
+           `;;
+         *) mkdir_umask=$umask,go-w;;
+       esac
+
+       # With -d, create the new directory with the user-specified mode.
+       # Otherwise, rely on $mkdir_umask.
+       if test -n "$dir_arg"; then
+         mkdir_mode=-m$mode
+       else
+         mkdir_mode=
        fi
 
-done &&
+       posix_mkdir=false
+       case $umask in
+         *[123567][0-7][0-7])
+           # POSIX mkdir -p sets u+wx bits regardless of umask, which
+           # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+           ;;
+         *)
+            # $RANDOM is not portable (e.g. dash);  use it when possible to
+            # lower collision chance
+           tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+           trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            # As "mkdir -p" follows symlinks and we work in /tmp possibly;  so
+            # create the $tmpdir first (and fail if unsuccessful) to make sure
+            # that nobody tries to guess the $tmpdir name.
+           if (umask $mkdir_umask &&
+               $mkdirprog $mkdir_mode "$tmpdir" &&
+               exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+           then
+             if test -z "$dir_arg" || {
+                  # Check for POSIX incompatibilities with -m.
+                  # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                  # other-writable bit of parent directory when it shouldn't.
+                  # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                  test_tmpdir="$tmpdir/a"
+                  ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+                  case $ls_ld_tmpdir in
+                    d????-?r-*) different_mode=700;;
+                    d????-?--*) different_mode=755;;
+                    *) false;;
+                  esac &&
+                  $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+                    ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+                    test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                  }
+                }
+             then posix_mkdir=:
+             fi
+             rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+           else
+             # Remove any dirs left behind by ancient mkdir implementations.
+             rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+           fi
+           trap '' 0;;
+       esac;;
+    esac
 
+    if
+      $posix_mkdir && (
+       umask $mkdir_umask &&
+       $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+       /*) prefix='/';;
+       [-=\(\)!]*) prefix='./';;
+       *)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+       test X"$d" = X && continue
+
+       prefix=$prefix$d
+       if test -d "$prefix"; then
+         prefixes=
+       else
+         if $posix_mkdir; then
+           (umask=$mkdir_umask &&
+            $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+           # Don't fail if two instances are running concurrently.
+           test -d "$prefix" || exit 1
+         else
+           case $prefix in
+             *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+             *) qprefix=$prefix;;
+           esac
+           prefixes="$prefixes '$qprefix'"
+         fi
+       fi
+       prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+       # Don't fail if two instances are running concurrently.
+       (umask $mkdir_umask &&
+        eval "\$doit_exec \$mkdirprog $prefixes") ||
+         test -d "$dstdir" || exit 1
+       obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"    2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+       # Now remove or move aside any old file at destination location.
+       # We try this two ways since rm can't unlink itself on some
+       # systems and the destination file might be busy for other
+       # reasons.  In this case, the final cleanup might fail but the new
+       # file should still install successfully.
+       {
+         test ! -f "$dst" ||
+         $doit $rmcmd -f "$dst" 2>/dev/null ||
+         { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+           { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+         } ||
+         { echo "$0: cannot unlink or rename $dst" >&2
+           (exit 1); exit 1
+         }
+       } &&
+
+       # Now rename the file to the real destination.
+       $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
 
-exit 0
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/issues_closed_for_0.13.md b/issues_closed_for_0.13.md
new file mode 100644 (file)
index 0000000..a29e437
--- /dev/null
@@ -0,0 +1,267 @@
+
+This list was created with:
+
+curl https://api.github.com/search/issues?q="repo%3Ajson-c%2Fjson-c+closed%3A>2014-04-10+created%3A<2017-12-01&sort=created&order=asc&per_page=400&page=1" > issues1.out
+curl https://api.github.com/search/issues?q="repo%3Ajson-c%2Fjson-c+closed%3A>2014-04-10+created%3A<2017-12-01&sort=created&order=asc&per_page=400&page=2" > issues2.out
+curl https://api.github.com/search/issues?q="repo%3Ajson-c%2Fjson-c+closed%3A>2014-04-10+created%3A<2017-12-01&sort=created&order=asc&per_page=400&page=3" > issues3.out
+jq -r '.items[] | "[" + .title + "](" + .url + ")" | tostring' issues?.out  > issues.md
+#... manual editing ...
+
+----
+
+Issues and Pull Requests closed for the 0.13 release
+(since commit f84d9c, the 0.12 branch point, 2014-04-10)
+
+[Make json_object_object_add() indicate success or failure, test fix](https://api.github.com/repos/json-c/json-c/issues/61)
+[Build fixes (make dist and make distcheck)](https://api.github.com/repos/json-c/json-c/issues/113)
+[Fixing build](https://api.github.com/repos/json-c/json-c/issues/124)
+[Fix compile error(variable size set but not used) on g++4.6](https://api.github.com/repos/json-c/json-c/issues/125)
+[Removed unused size variable.](https://api.github.com/repos/json-c/json-c/issues/126)
+[remove unused `size` variable](https://api.github.com/repos/json-c/json-c/issues/127)
+[Remove unused variable from json_tokenizer.c](https://api.github.com/repos/json-c/json-c/issues/128)
+[Failed to compile under Ubuntu 13.10 32bit](https://api.github.com/repos/json-c/json-c/issues/130)
+[undefined symbol: __sync_val_compare_and_swap_4 ](https://api.github.com/repos/json-c/json-c/issues/131)
+[Remove unused variable 'size'](https://api.github.com/repos/json-c/json-c/issues/132)
+[Update and rename README to README.md](https://api.github.com/repos/json-c/json-c/issues/133)
+[Must remove variable size...](https://api.github.com/repos/json-c/json-c/issues/134)
+[bits.h uses removed json_tokener_errors\[error\]](https://api.github.com/repos/json-c/json-c/issues/135)
+[Error when running make check](https://api.github.com/repos/json-c/json-c/issues/136)
+[config.h.in should not be in git](https://api.github.com/repos/json-c/json-c/issues/137)
+[Can't build on RHEL 6.5 due to dependency on automake-1.14](https://api.github.com/repos/json-c/json-c/issues/138)
+[Code bug in random_test.c evaluating same expression twice ](https://api.github.com/repos/json-c/json-c/issues/140)
+[Removed duplicate check in random_seed test - bug #140](https://api.github.com/repos/json-c/json-c/issues/141)
+[Please undeprecate json_object_object_get](https://api.github.com/repos/json-c/json-c/issues/142)
+[Introduce json_object_from_fd](https://api.github.com/repos/json-c/json-c/issues/144)
+[Handle % character properly](https://api.github.com/repos/json-c/json-c/issues/145)
+[TAGS rename](https://api.github.com/repos/json-c/json-c/issues/146)
+[Bump the soname](https://api.github.com/repos/json-c/json-c/issues/148)
+[SONAME bump](https://api.github.com/repos/json-c/json-c/issues/149)
+[Fix build using MinGW.](https://api.github.com/repos/json-c/json-c/issues/150)
+[Remove json_type enum trailing comma](https://api.github.com/repos/json-c/json-c/issues/151)
+[error while compiling json-c library version 0.11](https://api.github.com/repos/json-c/json-c/issues/152)
+[improve doc for json_object_to_json_string()](https://api.github.com/repos/json-c/json-c/issues/153)
+[double precision](https://api.github.com/repos/json-c/json-c/issues/154)
+[add bsearch for arrays](https://api.github.com/repos/json-c/json-c/issues/155)
+[Remove trailing whitespaces](https://api.github.com/repos/json-c/json-c/issues/156)
+[JSON-C shall not exit on calloc fail.](https://api.github.com/repos/json-c/json-c/issues/157)
+[while using json-c 0.11, I am facing strange crash issue in json_object_put.](https://api.github.com/repos/json-c/json-c/issues/158)
+[json_tokener.c compile error](https://api.github.com/repos/json-c/json-c/issues/159)
+[missing header file on windows??](https://api.github.com/repos/json-c/json-c/issues/160)
+[Is there a way to append to file?](https://api.github.com/repos/json-c/json-c/issues/161)
+[json_util: add directory check for POSIX distros](https://api.github.com/repos/json-c/json-c/issues/162)
+[Fix Win32 build problems](https://api.github.com/repos/json-c/json-c/issues/163)
+[made it compile and link on Widnows (as static library)](https://api.github.com/repos/json-c/json-c/issues/164)
+[json_object_to_json_string_ext length](https://api.github.com/repos/json-c/json-c/issues/165)
+[Can't build on Windows with Visual Studio 2010](https://api.github.com/repos/json-c/json-c/issues/167)
+[Tightening the number parsing algorithm](https://api.github.com/repos/json-c/json-c/issues/168)
+[Doesn't compile on ubuntu 14.04, 64bit](https://api.github.com/repos/json-c/json-c/issues/169)
+[Generated files in repository](https://api.github.com/repos/json-c/json-c/issues/170)
+[Update configuration for VS2010 and win64](https://api.github.com/repos/json-c/json-c/issues/171)
+[Adding support for parsing octal numbers](https://api.github.com/repos/json-c/json-c/issues/172)
+[json_parse_int64 doesn't work correctly at illumos](https://api.github.com/repos/json-c/json-c/issues/173)
+[Adding JSON_C_TO_STRING_PRETTY_TAB flag](https://api.github.com/repos/json-c/json-c/issues/174)
+[make check fails 4 tests with overflows when built with ASAN](https://api.github.com/repos/json-c/json-c/issues/175)
+[Possible to delete an array element at a given idx ?](https://api.github.com/repos/json-c/json-c/issues/176)
+[Fix compiler warnings](https://api.github.com/repos/json-c/json-c/issues/177)
+[Unable to compile on CentOS5](https://api.github.com/repos/json-c/json-c/issues/178)
+[Added array_list_del_idx and json_object_array_del_idx](https://api.github.com/repos/json-c/json-c/issues/179)
+[Enable silent build by default](https://api.github.com/repos/json-c/json-c/issues/180)
+[json_tokener_parse_ex accepts invalid JSON](https://api.github.com/repos/json-c/json-c/issues/181)
+[Link against libm when needed](https://api.github.com/repos/json-c/json-c/issues/182)
+[Apply compile warning fix to master branch](https://api.github.com/repos/json-c/json-c/issues/183)
+[Use only GCC-specific flags when compiling with GCC](https://api.github.com/repos/json-c/json-c/issues/184)
+[compile error](https://api.github.com/repos/json-c/json-c/issues/185)
+[Syntax error](https://api.github.com/repos/json-c/json-c/issues/186)
+[array_list_get_idx and negative indexes.](https://api.github.com/repos/json-c/json-c/issues/187)
+[json_object_object_foreach warnings](https://api.github.com/repos/json-c/json-c/issues/188)
+[noisy json_object_from_file: error opening file](https://api.github.com/repos/json-c/json-c/issues/189)
+[warning: initialization discards const qualifier from pointer target type \[enabled by default\]](https://api.github.com/repos/json-c/json-c/issues/190)
+[json_tokener_parse  accepts invalid JSON {"key": "value" ,  }](https://api.github.com/repos/json-c/json-c/issues/192)
+[Make serialization format of doubles configurable](https://api.github.com/repos/json-c/json-c/issues/193)
+[Add utility function for comparing json_objects](https://api.github.com/repos/json-c/json-c/issues/194)
+[Call uselocale instead of setlocale](https://api.github.com/repos/json-c/json-c/issues/195)
+[Performance improvements](https://api.github.com/repos/json-c/json-c/issues/196)
+[Time for a new release?](https://api.github.com/repos/json-c/json-c/issues/197)
+[Fix possible memory leak and remove superfluous NULL checks before free()](https://api.github.com/repos/json-c/json-c/issues/198)
+[Fix build in Visual Studio](https://api.github.com/repos/json-c/json-c/issues/199)
+[Add build scripts for CI platforms](https://api.github.com/repos/json-c/json-c/issues/200)
+[disable forward-slash escaping?](https://api.github.com/repos/json-c/json-c/issues/201)
+[Array with objects support](https://api.github.com/repos/json-c/json-c/issues/202)
+[Add source position/coordinates to API](https://api.github.com/repos/json-c/json-c/issues/203)
+[json-c/json.h not found ](https://api.github.com/repos/json-c/json-c/issues/204)
+[json-c Compiled with Visual Studios](https://api.github.com/repos/json-c/json-c/issues/205)
+[what do i use in place of json_object_object_get?](https://api.github.com/repos/json-c/json-c/issues/206)
+[Add support for property pairs directly added to arrays](https://api.github.com/repos/json-c/json-c/issues/207)
+[Performance enhancements (mainly) to json_object_to_json_string()](https://api.github.com/repos/json-c/json-c/issues/208)
+[fix regression from 2d549662be832da838aa063da2efa78ee3b99668](https://api.github.com/repos/json-c/json-c/issues/209)
+[Use size_t for arrays](https://api.github.com/repos/json-c/json-c/issues/210)
+[Atomic updates for the refcount](https://api.github.com/repos/json-c/json-c/issues/211)
+[Refcount doesn't work between threads](https://api.github.com/repos/json-c/json-c/issues/212)
+[fix to compile with microsoft visual c++ 2010](https://api.github.com/repos/json-c/json-c/issues/213)
+[Some non-GNU systems support __sync_val_compare_and_swap](https://api.github.com/repos/json-c/json-c/issues/214)
+[Build json-c for window 64 bit.](https://api.github.com/repos/json-c/json-c/issues/215)
+[configure: check realloc with AC_CHECK_FUNCS() to fix cross-compilation.](https://api.github.com/repos/json-c/json-c/issues/216)
+[Checking for functions in float.h](https://api.github.com/repos/json-c/json-c/issues/217)
+[Use a macro to indicate C99 to the compiler](https://api.github.com/repos/json-c/json-c/issues/218)
+[Fix various potential null ptr deref and int32 overflows](https://api.github.com/repos/json-c/json-c/issues/219)
+[Add utility function for comparing json_objects](https://api.github.com/repos/json-c/json-c/issues/220)
+[JSON_C_TO_STRING_NOSLASHESCAPE works incorrectly](https://api.github.com/repos/json-c/json-c/issues/221)
+[Fix issue #221: JSON_C_TO_STRING_NOSLASHESCAPE works incorrectly](https://api.github.com/repos/json-c/json-c/issues/222)
+[Clarify json_object_get_string documentation of NULL handling & return](https://api.github.com/repos/json-c/json-c/issues/223)
+[json_tokener.c - all warnings being treated as errors](https://api.github.com/repos/json-c/json-c/issues/224)
+[Hi, will you support clib as a "registry"?](https://api.github.com/repos/json-c/json-c/issues/225)
+[Bump SOVERSION to 3](https://api.github.com/repos/json-c/json-c/issues/227)
+[avoid double slashes from json](https://api.github.com/repos/json-c/json-c/issues/228)
+[configure fails: checking size of size_t... configure: error: cannot determine a size for size_t](https://api.github.com/repos/json-c/json-c/issues/229)
+[Use stdint.h to check for size_t size](https://api.github.com/repos/json-c/json-c/issues/230)
+[Fix size_t size check for first-time builds](https://api.github.com/repos/json-c/json-c/issues/231)
+[tests/tests1: fix printf format for size_t arguments](https://api.github.com/repos/json-c/json-c/issues/232)
+[Include stddef.h in json_object.h](https://api.github.com/repos/json-c/json-c/issues/233)
+[Add public API to use userdata independently of custom serializer](https://api.github.com/repos/json-c/json-c/issues/234)
+[Undefined symbols Error for architecture x86_64 on Mac ](https://api.github.com/repos/json-c/json-c/issues/235)
+[Building a project which uses json-c with flag -Wcast-qual causes compilation errors](https://api.github.com/repos/json-c/json-c/issues/236)
+[handle escaped utf-8](https://api.github.com/repos/json-c/json-c/issues/237)
+[linkhash.c: optimised the table_free path](https://api.github.com/repos/json-c/json-c/issues/238)
+[initialize null terminator of new printbuf](https://api.github.com/repos/json-c/json-c/issues/239)
+[Compile error: Variable set but not used](https://api.github.com/repos/json-c/json-c/issues/240)
+[getting error in date string 19\/07\/2016, fixed for error 19/07/2016](https://api.github.com/repos/json-c/json-c/issues/241)
+[json_tokener_parse error](https://api.github.com/repos/json-c/json-c/issues/242)
+[Fix #165](https://api.github.com/repos/json-c/json-c/issues/243)
+[Error while compiling source from RHEL5, could you please help me to fix this ](https://api.github.com/repos/json-c/json-c/issues/244)
+[json-c compile in window xp](https://api.github.com/repos/json-c/json-c/issues/245)
+[Mac: uselocale failed to build](https://api.github.com/repos/json-c/json-c/issues/246)
+[json_object_array_del_idx function has segment fault error?](https://api.github.com/repos/json-c/json-c/issues/247)
+[Minor changes in C source code](https://api.github.com/repos/json-c/json-c/issues/248)
+[Improving README](https://api.github.com/repos/json-c/json-c/issues/249)
+[Improving .gitignore](https://api.github.com/repos/json-c/json-c/issues/250)
+[Adding a file for EditorConfig](https://api.github.com/repos/json-c/json-c/issues/251)
+[Very minor changes not related to C source code](https://api.github.com/repos/json-c/json-c/issues/252)
+[Adding a test with cppcheck for Travis CI](https://api.github.com/repos/json-c/json-c/issues/253)
+[Very minor changes to some tests](https://api.github.com/repos/json-c/json-c/issues/254)
+[Minor changes in C source code](https://api.github.com/repos/json-c/json-c/issues/255)
+[Mailing list dead?](https://api.github.com/repos/json-c/json-c/issues/256)
+[Defining a coding style](https://api.github.com/repos/json-c/json-c/issues/257)
+[Enable CI services](https://api.github.com/repos/json-c/json-c/issues/258)
+[Fails to parse valid json](https://api.github.com/repos/json-c/json-c/issues/259)
+[Adding an object to itself](https://api.github.com/repos/json-c/json-c/issues/260)
+[Lack of proper documentation](https://api.github.com/repos/json-c/json-c/issues/261)
+[Add Cmakefile and fix compiler warning.](https://api.github.com/repos/json-c/json-c/issues/262)
+[Compiler Warnings with VS2015](https://api.github.com/repos/json-c/json-c/issues/263)
+[successed in simple test   while failed in my project](https://api.github.com/repos/json-c/json-c/issues/264)
+[Conformance report for reference](https://api.github.com/repos/json-c/json-c/issues/265)
+[crash perhaps related to reference counting](https://api.github.com/repos/json-c/json-c/issues/266)
+[Removes me as Win32 maintainer, because I'm not.](https://api.github.com/repos/json-c/json-c/issues/267)
+[Documentation of json_object_to_json_string gives no information about memory management](https://api.github.com/repos/json-c/json-c/issues/268)
+[json_object_<type>_set(json_object *o,<type> value) API for value setting in json object private structure](https://api.github.com/repos/json-c/json-c/issues/269)
+[new API json_object_new_double_f(doubel d,const char * fmt);](https://api.github.com/repos/json-c/json-c/issues/270)
+[Cannot compile using CMake on macOS](https://api.github.com/repos/json-c/json-c/issues/271)
+[fixed wrong object name in json_object_all_values_equal](https://api.github.com/repos/json-c/json-c/issues/273)
+[Support for 64 bit pointers on Windows](https://api.github.com/repos/json-c/json-c/issues/274)
+[Out-of-bounds read in json_tokener_parse_ex](https://api.github.com/repos/json-c/json-c/issues/275)
+[ ./configure for centos release 6.7(final) failure](https://api.github.com/repos/json-c/json-c/issues/276)
+[Json object set xxx](https://api.github.com/repos/json-c/json-c/issues/277)
+[Serialization of double with no fractional component drops trailing zero](https://api.github.com/repos/json-c/json-c/issues/278)
+[Segmentation fault in array_list_length()](https://api.github.com/repos/json-c/json-c/issues/279)
+[Should json_object_array_get_idx  check whether input obj is array? ](https://api.github.com/repos/json-c/json-c/issues/280)
+[how to pretty print json-c? ](https://api.github.com/repos/json-c/json-c/issues/281)
+[ignore temporary files](https://api.github.com/repos/json-c/json-c/issues/282)
+[json_pointer: add first revision based on RFC 6901](https://api.github.com/repos/json-c/json-c/issues/283)
+[Resusing  json_tokener object](https://api.github.com/repos/json-c/json-c/issues/284)
+[Revert "compat/strdup.h: move common compat check for strdup() to own](https://api.github.com/repos/json-c/json-c/issues/285)
+[json_tokener_parse_ex() returns json_tokener_continue on zero-length string](https://api.github.com/repos/json-c/json-c/issues/286)
+[json_pointer: extend setter & getter with printf() style arguments](https://api.github.com/repos/json-c/json-c/issues/287)
+[Fix _GNU_SOURCE define for vasprintf](https://api.github.com/repos/json-c/json-c/issues/288)
+[bugfix: floating point representaion without fractional part ](https://api.github.com/repos/json-c/json-c/issues/289)
+[duplicate an json_object](https://api.github.com/repos/json-c/json-c/issues/290)
+[isspace assert error](https://api.github.com/repos/json-c/json-c/issues/291)
+[configure error  "./configure: line 13121: syntax error near unexpected token `-Wall'"](https://api.github.com/repos/json-c/json-c/issues/292)
+[how to make with bitcode for ios](https://api.github.com/repos/json-c/json-c/issues/293)
+[Adding UTF-8 validation.  Fixes #122](https://api.github.com/repos/json-c/json-c/issues/294)
+[cross compile w/ mingw](https://api.github.com/repos/json-c/json-c/issues/295)
+[Missing functions header in json_object.h](https://api.github.com/repos/json-c/json-c/issues/296)
+[could not parse string to Json object? Like string str=\"helloworld;E\\test\\log\\;end\"](https://api.github.com/repos/json-c/json-c/issues/297)
+[Building using CMake doesn't work](https://api.github.com/repos/json-c/json-c/issues/298)
+[Improve json_object -> string performance](https://api.github.com/repos/json-c/json-c/issues/299)
+[Running tests with MinGW build](https://api.github.com/repos/json-c/json-c/issues/300)
+[How to deep copy  json_object in C++ ?](https://api.github.com/repos/json-c/json-c/issues/301)
+[json_tokener_parse_ex doesn't parse JSON values](https://api.github.com/repos/json-c/json-c/issues/302)
+[fix doc in tokener header file](https://api.github.com/repos/json-c/json-c/issues/303)
+[(.text+0x72846): undefined reference to `is_error'](https://api.github.com/repos/json-c/json-c/issues/304)
+[Fix compilation without C-99 option](https://api.github.com/repos/json-c/json-c/issues/305)
+[./configure: line 12748 -error=deprecated-declarations](https://api.github.com/repos/json-c/json-c/issues/306)
+[Memory leak in json_tokener_parse](https://api.github.com/repos/json-c/json-c/issues/307)
+[AM_PROG_LIBTOOL not found on Linux](https://api.github.com/repos/json-c/json-c/issues/308)
+[GCC 7 reports various -Wimplicit-fallthrough= errors](https://api.github.com/repos/json-c/json-c/issues/309)
+[Add FALLTHRU comment to handle GCC7 warnings.](https://api.github.com/repos/json-c/json-c/issues/310)
+[Fix error C3688 when compiling on Visual Studio 2015](https://api.github.com/repos/json-c/json-c/issues/311)
+[Fix CMake Build process improved for MinGW and MSYS2](https://api.github.com/repos/json-c/json-c/issues/312)
+[VERBOSE=1 make check; tests/test_util_file.test.c and tests/test_util_file.expected out of sync](https://api.github.com/repos/json-c/json-c/issues/313)
+[Passing -1 to json_tokener_parse_ex is possibly unsafe](https://api.github.com/repos/json-c/json-c/issues/315)
+[Memory Returned by json_object_to_json_string not freed](https://api.github.com/repos/json-c/json-c/issues/316)
+[json_object_get_string gives segmentation error](https://api.github.com/repos/json-c/json-c/issues/317)
+[PVS-Studio static analyzer analyze results](https://api.github.com/repos/json-c/json-c/issues/318)
+[Windows: Fix dynamic library build with Visual Studio](https://api.github.com/repos/json-c/json-c/issues/319)
+[Can't compile in Mac OS X El Capitan](https://api.github.com/repos/json-c/json-c/issues/320)
+[build,cmake: fix vasprintf implicit definition and generate both static & shared libs](https://api.github.com/repos/json-c/json-c/issues/321)
+[can not link with libjson-c.a](https://api.github.com/repos/json-c/json-c/issues/322)
+[implicit fallthrough detected by gcc 7.1](https://api.github.com/repos/json-c/json-c/issues/323)
+[JsonPath like function?](https://api.github.com/repos/json-c/json-c/issues/324)
+[Fix stack buffer overflow in json_object_double_to_json_string_format()](https://api.github.com/repos/json-c/json-c/issues/325)
+[why json-c so hard to compile](https://api.github.com/repos/json-c/json-c/issues/327)
+[json_object: implement json_object_deep_copy() function](https://api.github.com/repos/json-c/json-c/issues/328)
+[build,cmake: build,cmake: rename libjson-c-static.a to libjson-c.a](https://api.github.com/repos/json-c/json-c/issues/329)
+[tests: symlink basic tests to a single file that has the common code](https://api.github.com/repos/json-c/json-c/issues/330)
+[Safe use of snprintf() / vsnprintf() for Visual studio, and thread-safety fix](https://api.github.com/repos/json-c/json-c/issues/331)
+[Valgrind: invalid read after json_object_array_del_idx.](https://api.github.com/repos/json-c/json-c/issues/332)
+[Replace obsolete AM_PROG_LIBTOOL](https://api.github.com/repos/json-c/json-c/issues/333)
+[README.md: show build status tag from travis-ci.org](https://api.github.com/repos/json-c/json-c/issues/335)
+[tests: fix tests in travis-ci.org](https://api.github.com/repos/json-c/json-c/issues/336)
+[Synchronize "potentially racy" random seed in lh_char_hash()](https://api.github.com/repos/json-c/json-c/issues/337)
+[implement json_object_int_inc(json_object *, int64_t)](https://api.github.com/repos/json-c/json-c/issues/338)
+[Json schema validation](https://api.github.com/repos/json-c/json-c/issues/339)
+[strerror_override: add extern "C" and JSON_EXPORT specifiers for Visual C++ compilers](https://api.github.com/repos/json-c/json-c/issues/340)
+[character "/" parse as "\/"](https://api.github.com/repos/json-c/json-c/issues/341)
+[ No such file or directory "/usr/include/json.h"](https://api.github.com/repos/json-c/json-c/issues/342)
+[Can't parse json](https://api.github.com/repos/json-c/json-c/issues/343)
+[Fix Mingw build](https://api.github.com/repos/json-c/json-c/issues/344)
+[Fix make dist and make distcheck](https://api.github.com/repos/json-c/json-c/issues/345)
+[Clamp double to int32 when narrowing in json_object_get_int.](https://api.github.com/repos/json-c/json-c/issues/346)
+[MSVC linker error json_c_strerror](https://api.github.com/repos/json-c/json-c/issues/347)
+[why](https://api.github.com/repos/json-c/json-c/issues/348)
+[`missing` is missing?](https://api.github.com/repos/json-c/json-c/issues/349)
+[stderror-override and disable-shared](https://api.github.com/repos/json-c/json-c/issues/350)
+[SIZE_T_MAX redefined from limits.h](https://api.github.com/repos/json-c/json-c/issues/351)
+[`INSTALL` overrides an automake script.](https://api.github.com/repos/json-c/json-c/issues/352)
+[Documentation issues](https://api.github.com/repos/json-c/json-c/issues/353)
+[Fixes #351 #352 #353 ](https://api.github.com/repos/json-c/json-c/issues/354)
+[1.make it can been compiled with Visual Studio 2010 by modify the CMakeList.txt and others](https://api.github.com/repos/json-c/json-c/issues/355)
+[VS2008 test  test_util_file.cpp err!](https://api.github.com/repos/json-c/json-c/issues/356)
+[__json_c_strerror incompatibility with link-time optimization](https://api.github.com/repos/json-c/json-c/issues/357)
+[make issue](https://api.github.com/repos/json-c/json-c/issues/358)
+[update CMakeLists.txt for compile with visual studio at least 2010](https://api.github.com/repos/json-c/json-c/issues/359)
+[Use strtoll() to parse ints](https://api.github.com/repos/json-c/json-c/issues/360)
+[Fix double to int cast overflow in json_object_get_int64.](https://api.github.com/repos/json-c/json-c/issues/361)
+[CMake Package Config](https://api.github.com/repos/json-c/json-c/issues/362)
+[Issue #338, add json_object_add_int functions](https://api.github.com/repos/json-c/json-c/issues/363)
+[Cmake is Errir](https://api.github.com/repos/json-c/json-c/issues/364)
+[added fallthrough for gcc7](https://api.github.com/repos/json-c/json-c/issues/365)
+[how to check  the json string,crash!](https://api.github.com/repos/json-c/json-c/issues/366)
+[Is json-c support "redirect" semantic?](https://api.github.com/repos/json-c/json-c/issues/367)
+[Add examples](https://api.github.com/repos/json-c/json-c/issues/368)
+[How to build json-c library for android?](https://api.github.com/repos/json-c/json-c/issues/369)
+[Compiling using clang-cl](https://api.github.com/repos/json-c/json-c/issues/370)
+[Invalid parsing for Infinity with json-c 0.12](https://api.github.com/repos/json-c/json-c/issues/371)
+[Json-c 0.12: Fixed Infinity bug](https://api.github.com/repos/json-c/json-c/issues/372)
+[build: fix build on appveyor CI](https://api.github.com/repos/json-c/json-c/issues/373)
+[Undefined symbols for architecture x86_64:](https://api.github.com/repos/json-c/json-c/issues/374)
+[what would happened when json_object_object_add add the same key](https://api.github.com/repos/json-c/json-c/issues/375)
+[Eclipse error ](https://api.github.com/repos/json-c/json-c/issues/376)
+[on gcc 7.2.0 on my linux distribution with json-c  2013-04-02 source](https://api.github.com/repos/json-c/json-c/issues/377)
+[ Eclipse: library (libjson-c) not found, but configured](https://api.github.com/repos/json-c/json-c/issues/378)
+[error: this statement may fall through \[-Werror=implicit-fallthrough=\]](https://api.github.com/repos/json-c/json-c/issues/379)
+[Build on Windows](https://api.github.com/repos/json-c/json-c/issues/380)
+[Fix makedist](https://api.github.com/repos/json-c/json-c/issues/381)
+[Memory leak for json_tokener_parse_ex for version 0.12.1](https://api.github.com/repos/json-c/json-c/issues/382)
+[Fix a compiler warning.](https://api.github.com/repos/json-c/json-c/issues/383)
+[Fix a VS 2015 compiler warnings.](https://api.github.com/repos/json-c/json-c/issues/384)
+
index 037739d..074378b 100644 (file)
@@ -4,8 +4,9 @@ libdir=@libdir@
 includedir=@includedir@
 
 Name: json-c
-Description: JSON implementation in C
+Description: JSON implementation in C
 Version: @VERSION@
-Requires: 
-Libs:  -L${libdir} -ljson-c
+Requires:
+Libs.private: @LIBS@
+Libs: -L${libdir} -ljson-c
 Cflags: -I${includedir}/json-c
diff --git a/json-c.vcproj b/json-c.vcproj
deleted file mode 100644 (file)
index 0b88754..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-       ProjectType="Visual C++"
-       Version="7.10"
-       Name="json-c"
-       ProjectGUID="{04D8CDBE-FB3E-4362-87E6-07DC3C0083B2}"
-       Keyword="Win32Proj">
-       <Platforms>
-               <Platform
-                       Name="Win32"/>
-       </Platforms>
-       <Configurations>
-               <Configuration
-                       Name="Debug|Win32"
-                       OutputDirectory="Debug"
-                       IntermediateDirectory="Debug"
-                       ConfigurationType="4"
-                       CharacterSet="2">
-                       <Tool
-                               Name="VCCLCompilerTool"
-                               Optimization="0"
-                               PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
-                               MinimalRebuild="TRUE"
-                               BasicRuntimeChecks="3"
-                               RuntimeLibrary="5"
-                               UsePrecompiledHeader="0"
-                               WarningLevel="3"
-                               Detect64BitPortabilityProblems="TRUE"
-                               DebugInformationFormat="4"/>
-                       <Tool
-                               Name="VCCustomBuildTool"/>
-                       <Tool
-                               Name="VCLibrarianTool"
-                               OutputFile="$(OutDir)/jsonD.lib"/>
-                       <Tool
-                               Name="VCMIDLTool"/>
-                       <Tool
-                               Name="VCPostBuildEventTool"/>
-                       <Tool
-                               Name="VCPreBuildEventTool"
-                               CommandLine="copy config.h.win32 config.h"/>
-                       <Tool
-                               Name="VCPreLinkEventTool"/>
-                       <Tool
-                               Name="VCResourceCompilerTool"/>
-                       <Tool
-                               Name="VCWebServiceProxyGeneratorTool"/>
-                       <Tool
-                               Name="VCXMLDataGeneratorTool"/>
-                       <Tool
-                               Name="VCManagedWrapperGeneratorTool"/>
-                       <Tool
-                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
-               </Configuration>
-               <Configuration
-                       Name="Release|Win32"
-                       OutputDirectory="Release"
-                       IntermediateDirectory="Release"
-                       ConfigurationType="4"
-                       CharacterSet="2">
-                       <Tool
-                               Name="VCCLCompilerTool"
-                               PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
-                               RuntimeLibrary="4"
-                               UsePrecompiledHeader="0"
-                               WarningLevel="3"
-                               Detect64BitPortabilityProblems="TRUE"
-                               DebugInformationFormat="3"/>
-                       <Tool
-                               Name="VCCustomBuildTool"/>
-                       <Tool
-                               Name="VCLibrarianTool"
-                               OutputFile="$(OutDir)/json.lib"/>
-                       <Tool
-                               Name="VCMIDLTool"/>
-                       <Tool
-                               Name="VCPostBuildEventTool"/>
-                       <Tool
-                               Name="VCPreBuildEventTool"/>
-                       <Tool
-                               Name="VCPreLinkEventTool"/>
-                       <Tool
-                               Name="VCResourceCompilerTool"/>
-                       <Tool
-                               Name="VCWebServiceProxyGeneratorTool"/>
-                       <Tool
-                               Name="VCXMLDataGeneratorTool"/>
-                       <Tool
-                               Name="VCManagedWrapperGeneratorTool"/>
-                       <Tool
-                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
-               </Configuration>
-       </Configurations>
-       <References>
-       </References>
-       <Files>
-               <Filter
-                       Name="Source Files"
-                       Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
-                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
-                       <File
-                               RelativePath=".\arraylist.c">
-                       </File>
-                       <File
-                               RelativePath=".\debug.c">
-                       </File>
-                       <File
-                               RelativePath=".\json_object.c">
-                       </File>
-                       <File
-                               RelativePath=".\json_tokener.c">
-                       </File>
-                       <File
-                               RelativePath=".\json_util.c">
-                       </File>
-                       <File
-                               RelativePath=".\linkhash.c">
-                       </File>
-                       <File
-                               RelativePath=".\printbuf.c">
-                       </File>
-               </Filter>
-               <Filter
-                       Name="Header Files"
-                       Filter="h;hpp;hxx;hm;inl;inc;xsd"
-                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
-                       <File
-                               RelativePath=".\arraylist.h">
-                       </File>
-                       <File
-                               RelativePath=".\bits.h">
-                       </File>
-                       <File
-                               RelativePath=".\debug.h">
-                       </File>
-                       <File
-                               RelativePath=".\json_object.h">
-                       </File>
-                       <File
-                               RelativePath=".\json_object_private.h">
-                       </File>
-                       <File
-                               RelativePath=".\json_tokener.h">
-                       </File>
-                       <File
-                               RelativePath=".\json_util.h">
-                       </File>
-                       <File
-                               RelativePath=".\linkhash.h">
-                       </File>
-                       <File
-                               RelativePath=".\printbuf.h">
-                       </File>
-               </Filter>
-               <Filter
-                       Name="Resource Files"
-                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
-               </Filter>
-               <Filter
-                       Name="Documentation"
-                       Filter="">
-                       <File
-                               RelativePath=".\Doxyfile">
-                       </File>
-               </Filter>
-               <File
-                       RelativePath=".\config.h.win32">
-               </File>
-               <File
-                       RelativePath=".\README-WIN32.html">
-               </File>
-               <File
-                       RelativePath=".\README.html">
-               </File>
-       </Files>
-       <Globals>
-       </Globals>
-</VisualStudioProject>
diff --git a/json.h b/json.h
index 4339b20..fc2dadd 100644 (file)
--- a/json.h
+++ b/json.h
  *
  */
 
+/**
+ * @file
+ * @brief A convenience header that may be included instead of other individual ones.
+ */
 #ifndef _json_h_
 #define _json_h_
 
 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_pointer.h"
 #include "json_tokener.h"
 #include "json_object_iterator.h"
 #include "json_c_version.h"
index 29c8ae7..34db2a2 100644 (file)
@@ -1,22 +1,40 @@
 /*
- * Copyright (c) 2012 Eric Haszlakiewicz
+ * Copyright (c) 2012,2017 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.
  */
 
+/**
+ * @file
+ * @brief Methods for retrieving the json-c version.
+ */
 #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 1
+#define JSON_C_MINOR_VERSION 13
+#define JSON_C_MICRO_VERSION 00
 #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.1"
+#define JSON_C_VERSION "0.13"
 
+/**
+ * @see JSON_C_VERSION
+ * @return the version of the json-c library as a string
+ */
 const char *json_c_version(void); /* Returns JSON_C_VERSION */
+
+/**
+ * The json-c version encoded into an int, with the low order 8 bits
+ * being the micro version, the next higher 8 bits being the minor version
+ * and the next higher 8 bits being the major version.
+ * For example, 7.12.99 would be 0x00070B63.
+ *
+ * @see JSON_C_VERSION_NUM
+ * @return the version of the json-c library as an int
+ */
 int json_c_version_num(void);     /* Returns JSON_C_VERSION_NUM */
 
 #endif
diff --git a/json_config.h.win32 b/json_config.h.win32
new file mode 100644 (file)
index 0000000..9c542a4
--- /dev/null
@@ -0,0 +1,5 @@
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#if defined(_MSC_VER) && _MSC_VER >= 1800
+#define JSON_C_HAVE_INTTYPES_H 1
+#endif
index 9de8d24..3854913 100644 (file)
@@ -1,27 +1,22 @@
 
+/**
+ * @file
+ * @brief Do not use, json-c internal, may be changed or removed at any time.
+ */
 #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"
+#ifdef JSON_C_HAVE_INTTYPES_H
+/* inttypes.h includes stdint.h */
+#include <inttypes.h>
 
 #else
+#include <stdint.h>
 
-#ifdef JSON_C_HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-/* inttypes.h includes stdint.h */
+#define PRId64 "I64d"
+#define SCNd64 "I64d"
 
 #endif
 
index 6cc73bc..9daa6fd 100644 (file)
 
 #include "config.h"
 
+#include "strerror_override.h"
+
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stddef.h>
 #include <string.h>
 #include <math.h>
-#include <errno.h>
 
 #include "debug.h"
 #include "printbuf.h"
 #include "json_object_private.h"
 #include "json_util.h"
 #include "math_compat.h"
+#include "strdup_compat.h"
+#include "snprintf_compat.h"
 
-#if !defined(HAVE_STRDUP) && defined(_MSC_VER)
-  /* MSC has the version as _strdup */
-# define strdup _strdup
-#elif !defined(HAVE_STRDUP)
-# error You do not have strdup on your system.
-#endif /* HAVE_STRDUP */
-
-#if !defined(HAVE_SNPRINTF) && defined(_MSC_VER)
-  /* MSC has the version as _snprintf */
-# define snprintf _snprintf
-#elif !defined(HAVE_SNPRINTF)
-# error You do not have snprintf on your system.
-#endif /* HAVE_SNPRINTF */
+#if SIZEOF_LONG_LONG != SIZEOF_INT64_T
+#error "The long long type isn't 64-bits"
+#endif
 
 // Don't define this.  It's not thread-safe.
 /* #define REFCOUNT_DEBUG 1 */
@@ -54,8 +48,8 @@ static struct json_object* json_object_new(enum json_type o_type);
 
 static json_object_to_json_string_fn json_object_object_to_json_string;
 static json_object_to_json_string_fn json_object_boolean_to_json_string;
+static json_object_to_json_string_fn json_object_double_to_json_string_default;
 static json_object_to_json_string_fn json_object_int_to_json_string;
-static json_object_to_json_string_fn json_object_double_to_json_string;
 static json_object_to_json_string_fn json_object_string_to_json_string;
 static json_object_to_json_string_fn json_object_array_to_json_string;
 
@@ -68,72 +62,104 @@ static struct lh_table *json_object_table;
 
 static void json_object_init(void) __attribute__ ((constructor));
 static void json_object_init(void) {
-  MC_DEBUG("json_object_init: creating object table\n");
-  json_object_table = lh_kptr_table_new(128, "json_object_table", NULL);
+       MC_DEBUG("json_object_init: creating object table\n");
+       json_object_table = lh_kptr_table_new(128, NULL);
 }
 
 static void json_object_fini(void) __attribute__ ((destructor));
-static void json_object_fini(void) {
-  struct lh_entry *ent;
-  if(MC_GET_DEBUG()) {
-    if (json_object_table->count) {
-      MC_DEBUG("json_object_fini: %d referenced objects at exit\n",
-              json_object_table->count);
-      lh_foreach(json_object_table, ent) {
-        struct json_object* obj = (struct json_object*)ent->v;
-        MC_DEBUG("\t%s:%p\n", json_type_to_name(obj->o_type), obj);
-      }
-    }
-  }
-  MC_DEBUG("json_object_fini: freeing object table\n");
-  lh_table_free(json_object_table);
+static void json_object_fini(void)
+{
+       struct lh_entry *ent;
+       if (MC_GET_DEBUG())
+       {
+               if (json_object_table->count)
+               {
+                       MC_DEBUG("json_object_fini: %d referenced objects at exit\n",
+                          json_object_table->count);
+                       lh_foreach(json_object_table, ent)
+                       {
+                               struct json_object* obj =
+                                 (struct json_object*) lh_entry_v(ent);
+                               MC_DEBUG("\t%s:%p\n",
+                                        json_type_to_name(obj->o_type), obj);
+                       }
+               }
+       }
+       MC_DEBUG("json_object_fini: freeing object table\n");
+       lh_table_free(json_object_table);
 }
 #endif /* REFCOUNT_DEBUG */
 
 
+/* helper for accessing the optimized string data component in json_object
+ */
+static const char *
+get_string_component(const struct json_object *jso)
+{
+       return (jso->o.c_string.len < LEN_DIRECT_STRING_DATA) ?
+                  jso->o.c_string.str.data : jso->o.c_string.str.ptr;
+}
+
 /* string escaping */
 
-static int json_escape_str(struct printbuf *pb, char *str, int len)
-{
-  int pos = 0, start_offset = 0;
-  unsigned char c;
-  while (len--) {
-    c = str[pos];
-    switch(c) {
-    case '\b':
-    case '\n':
-    case '\r':
-    case '\t':
-    case '\f':
-    case '"':
-    case '\\':
-    case '/':
-      if(pos - start_offset > 0)
-       printbuf_memappend(pb, str + start_offset, pos - start_offset);
-      if(c == '\b') printbuf_memappend(pb, "\\b", 2);
-      else if(c == '\n') printbuf_memappend(pb, "\\n", 2);
-      else if(c == '\r') printbuf_memappend(pb, "\\r", 2);
-      else if(c == '\t') printbuf_memappend(pb, "\\t", 2);
-      else if(c == '\f') printbuf_memappend(pb, "\\f", 2);
-      else if(c == '"') printbuf_memappend(pb, "\\\"", 2);
-      else if(c == '\\') printbuf_memappend(pb, "\\\\", 2);
-      else if(c == '/') printbuf_memappend(pb, "\\/", 2);
-      start_offset = ++pos;
-      break;
-    default:
-      if(c < ' ') {
-       if(pos - start_offset > 0)
-         printbuf_memappend(pb, str + start_offset, pos - start_offset);
-       sprintbuf(pb, "\\u00%c%c",
-                 json_hex_chars[c >> 4],
-                 json_hex_chars[c & 0xf]);
-       start_offset = ++pos;
-      } else pos++;
-    }
-  }
-  if(pos - start_offset > 0)
-    printbuf_memappend(pb, str + start_offset, pos - start_offset);
-  return 0;
+static int json_escape_str(struct printbuf *pb, const char *str, int len, int flags)
+{
+       int pos = 0, start_offset = 0;
+       unsigned char c;
+       while (len--)
+       {
+               c = str[pos];
+               switch(c)
+               {
+               case '\b':
+               case '\n':
+               case '\r':
+               case '\t':
+               case '\f':
+               case '"':
+               case '\\':
+               case '/':
+                       if((flags & JSON_C_TO_STRING_NOSLASHESCAPE) && c == '/')
+                       {
+                               pos++;
+                               break;
+                       }
+
+                       if(pos - start_offset > 0)
+                               printbuf_memappend(pb, str + start_offset, pos - start_offset);
+
+                       if(c == '\b') printbuf_memappend(pb, "\\b", 2);
+                       else if(c == '\n') printbuf_memappend(pb, "\\n", 2);
+                       else if(c == '\r') printbuf_memappend(pb, "\\r", 2);
+                       else if(c == '\t') printbuf_memappend(pb, "\\t", 2);
+                       else if(c == '\f') printbuf_memappend(pb, "\\f", 2);
+                       else if(c == '"') printbuf_memappend(pb, "\\\"", 2);
+                       else if(c == '\\') printbuf_memappend(pb, "\\\\", 2);
+                       else if(c == '/') printbuf_memappend(pb, "\\/", 2);
+
+                       start_offset = ++pos;
+                       break;
+               default:
+                       if(c < ' ')
+                       {
+                               char sbuf[7];
+                               if(pos - start_offset > 0)
+                                       printbuf_memappend(pb,
+                                                          str + start_offset,
+                                                          pos - start_offset);
+                               snprintf(sbuf, sizeof(sbuf),
+                                        "\\u00%c%c",
+                                        json_hex_chars[c >> 4],
+                                        json_hex_chars[c & 0xf]);
+                               printbuf_memappend_fast(pb, sbuf, (int) sizeof(sbuf) - 1);
+                               start_offset = ++pos;
+                       } else
+                               pos++;
+               }
+       }
+       if (pos - start_offset > 0)
+               printbuf_memappend(pb, str + start_offset, pos - start_offset);
+       return 0;
 }
 
 
@@ -141,26 +167,37 @@ static int json_escape_str(struct printbuf *pb, char *str, int len)
 
 extern struct json_object* json_object_get(struct json_object *jso)
 {
-  if(jso) {
-    jso->_ref_count++;
-  }
-  return jso;
+       if (!jso) return jso;
+
+#if defined(HAVE_ATOMIC_BUILTINS) && defined(ENABLE_THREADING)
+       __sync_add_and_fetch(&jso->_ref_count, 1);
+#else
+       ++jso->_ref_count;
+#endif        
+
+       return jso;
 }
 
 int json_object_put(struct json_object *jso)
 {
-       if(jso)
-       {
-               jso->_ref_count--;
-               if(!jso->_ref_count)
-               {
-                       if (jso->_user_delete)
-                               jso->_user_delete(jso, jso->_userdata);
-                       jso->_delete(jso);
-                       return 1;
-               }
-       }
-       return 0;
+       if(!jso) return 0;
+
+#if defined(HAVE_ATOMIC_BUILTINS) && defined(ENABLE_THREADING)
+       /* Note: this only allow the refcount to remain correct
+        * when multiple threads are adjusting it.  It is still an error 
+        * for a thread to decrement the refcount if it doesn't "own" it,
+        * as that can result in the thread that loses the race to 0
+        * operating on an already-freed object.
+        */
+       if (__sync_sub_and_fetch(&jso->_ref_count, 1) > 0) return 0;
+#else
+       if (--jso->_ref_count > 0) return 0;
+#endif
+
+       if (jso->_user_delete)
+               jso->_user_delete(jso, jso->_userdata);
+       jso->_delete(jso);
+       return 1;
 }
 
 
@@ -169,61 +206,74 @@ int json_object_put(struct json_object *jso)
 static void json_object_generic_delete(struct json_object* jso)
 {
 #ifdef REFCOUNT_DEBUG
-  MC_DEBUG("json_object_delete_%s: %p\n",
+       MC_DEBUG("json_object_delete_%s: %p\n",
           json_type_to_name(jso->o_type), jso);
-  lh_table_delete(json_object_table, jso);
+       lh_table_delete(json_object_table, jso);
 #endif /* REFCOUNT_DEBUG */
-  printbuf_free(jso->_pb);
-  free(jso);
+       printbuf_free(jso->_pb);
+       free(jso);
 }
 
 static struct json_object* json_object_new(enum json_type o_type)
 {
-  struct json_object *jso;
+       struct json_object *jso;
 
-  jso = (struct json_object*)calloc(sizeof(struct json_object), 1);
-  if(!jso) return NULL;
-  jso->o_type = o_type;
-  jso->_ref_count = 1;
-  jso->_delete = &json_object_generic_delete;
+       jso = (struct json_object*)calloc(sizeof(struct json_object), 1);
+       if (!jso)
+               return NULL;
+       jso->o_type = o_type;
+       jso->_ref_count = 1;
+       jso->_delete = &json_object_generic_delete;
 #ifdef REFCOUNT_DEBUG
-  lh_table_insert(json_object_table, jso, jso);
-  MC_DEBUG("json_object_new_%s: %p\n", json_type_to_name(jso->o_type), jso);
+       lh_table_insert(json_object_table, jso, jso);
+       MC_DEBUG("json_object_new_%s: %p\n", json_type_to_name(jso->o_type), jso);
 #endif /* REFCOUNT_DEBUG */
-  return jso;
+       return jso;
 }
 
 
 /* type checking functions */
 
-int json_object_is_type(struct json_object *jso, enum json_type type)
+int json_object_is_type(const struct json_object *jso, enum json_type type)
 {
-  if (!jso)
-    return (type == json_type_null);
-  return (jso->o_type == type);
+       if (!jso)
+               return (type == json_type_null);
+       return (jso->o_type == type);
 }
 
-enum json_type json_object_get_type(struct json_object *jso)
+enum json_type json_object_get_type(const struct json_object *jso)
 {
-  if (!jso)
-    return json_type_null;
-  return jso->o_type;
+       if (!jso)
+               return json_type_null;
+       return jso->o_type;
+}
+
+void* json_object_get_userdata(json_object *jso) {
+       return jso ? jso->_userdata : NULL;
+}
+
+void json_object_set_userdata(json_object *jso, void *userdata,
+                             json_object_delete_fn *user_delete)
+{
+       // Can't return failure, so abort if we can't perform the operation.
+       assert(jso != NULL);
+
+       // First, clean up any previously existing user info
+       if (jso->_user_delete)
+               jso->_user_delete(jso, jso->_userdata);
+
+       jso->_userdata = userdata;
+       jso->_user_delete = user_delete;
 }
 
 /* set a custom conversion to string */
 
 void json_object_set_serializer(json_object *jso,
-       json_object_to_json_string_fn to_string_func,
+       json_object_to_json_string_fn *to_string_func,
        void *userdata,
        json_object_delete_fn *user_delete)
 {
-       // First, clean up any previously existing user info
-       if (jso->_user_delete)
-       {
-               jso->_user_delete(jso, jso->_userdata);
-       }
-       jso->_userdata = NULL;
-       jso->_user_delete = NULL;
+       json_object_set_userdata(jso, userdata, user_delete);
 
        if (to_string_func == NULL)
        {
@@ -237,7 +287,7 @@ void json_object_set_serializer(json_object *jso,
                        jso->_to_json_string = &json_object_boolean_to_json_string;
                        break;
                case json_type_double:
-                       jso->_to_json_string = &json_object_double_to_json_string;
+                       jso->_to_json_string = &json_object_double_to_json_string_default;
                        break;
                case json_type_int:
                        jso->_to_json_string = &json_object_int_to_json_string;
@@ -256,27 +306,40 @@ void json_object_set_serializer(json_object *jso,
        }
 
        jso->_to_json_string = to_string_func;
-       jso->_userdata = userdata;
-       jso->_user_delete = user_delete;
 }
 
 
 /* extended conversion to string */
 
-const char* json_object_to_json_string_ext(struct json_object *jso, int flags)
+const char* json_object_to_json_string_length(struct json_object *jso, int flags, size_t *length)
 {
-       if (!jso)
-               return "null";
+       const char *r = NULL;
+       size_t s = 0;
 
-       if ((!jso->_pb) && !(jso->_pb = printbuf_new()))
-               return NULL;
+       if (!jso)
+       {
+               s = 4;
+               r = "null";
+       }
+       else if ((jso->_pb) || (jso->_pb = printbuf_new()))
+       {
+               printbuf_reset(jso->_pb);
 
-       printbuf_reset(jso->_pb);
+               if(jso->_to_json_string(jso, jso->_pb, 0, flags) >= 0)
+               {
+                       s = (size_t)jso->_pb->bpos;
+                       r = jso->_pb->buf;
+               }
+       }
 
-       if(jso->_to_json_string(jso, jso->_pb, 0, flags) < 0)
-               return NULL;
+       if (length)
+               *length = s;
+       return r;
+}
 
-       return jso->_pb->buf;
+const char* json_object_to_json_string_ext(struct json_object *jso, int flags)
+{
+       return json_object_to_json_string_length(jso, flags, NULL);
 }
 
 /* backwards-compatible conversion to string */
@@ -290,7 +353,14 @@ static void indent(struct printbuf *pb, int level, int flags)
 {
        if (flags & JSON_C_TO_STRING_PRETTY)
        {
-               printbuf_memset(pb, -1, ' ', level * 2);
+               if (flags & JSON_C_TO_STRING_PRETTY_TAB)
+               {
+                       printbuf_memset(pb, -1, '\t', level);
+               }
+               else
+               {
+                       printbuf_memset(pb, -1, ' ', level * 2);
+               }
        }
 }
 
@@ -299,116 +369,156 @@ static void indent(struct printbuf *pb, int level, int flags)
 static int json_object_object_to_json_string(struct json_object* jso,
                                             struct printbuf *pb,
                                             int level,
-                                                int flags)
+                                            int flags)
 {
        int had_children = 0;
        struct json_object_iter iter;
 
-       sprintbuf(pb, "{" /*}*/);
+       printbuf_strappend(pb, "{" /*}*/);
        if (flags & JSON_C_TO_STRING_PRETTY)
-               sprintbuf(pb, "\n");
+               printbuf_strappend(pb, "\n");
        json_object_object_foreachC(jso, iter)
        {
                if (had_children)
                {
-                       sprintbuf(pb, ",");
+                       printbuf_strappend(pb, ",");
                        if (flags & JSON_C_TO_STRING_PRETTY)
-                               sprintbuf(pb, "\n");
+                               printbuf_strappend(pb, "\n");
                }
                had_children = 1;
                if (flags & JSON_C_TO_STRING_SPACED)
-                       sprintbuf(pb, " ");
+                       printbuf_strappend(pb, " ");
                indent(pb, level+1, flags);
-               sprintbuf(pb, "\"");
-               json_escape_str(pb, iter.key, strlen(iter.key));
+               printbuf_strappend(pb, "\"");
+               json_escape_str(pb, iter.key, strlen(iter.key), flags);
                if (flags & JSON_C_TO_STRING_SPACED)
-                       sprintbuf(pb, "\": ");
+                       printbuf_strappend(pb, "\": ");
                else
-                       sprintbuf(pb, "\":");
+                       printbuf_strappend(pb, "\":");
                if(iter.val == NULL)
-                       sprintbuf(pb, "null");
+                       printbuf_strappend(pb, "null");
                else
-                       iter.val->_to_json_string(iter.val, pb, level+1,flags);
+                       if (iter.val->_to_json_string(iter.val, pb, level+1,flags) < 0)
+                               return -1;
        }
        if (flags & JSON_C_TO_STRING_PRETTY)
        {
                if (had_children)
-                       sprintbuf(pb, "\n");
+                       printbuf_strappend(pb, "\n");
                indent(pb,level,flags);
        }
        if (flags & JSON_C_TO_STRING_SPACED)
-               return sprintbuf(pb, /*{*/ " }");
+               return printbuf_strappend(pb, /*{*/ " }");
        else
-               return sprintbuf(pb, /*{*/ "}");
+               return printbuf_strappend(pb, /*{*/ "}");
 }
 
 
 static void json_object_lh_entry_free(struct lh_entry *ent)
 {
-  free(ent->k);
-  json_object_put((struct json_object*)ent->v);
+       if (!ent->k_is_constant)
+               free(lh_entry_k(ent));
+       json_object_put((struct json_object*)lh_entry_v(ent));
 }
 
 static void json_object_object_delete(struct json_object* jso)
 {
-  lh_table_free(jso->o.c_object);
-  json_object_generic_delete(jso);
+       lh_table_free(jso->o.c_object);
+       json_object_generic_delete(jso);
 }
 
 struct json_object* json_object_new_object(void)
 {
-  struct json_object *jso = json_object_new(json_type_object);
-  if(!jso) return NULL;
-  jso->_delete = &json_object_object_delete;
-  jso->_to_json_string = &json_object_object_to_json_string;
-  jso->o.c_object = lh_kchar_table_new(JSON_OBJECT_DEF_HASH_ENTRIES,
-                                       NULL, &json_object_lh_entry_free);
-  return jso;
+       struct json_object *jso = json_object_new(json_type_object);
+       if (!jso)
+               return NULL;
+       jso->_delete = &json_object_object_delete;
+       jso->_to_json_string = &json_object_object_to_json_string;
+       jso->o.c_object = lh_kchar_table_new(JSON_OBJECT_DEF_HASH_ENTRIES,
+                                            &json_object_lh_entry_free);
+       if (!jso->o.c_object)
+       {
+               json_object_generic_delete(jso);
+               errno = ENOMEM;
+               return NULL;
+       }
+       return jso;
 }
 
-struct lh_table* json_object_get_object(struct json_object *jso)
+struct lh_table* json_object_get_object(const struct json_object *jso)
 {
-  if(!jso) return NULL;
-  switch(jso->o_type) {
-  case json_type_object:
-    return jso->o.c_object;
-  default:
-    return NULL;
-  }
+       if (!jso)
+               return NULL;
+       switch(jso->o_type)
+       {
+       case json_type_object:
+               return jso->o.c_object;
+       default:
+               return NULL;
+       }
 }
 
-void json_object_object_add(struct json_object* jso, const char *key,
-                           struct json_object *val)
+int json_object_object_add_ex(struct json_object* jso,
+       const char *const key,
+       struct json_object *const val,
+       const unsigned opts)
 {
+       struct json_object *existing_value = NULL;
+       struct lh_entry *existing_entry;
+       unsigned long hash;
+
+       assert(json_object_get_type(jso) == json_type_object);
+
        // We lookup the entry and replace the value, rather than just deleting
        // and re-adding it, so the existing key remains valid.
-       json_object *existing_value = NULL;
-       struct lh_entry *existing_entry;
-       existing_entry = lh_table_lookup_entry(jso->o.c_object, (void*)key);
+       hash = lh_get_hash(jso->o.c_object, (const void *)key);
+       existing_entry = (opts & JSON_C_OBJECT_ADD_KEY_IS_NEW) ? NULL : 
+                             lh_table_lookup_entry_w_hash(jso->o.c_object,
+                                                          (const void *)key, hash);
+
+       // The caller must avoid creating loops in the object tree, but do a
+       // quick check anyway to make sure we're not creating a trivial loop.
+       if (jso == val)
+               return -1;
+
        if (!existing_entry)
        {
-               lh_table_insert(jso->o.c_object, strdup(key), val);
-               return;
+               const void *const k = (opts & JSON_C_OBJECT_KEY_IS_CONSTANT) ?
+                                       (const void *)key : strdup(key);
+               if (k == NULL)
+                       return -1;
+               return lh_table_insert_w_hash(jso->o.c_object, k, val, hash, opts);
        }
-       existing_value = (void *)existing_entry->v;
+       existing_value = (json_object *) lh_entry_v(existing_entry);
        if (existing_value)
                json_object_put(existing_value);
        existing_entry->v = val;
+       return 0;
 }
 
-int json_object_object_length(struct json_object *jso)
+int json_object_object_add(struct json_object* jso, const char *key,
+                           struct json_object *val)
 {
+       return json_object_object_add_ex(jso, key, val, 0);
+}
+
+
+int json_object_object_length(const struct json_object *jso)
+{
+       assert(json_object_get_type(jso) == json_type_object);
        return lh_table_length(jso->o.c_object);
 }
 
-struct json_object* json_object_object_get(struct json_object* jso, const char *key)
+struct json_object* json_object_object_get(const struct json_object* jso,
+                                          const char *key)
 {
        struct json_object *result = NULL;
        json_object_object_get_ex(jso, key, &result);
        return result;
 }
 
-json_bool json_object_object_get_ex(struct json_object* jso, const char *key, struct json_object **value)
+json_bool json_object_object_get_ex(const struct json_object* jso, const char *key,
+                                   struct json_object **value)
 {
        if (value != NULL)
                *value = NULL;
@@ -419,7 +529,8 @@ json_bool json_object_object_get_ex(struct json_object* jso, const char *key, st
        switch(jso->o_type)
        {
        case json_type_object:
-               return lh_table_lookup_ex(jso->o.c_object, (void*)key, (void**)value);
+               return lh_table_lookup_ex(jso->o.c_object, (const void *) key,
+                                         (void**) value);
        default:
                if (value != NULL)
                        *value = NULL;
@@ -429,6 +540,7 @@ json_bool json_object_object_get_ex(struct json_object* jso, const char *key, st
 
 void json_object_object_del(struct json_object* jso, const char *key)
 {
+       assert(json_object_get_type(jso) == json_type_object);
        lh_table_delete(jso->o.c_object, key);
 }
 
@@ -438,36 +550,47 @@ void json_object_object_del(struct json_object* jso, const char *key)
 static int json_object_boolean_to_json_string(struct json_object* jso,
                                              struct printbuf *pb,
                                              int level,
-                                                 int flags)
+                                             int flags)
 {
-  if(jso->o.c_boolean) return sprintbuf(pb, "true");
-  else return sprintbuf(pb, "false");
+       if (jso->o.c_boolean)
+               return printbuf_strappend(pb, "true");
+       return printbuf_strappend(pb, "false");
 }
 
 struct json_object* json_object_new_boolean(json_bool b)
 {
-  struct json_object *jso = json_object_new(json_type_boolean);
-  if(!jso) return NULL;
-  jso->_to_json_string = &json_object_boolean_to_json_string;
-  jso->o.c_boolean = b;
-  return jso;
+       struct json_object *jso = json_object_new(json_type_boolean);
+       if (!jso)
+               return NULL;
+       jso->_to_json_string = &json_object_boolean_to_json_string;
+       jso->o.c_boolean = b;
+       return jso;
 }
 
-json_bool json_object_get_boolean(struct json_object *jso)
+json_bool json_object_get_boolean(const struct json_object *jso)
 {
-  if(!jso) return FALSE;
-  switch(jso->o_type) {
-  case json_type_boolean:
-    return jso->o.c_boolean;
-  case json_type_int:
-    return (jso->o.c_int64 != 0);
-  case json_type_double:
-    return (jso->o.c_double != 0);
-  case json_type_string:
-    return (jso->o.c_string.len != 0);
-  default:
-    return FALSE;
-  }
+       if (!jso)
+               return FALSE;
+       switch(jso->o_type)
+       {
+       case json_type_boolean:
+               return jso->o.c_boolean;
+       case json_type_int:
+               return (jso->o.c_int64 != 0);
+       case json_type_double:
+               return (jso->o.c_double != 0);
+       case json_type_string:
+               return (jso->o.c_string.len != 0);
+       default:
+               return FALSE;
+       }
+}
+
+int json_object_set_boolean(struct json_object *jso,json_bool new_value){
+       if (!jso || jso->o_type!=json_type_boolean)
+               return 0;
+       jso->o.c_boolean=new_value;
+       return 1;
 }
 
 
@@ -478,19 +601,23 @@ static int json_object_int_to_json_string(struct json_object* jso,
                                          int level,
                                          int flags)
 {
-  return sprintbuf(pb, "%"PRId64, jso->o.c_int64);
+       /* room for 19 digits, the sign char, and a null term */
+       char sbuf[21];
+       snprintf(sbuf, sizeof(sbuf), "%" PRId64, jso->o.c_int64);
+       return printbuf_memappend (pb, sbuf, strlen(sbuf));
 }
 
 struct json_object* json_object_new_int(int32_t i)
 {
-  struct json_object *jso = json_object_new(json_type_int);
-  if(!jso) return NULL;
-  jso->_to_json_string = &json_object_int_to_json_string;
-  jso->o.c_int64 = i;
-  return jso;
+       struct json_object *jso = json_object_new(json_type_int);
+       if (!jso)
+               return NULL;
+       jso->_to_json_string = &json_object_int_to_json_string;
+       jso->o.c_int64 = i;
+       return jso;
 }
 
-int32_t json_object_get_int(struct json_object *jso)
+int32_t json_object_get_int(const struct json_object *jso)
 {
   int64_t cint64;
   enum json_type o_type;
@@ -506,7 +633,7 @@ int32_t json_object_get_int(struct json_object *jso)
         * Parse strings into 64-bit numbers, then use the
         * 64-to-32-bit number handling below.
         */
-       if (json_parse_int64(jso->o.c_string.str, &cint64) != 0)
+       if (json_parse_int64(get_string_component(jso), &cint64) != 0)
                return 0; /* whoops, it didn't work. */
        o_type = json_type_int;
   }
@@ -516,11 +643,14 @@ int32_t json_object_get_int(struct json_object *jso)
        /* Make sure we return the correct values for out of range numbers. */
        if (cint64 <= INT32_MIN)
                return INT32_MIN;
-       else if (cint64 >= INT32_MAX)
+       if (cint64 >= INT32_MAX)
                return INT32_MAX;
-       else
-               return (int32_t)cint64;
+       return (int32_t) cint64;
   case json_type_double:
+    if (jso->o.c_double <= INT32_MIN)
+      return INT32_MIN;
+    if (jso->o.c_double >= INT32_MAX)
+      return INT32_MAX;
     return (int32_t)jso->o.c_double;
   case json_type_boolean:
     return jso->o.c_boolean;
@@ -529,76 +659,206 @@ int32_t json_object_get_int(struct json_object *jso)
   }
 }
 
+int json_object_set_int(struct json_object *jso,int new_value){
+       if (!jso || jso->o_type!=json_type_int)
+               return 0;
+       jso->o.c_int64=new_value;
+       return 1;
+}
+
 struct json_object* json_object_new_int64(int64_t i)
 {
-  struct json_object *jso = json_object_new(json_type_int);
-  if(!jso) return NULL;
-  jso->_to_json_string = &json_object_int_to_json_string;
-  jso->o.c_int64 = i;
-  return jso;
+       struct json_object *jso = json_object_new(json_type_int);
+       if (!jso)
+               return NULL;
+       jso->_to_json_string = &json_object_int_to_json_string;
+       jso->o.c_int64 = i;
+       return jso;
 }
 
-int64_t json_object_get_int64(struct json_object *jso)
+int64_t json_object_get_int64(const struct json_object *jso)
 {
-   int64_t cint;
+       int64_t cint;
 
-  if(!jso) return 0;
-  switch(jso->o_type) {
-  case json_type_int:
-    return jso->o.c_int64;
-  case json_type_double:
-    return (int64_t)jso->o.c_double;
-  case json_type_boolean:
-    return jso->o.c_boolean;
-  case json_type_string:
-       if (json_parse_int64(jso->o.c_string.str, &cint) == 0) return cint;
-  default:
-    return 0;
-  }
+       if (!jso)
+               return 0;
+       switch(jso->o_type)
+       {
+       case json_type_int:
+               return jso->o.c_int64;
+       case json_type_double:
+               if (jso->o.c_double >= INT64_MAX)
+                       return INT64_MAX;
+               if (jso->o.c_double <= INT64_MIN)
+                       return INT64_MIN;
+               return (int64_t)jso->o.c_double;
+       case json_type_boolean:
+               return jso->o.c_boolean;
+       case json_type_string:
+               if (json_parse_int64(get_string_component(jso), &cint) == 0)
+                       return cint;
+               /* FALLTHRU */
+       default:
+               return 0;
+       }
 }
 
+int json_object_set_int64(struct json_object *jso,int64_t new_value){
+       if (!jso || jso->o_type!=json_type_int)
+               return 0;
+       jso->o.c_int64=new_value;
+       return 1;
+}
+
+int json_object_int_inc(struct json_object *jso, int64_t val) {
+       if (!jso || jso->o_type != json_type_int)
+               return 0;
+       if (val > 0 && jso->o.c_int64 > INT64_MAX - val) {
+               jso->o.c_int64 = INT64_MAX;
+       } else if (val < 0 && jso->o.c_int64 < INT64_MIN - val) {
+               jso->o.c_int64 = INT64_MIN;
+       } else {
+               jso->o.c_int64 += val;
+       }
+       return 1;
+}
 
 /* json_object_double */
 
-static int json_object_double_to_json_string(struct json_object* jso,
-                                            struct printbuf *pb,
-                                            int level,
-                                                int flags)
-{
-  char buf[128], *p, *q;
-  int size;
-  /* Although JSON RFC does not support
-     NaN or Infinity as numeric values
-     ECMA 262 section 9.8.1 defines
-     how to handle these cases as strings */
-  if(isnan(jso->o.c_double))
-    size = snprintf(buf, sizeof(buf), "NaN");
-  else if(isinf(jso->o.c_double))
-    if(jso->o.c_double > 0)
-      size = snprintf(buf, sizeof(buf), "Infinity");
-    else
-      size = snprintf(buf, sizeof(buf), "-Infinity");
-  else
-    size = snprintf(buf, sizeof(buf), "%.17g", jso->o.c_double);
-
-  p = strchr(buf, ',');
-  if (p) {
-    *p = '.';
-  } else {
-    p = strchr(buf, '.');
-  }
-  if (p && (flags & JSON_C_TO_STRING_NOZERO)) {
-    /* last useful digit, always keep 1 zero */
-    p++;
-    for (q=p ; *q ; q++) {
-      if (*q!='0') p=q;
-    }
-    /* drop trailing zeroes */
-    *(++p) = 0;
-    size = p-buf;
-  }
-  printbuf_memappend(pb, buf, size);
-  return size;
+#if defined(HAVE___THREAD)
+// i.e. __thread or __declspec(thread)
+static SPEC___THREAD char *tls_serialization_float_format = NULL;
+#endif
+static char *global_serialization_float_format = NULL;
+
+int json_c_set_serialization_double_format(const char *double_format, int global_or_thread)
+{
+       if (global_or_thread == JSON_C_OPTION_GLOBAL)
+       {
+#if defined(HAVE___THREAD)
+               if (tls_serialization_float_format)
+               {
+                       free(tls_serialization_float_format);
+                       tls_serialization_float_format = NULL;
+               }
+#endif
+               if (global_serialization_float_format)
+                       free(global_serialization_float_format);
+               global_serialization_float_format = double_format ? strdup(double_format) : NULL;
+       }
+       else if (global_or_thread == JSON_C_OPTION_THREAD)
+       {
+#if defined(HAVE___THREAD)
+               if (tls_serialization_float_format)
+               {
+                       free(tls_serialization_float_format);
+                       tls_serialization_float_format = NULL;
+               }
+               tls_serialization_float_format = double_format ? strdup(double_format) : NULL;
+#else
+               _json_c_set_last_err("json_c_set_option: not compiled with __thread support\n");
+               return -1;
+#endif
+       }
+       else
+       {
+               _json_c_set_last_err("json_c_set_option: invalid global_or_thread value: %d\n", global_or_thread);
+               return -1;
+       }
+       return 0;
+}
+
+
+static int json_object_double_to_json_string_format(struct json_object* jso,
+                                                   struct printbuf *pb,
+                                                   int level,
+                                                   int flags,
+                                                   const char *format)
+{
+       char buf[128], *p, *q;
+       int size;
+       double dummy; /* needed for modf() */
+       /* Although JSON RFC does not support
+       NaN or Infinity as numeric values
+       ECMA 262 section 9.8.1 defines
+       how to handle these cases as strings */
+       if (isnan(jso->o.c_double))
+       {
+               size = snprintf(buf, sizeof(buf), "NaN");
+       }
+       else if (isinf(jso->o.c_double))
+       {
+               if(jso->o.c_double > 0)
+                       size = snprintf(buf, sizeof(buf), "Infinity");
+               else
+                       size = snprintf(buf, sizeof(buf), "-Infinity");
+       }
+       else
+       {
+               const char *std_format = "%.17g";
+
+#if defined(HAVE___THREAD)
+               if (tls_serialization_float_format)
+                       std_format = tls_serialization_float_format;
+               else
+#endif
+               if (global_serialization_float_format)
+                       std_format = global_serialization_float_format;
+               if (!format)
+                       format = std_format;
+               size = snprintf(buf, sizeof(buf), format, jso->o.c_double);
+               if (modf(jso->o.c_double, &dummy) == 0  && size >= 0 && size < (int)sizeof(buf) - 2)
+               {
+                       // Ensure it looks like a float, even if snprintf didn't.
+                       strcat(buf, ".0");
+                       size += 2;
+               }
+       }
+       // although unlikely, snprintf can fail
+       if (size < 0)
+               return -1;
+
+       p = strchr(buf, ',');
+       if (p)
+               *p = '.';
+       else
+               p = strchr(buf, '.');
+       if (p && (flags & JSON_C_TO_STRING_NOZERO))
+       {
+               /* last useful digit, always keep 1 zero */
+               p++;
+               for (q=p ; *q ; q++) {
+                       if (*q!='0') p=q;
+               }
+               /* drop trailing zeroes */
+               *(++p) = 0;
+               size = p-buf;
+       }
+
+       if (size >= (int)sizeof(buf))
+               // The standard formats are guaranteed not to overrun the buffer,
+               // but if a custom one happens to do so, just silently truncate.
+               size = sizeof(buf) - 1;
+       printbuf_memappend(pb, buf, size);
+       return size;
+}
+
+static int json_object_double_to_json_string_default(struct json_object* jso,
+                                                    struct printbuf *pb,
+                                                    int level,
+                                                    int flags)
+{
+       return json_object_double_to_json_string_format(jso, pb, level, flags,
+                                                       NULL);
+}
+
+int json_object_double_to_json_string(struct json_object* jso,
+                                     struct printbuf *pb,
+                                     int level,
+                                     int flags)
+{
+       return json_object_double_to_json_string_format(jso, pb, level, flags,
+                                                       (const char *)jso->_userdata);
 }
 
 struct json_object* json_object_new_double(double d)
@@ -606,27 +866,35 @@ struct json_object* json_object_new_double(double d)
        struct json_object *jso = json_object_new(json_type_double);
        if (!jso)
                return NULL;
-       jso->_to_json_string = &json_object_double_to_json_string;
+       jso->_to_json_string = &json_object_double_to_json_string_default;
        jso->o.c_double = d;
        return jso;
 }
 
 struct json_object* json_object_new_double_s(double d, const char *ds)
 {
+       char *new_ds;
        struct json_object *jso = json_object_new_double(d);
        if (!jso)
                return NULL;
 
+       new_ds = strdup(ds);
+       if (!new_ds)
+       {
+               json_object_generic_delete(jso);
+               errno = ENOMEM;
+               return NULL;
+       }
        json_object_set_serializer(jso, json_object_userdata_to_json_string,
-           strdup(ds), json_object_free_userdata);
+           new_ds, json_object_free_userdata);
        return jso;
 }
 
 int json_object_userdata_to_json_string(struct json_object *jso,
        struct printbuf *pb, int level, int flags)
 {
-       int userdata_len = strlen(jso->_userdata);
-       printbuf_memappend(pb, jso->_userdata, userdata_len);
+       int userdata_len = strlen((const char *)jso->_userdata);
+       printbuf_memappend(pb, (const char *)jso->_userdata, userdata_len);
        return userdata_len;
 }
 
@@ -635,7 +903,7 @@ void json_object_free_userdata(struct json_object *jso, void *userdata)
        free(userdata);
 }
 
-double json_object_get_double(struct json_object *jso)
+double json_object_get_double(const struct json_object *jso)
 {
   double cdouble;
   char *errPtr = NULL;
@@ -650,10 +918,10 @@ double json_object_get_double(struct json_object *jso)
     return jso->o.c_boolean;
   case json_type_string:
     errno = 0;
-    cdouble = strtod(jso->o.c_string.str,&errPtr);
+    cdouble = strtod(get_string_component(jso), &errPtr);
 
     /* if conversion stopped at the first character, return 0.0 */
-    if (errPtr == jso->o.c_string.str)
+    if (errPtr == get_string_component(jso))
         return 0.0;
 
     /*
@@ -684,71 +952,128 @@ double json_object_get_double(struct json_object *jso)
   }
 }
 
+int json_object_set_double(struct json_object *jso,double new_value){
+       if (!jso || jso->o_type!=json_type_double)
+               return 0;
+       jso->o.c_double=new_value;
+       return 1;
+}
 
 /* json_object_string */
 
 static int json_object_string_to_json_string(struct json_object* jso,
                                             struct printbuf *pb,
                                             int level,
-                                                int flags)
+                                            int flags)
 {
-  sprintbuf(pb, "\"");
-  json_escape_str(pb, jso->o.c_string.str, jso->o.c_string.len);
-  sprintbuf(pb, "\"");
-  return 0;
+       printbuf_strappend(pb, "\"");
+       json_escape_str(pb, get_string_component(jso), jso->o.c_string.len, flags);
+       printbuf_strappend(pb, "\"");
+       return 0;
 }
 
 static void json_object_string_delete(struct json_object* jso)
 {
-  free(jso->o.c_string.str);
-  json_object_generic_delete(jso);
+       if(jso->o.c_string.len >= LEN_DIRECT_STRING_DATA)
+               free(jso->o.c_string.str.ptr);
+       json_object_generic_delete(jso);
 }
 
 struct json_object* json_object_new_string(const char *s)
 {
-  struct json_object *jso = json_object_new(json_type_string);
-  if(!jso) return NULL;
-  jso->_delete = &json_object_string_delete;
-  jso->_to_json_string = &json_object_string_to_json_string;
-  jso->o.c_string.str = strdup(s);
-  jso->o.c_string.len = strlen(s);
-  return jso;
+       struct json_object *jso = json_object_new(json_type_string);
+       if (!jso)
+               return NULL;
+       jso->_delete = &json_object_string_delete;
+       jso->_to_json_string = &json_object_string_to_json_string;
+       jso->o.c_string.len = strlen(s);
+       if(jso->o.c_string.len < LEN_DIRECT_STRING_DATA) {
+               memcpy(jso->o.c_string.str.data, s, jso->o.c_string.len);
+       } else {
+               jso->o.c_string.str.ptr = strdup(s);
+               if (!jso->o.c_string.str.ptr)
+               {
+                       json_object_generic_delete(jso);
+                       errno = ENOMEM;
+                       return NULL;
+               }
+       }
+       return jso;
 }
 
 struct json_object* json_object_new_string_len(const char *s, int len)
 {
-  struct json_object *jso = json_object_new(json_type_string);
-  if(!jso) return NULL;
-  jso->_delete = &json_object_string_delete;
-  jso->_to_json_string = &json_object_string_to_json_string;
-  jso->o.c_string.str = (char*)malloc(len + 1);
-  memcpy(jso->o.c_string.str, (void *)s, len);
-  jso->o.c_string.str[len] = '\0';
-  jso->o.c_string.len = len;
-  return jso;
+       char *dstbuf;
+       struct json_object *jso = json_object_new(json_type_string);
+       if (!jso)
+               return NULL;
+       jso->_delete = &json_object_string_delete;
+       jso->_to_json_string = &json_object_string_to_json_string;
+       if(len < LEN_DIRECT_STRING_DATA) {
+               dstbuf = jso->o.c_string.str.data;
+       } else {
+               jso->o.c_string.str.ptr = (char*)malloc(len + 1);
+               if (!jso->o.c_string.str.ptr)
+               {
+                       json_object_generic_delete(jso);
+                       errno = ENOMEM;
+                       return NULL;
+               }
+               dstbuf = jso->o.c_string.str.ptr;
+       }
+       memcpy(dstbuf, (const void *)s, len);
+       dstbuf[len] = '\0';
+       jso->o.c_string.len = len;
+       return jso;
 }
 
 const char* json_object_get_string(struct json_object *jso)
 {
-  if(!jso) return NULL;
-  switch(jso->o_type) {
-  case json_type_string:
-    return jso->o.c_string.str;
-  default:
-    return json_object_to_json_string(jso);
-  }
+       if (!jso)
+               return NULL;
+       switch(jso->o_type)
+       {
+       case json_type_string:
+               return get_string_component(jso);
+       default:
+               return json_object_to_json_string(jso);
+       }
 }
 
-int json_object_get_string_len(struct json_object *jso)  {
-  if(!jso) return 0;
-  switch(jso->o_type) {
-  case json_type_string:
-    return jso->o.c_string.len;
-  default:
-    return 0;
-  }
+int json_object_get_string_len(const struct json_object *jso)
+{
+       if (!jso)
+               return 0;
+       switch(jso->o_type)
+       {
+       case json_type_string:
+               return jso->o.c_string.len;
+       default:
+               return 0;
+       }
 }
 
+int json_object_set_string(json_object* jso, const char* s) {
+       return json_object_set_string_len(jso, s, (int)(strlen(s)));
+}
+
+int json_object_set_string_len(json_object* jso, const char* s, int len){
+       char *dstbuf; 
+       if (jso==NULL || jso->o_type!=json_type_string) return 0;       
+       if (len<LEN_DIRECT_STRING_DATA) {
+               dstbuf=jso->o.c_string.str.data;
+               if (jso->o.c_string.len>=LEN_DIRECT_STRING_DATA) free(jso->o.c_string.str.ptr); 
+       } else {
+               dstbuf=(char *)malloc(len+1);
+               if (dstbuf==NULL) return 0;
+               if (jso->o.c_string.len>=LEN_DIRECT_STRING_DATA) free(jso->o.c_string.str.ptr);
+               jso->o.c_string.str.ptr=dstbuf;
+       }
+       jso->o.c_string.len=len;
+       memcpy(dstbuf, (const void *)s, len);
+       dstbuf[len] = '\0';
+       return 1; 
+}
 
 /* json_object_array */
 
@@ -758,98 +1083,385 @@ static int json_object_array_to_json_string(struct json_object* jso,
                                             int flags)
 {
        int had_children = 0;
-       int ii;
-       sprintbuf(pb, "[");
+       size_t ii;
+
+       printbuf_strappend(pb, "[");
        if (flags & JSON_C_TO_STRING_PRETTY)
-               sprintbuf(pb, "\n");
+               printbuf_strappend(pb, "\n");
        for(ii=0; ii < json_object_array_length(jso); ii++)
        {
                struct json_object *val;
                if (had_children)
                {
-                       sprintbuf(pb, ",");
+                       printbuf_strappend(pb, ",");
                        if (flags & JSON_C_TO_STRING_PRETTY)
-                               sprintbuf(pb, "\n");
+                               printbuf_strappend(pb, "\n");
                }
                had_children = 1;
                if (flags & JSON_C_TO_STRING_SPACED)
-                       sprintbuf(pb, " ");
+                       printbuf_strappend(pb, " ");
                indent(pb, level + 1, flags);
                val = json_object_array_get_idx(jso, ii);
                if(val == NULL)
-                       sprintbuf(pb, "null");
+                       printbuf_strappend(pb, "null");
                else
-                       val->_to_json_string(val, pb, level+1, flags);
+                       if (val->_to_json_string(val, pb, level+1, flags) < 0)
+                               return -1;
        }
        if (flags & JSON_C_TO_STRING_PRETTY)
        {
                if (had_children)
-                       sprintbuf(pb, "\n");
+                       printbuf_strappend(pb, "\n");
                indent(pb,level,flags);
        }
 
        if (flags & JSON_C_TO_STRING_SPACED)
-               return sprintbuf(pb, " ]");
-       else
-               return sprintbuf(pb, "]");
+               return printbuf_strappend(pb, " ]");
+       return printbuf_strappend(pb, "]");
 }
 
 static void json_object_array_entry_free(void *data)
 {
-  json_object_put((struct json_object*)data);
+       json_object_put((struct json_object*)data);
 }
 
 static void json_object_array_delete(struct json_object* jso)
 {
-  array_list_free(jso->o.c_array);
-  json_object_generic_delete(jso);
+       array_list_free(jso->o.c_array);
+       json_object_generic_delete(jso);
 }
 
 struct json_object* json_object_new_array(void)
 {
-  struct json_object *jso = json_object_new(json_type_array);
-  if(!jso) return NULL;
-  jso->_delete = &json_object_array_delete;
-  jso->_to_json_string = &json_object_array_to_json_string;
-  jso->o.c_array = array_list_new(&json_object_array_entry_free);
-  return jso;
+       struct json_object *jso = json_object_new(json_type_array);
+       if (!jso)
+               return NULL;
+       jso->_delete = &json_object_array_delete;
+       jso->_to_json_string = &json_object_array_to_json_string;
+       jso->o.c_array = array_list_new(&json_object_array_entry_free);
+        if(jso->o.c_array == NULL)
+       {
+           free(jso);
+           return NULL;
+       }
+       return jso;
 }
 
-struct array_list* json_object_get_array(struct json_object *jso)
+struct array_list* json_object_get_array(const struct json_object *jso)
 {
-  if(!jso) return NULL;
-  switch(jso->o_type) {
-  case json_type_array:
-    return jso->o.c_array;
-  default:
-    return NULL;
-  }
+       if (!jso)
+               return NULL;
+       switch(jso->o_type)
+       {
+       case json_type_array:
+               return jso->o.c_array;
+       default:
+               return NULL;
+       }
 }
 
-void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *))
+void json_object_array_sort(struct json_object *jso,
+                           int(*sort_fn)(const void *, const void *))
 {
-  array_list_sort(jso->o.c_array, sort_fn);
+       assert(json_object_get_type(jso) == json_type_array);
+       array_list_sort(jso->o.c_array, sort_fn);
 }
 
-int json_object_array_length(struct json_object *jso)
+struct json_object* json_object_array_bsearch(
+               const struct json_object *key,
+               const struct json_object *jso,
+               int (*sort_fn)(const void *, const void *))
 {
-  return array_list_length(jso->o.c_array);
+       struct json_object **result;
+
+       assert(json_object_get_type(jso) == json_type_array);
+       result = (struct json_object **)array_list_bsearch(
+                       (const void **)(void *)&key, jso->o.c_array, sort_fn);
+
+       if (!result)
+               return NULL;
+       return *result;
+}
+
+size_t json_object_array_length(const struct json_object *jso)
+{
+       assert(json_object_get_type(jso) == json_type_array);
+       return array_list_length(jso->o.c_array);
 }
 
 int json_object_array_add(struct json_object *jso,struct json_object *val)
 {
-  return array_list_add(jso->o.c_array, val);
+       assert(json_object_get_type(jso) == json_type_array);
+       return array_list_add(jso->o.c_array, val);
 }
 
-int json_object_array_put_idx(struct json_object *jso, int idx,
+int json_object_array_put_idx(struct json_object *jso, size_t idx,
                              struct json_object *val)
 {
-  return array_list_put_idx(jso->o.c_array, idx, val);
+       assert(json_object_get_type(jso) == json_type_array);
+       return array_list_put_idx(jso->o.c_array, idx, val);
 }
 
-struct json_object* json_object_array_get_idx(struct json_object *jso,
-                                             int idx)
+int json_object_array_del_idx(struct json_object *jso, size_t idx, size_t count)
 {
-  return (struct json_object*)array_list_get_idx(jso->o.c_array, idx);
+       assert(json_object_get_type(jso) == json_type_array);
+       return array_list_del_idx(jso->o.c_array, idx, count);
+}
+
+struct json_object* json_object_array_get_idx(const struct json_object *jso,
+                                             size_t idx)
+{
+       assert(json_object_get_type(jso) == json_type_array);
+       return (struct json_object*)array_list_get_idx(jso->o.c_array, idx);
+}
+
+static int json_array_equal(struct json_object* jso1,
+                           struct json_object* jso2)
+{
+       size_t len, i;
+
+       len = json_object_array_length(jso1);
+       if (len != json_object_array_length(jso2))
+               return 0;
+
+       for (i = 0; i < len; i++) {
+               if (!json_object_equal(json_object_array_get_idx(jso1, i),
+                                      json_object_array_get_idx(jso2, i)))
+                       return 0;
+       }
+       return 1;
+}
+
+static int json_object_all_values_equal(struct json_object* jso1,
+                                       struct json_object* jso2)
+{
+       struct json_object_iter iter;
+       struct json_object *sub;
+
+       assert(json_object_get_type(jso1) == json_type_object);
+       assert(json_object_get_type(jso2) == json_type_object);
+       /* Iterate over jso1 keys and see if they exist and are equal in jso2 */
+        json_object_object_foreachC(jso1, iter) {
+               if (!lh_table_lookup_ex(jso2->o.c_object, (void*)iter.key,
+                                       (void**)(void *)&sub))
+                       return 0;
+               if (!json_object_equal(iter.val, sub))
+                       return 0;
+        }
+
+       /* Iterate over jso2 keys to see if any exist that are not in jso1 */
+        json_object_object_foreachC(jso2, iter) {
+               if (!lh_table_lookup_ex(jso1->o.c_object, (void*)iter.key,
+                                       (void**)(void *)&sub))
+                       return 0;
+        }
+
+       return 1;
+}
+
+int json_object_equal(struct json_object* jso1, struct json_object* jso2)
+{
+       if (jso1 == jso2)
+               return 1;
+
+       if (!jso1 || !jso2)
+               return 0;
+
+       if (jso1->o_type != jso2->o_type)
+               return 0;
+
+       switch(jso1->o_type) {
+               case json_type_boolean:
+                       return (jso1->o.c_boolean == jso2->o.c_boolean);
+
+               case json_type_double:
+                       return (jso1->o.c_double == jso2->o.c_double);
+
+               case json_type_int:
+                       return (jso1->o.c_int64 == jso2->o.c_int64);
+
+               case json_type_string:
+                       return (jso1->o.c_string.len == jso2->o.c_string.len &&
+                               memcmp(get_string_component(jso1),
+                                      get_string_component(jso2),
+                                      jso1->o.c_string.len) == 0);
+
+               case json_type_object:
+                       return json_object_all_values_equal(jso1, jso2);
+
+               case json_type_array:
+                       return json_array_equal(jso1, jso2);
+
+               case json_type_null:
+                       return 1;
+       };
+
+       return 0;
+}
+
+static int json_object_copy_serializer_data(struct json_object *src, struct json_object *dst)
+{
+       if (!src->_userdata && !src->_user_delete)
+               return 0;
+
+       if (dst->_to_json_string == json_object_userdata_to_json_string)
+       {
+               dst->_userdata = strdup(src->_userdata);
+       }
+       // else if ... other supported serializers ...
+       else
+       {
+               _json_c_set_last_err("json_object_deep_copy: unable to copy unknown serializer data: %p\n", dst->_to_json_string);
+               return -1;
+       }
+       dst->_user_delete = src->_user_delete;
+       return 0;
+}
+
+
+/**
+ * The default shallow copy implementation.  Simply creates a new object of the same
+ * type but does *not* copy over _userdata nor retain any custom serializer.
+ * If custom serializers are in use, json_object_deep_copy() must be passed a shallow copy
+ * implementation that is aware of how to copy them.
+ *
+ * This always returns -1 or 1.  It will never return 2 since it does not copy the serializer.
+ */
+int json_c_shallow_copy_default(json_object *src, json_object *parent, const char *key, size_t index, json_object **dst)
+{
+       switch (src->o_type) {
+       case json_type_boolean:
+               *dst = json_object_new_boolean(src->o.c_boolean);
+               break;
+
+       case json_type_double:
+               *dst = json_object_new_double(src->o.c_double);
+               break;
+
+       case json_type_int:
+               *dst = json_object_new_int64(src->o.c_int64);
+               break;
+
+       case json_type_string:
+               *dst = json_object_new_string(get_string_component(src));
+               break;
+
+       case json_type_object:
+               *dst = json_object_new_object();
+               break;
+
+       case json_type_array:
+               *dst = json_object_new_array();
+               break;
+
+       default:
+               errno = EINVAL;
+               return -1;
+       }
+
+       if (!*dst) {
+               errno = ENOMEM;
+               return -1;
+       }
+       (*dst)->_to_json_string = src->_to_json_string;
+       // _userdata and _user_delete are copied later
+       return 1;
+}
+
+/*
+ * The actual guts of json_object_deep_copy(), with a few additional args
+ * needed so we can keep track of where we are within the object tree.
+ *
+ * Note: caller is responsible for freeing *dst if this fails and returns -1.
+ */
+static int json_object_deep_copy_recursive(struct json_object *src, struct json_object *parent, const char *key_in_parent, size_t index_in_parent, struct json_object **dst, json_c_shallow_copy_fn *shallow_copy)
+{
+       struct json_object_iter iter;
+       size_t src_array_len, ii;
+
+       int shallow_copy_rc = 0;
+       shallow_copy_rc = shallow_copy(src, parent, key_in_parent, index_in_parent, dst);
+       /* -1=error, 1=object created ok, 2=userdata set */
+       if (shallow_copy_rc < 1)
+       {
+               errno = EINVAL;
+               return -1;
+       }
+       assert(*dst != NULL);
+
+       switch (src->o_type) {
+       case json_type_object:
+               json_object_object_foreachC(src, iter) {
+                       struct json_object *jso = NULL;
+                       /* This handles the `json_type_null` case */
+                       if (!iter.val)
+                               jso = NULL;
+                       else if (json_object_deep_copy_recursive(iter.val, src, iter.key, -1, &jso, shallow_copy) < 0)
+                       {
+                               json_object_put(jso);
+                               return -1;
+                       }
+
+                       if (json_object_object_add(*dst, iter.key, jso) < 0)
+                       {
+                               json_object_put(jso);
+                               return -1;
+                       }
+               }
+               break;
+
+       case json_type_array:
+               src_array_len = json_object_array_length(src);
+               for (ii = 0; ii < src_array_len; ii++) {
+                       struct json_object *jso = NULL;
+                       struct json_object *jso1 = json_object_array_get_idx(src, ii);
+                       /* This handles the `json_type_null` case */
+                       if (!jso1)
+                               jso = NULL;
+                       else if (json_object_deep_copy_recursive(jso1, src, NULL, ii, &jso, shallow_copy) < 0)
+                       {
+                               json_object_put(jso);
+                               return -1;
+                       }
+
+                       if (json_object_array_add(*dst, jso) < 0)
+                       {
+                               json_object_put(jso);
+                               return -1;
+                       }
+               }
+               break;
+
+       default:
+               break;
+               /* else, nothing to do, shallow_copy already did. */
+       }
+
+       if (shallow_copy_rc != 2)
+               return json_object_copy_serializer_data(src, *dst);
+
+       return 0;
+}
+
+int json_object_deep_copy(struct json_object *src, struct json_object **dst, json_c_shallow_copy_fn *shallow_copy)
+{
+       int rc;
+
+       /* Check if arguments are sane ; *dst must not point to a non-NULL object */
+       if (!src || !dst || *dst) {
+               errno = EINVAL;
+               return -1;
+       }
+
+       if (shallow_copy == NULL)
+               shallow_copy = json_c_shallow_copy_default;
+
+       rc = json_object_deep_copy_recursive(src, NULL, NULL, -1, dst, shallow_copy);
+       if (rc < 0) {
+               json_object_put(*dst);
+               *dst = NULL;
+       }
+
+       return rc;
 }
 
index e6c6a4f..283eb95 100644 (file)
  *
  */
 
+/**
+ * @file
+ * @brief Core json-c API.  Start here, or with json_tokener.h
+ */
 #ifndef _json_object_h_
 #define _json_object_h_
 
 #define THIS_FUNCTION_IS_DEPRECATED(func) func __attribute__ ((deprecated))
 #elif defined(_MSC_VER)
 #define THIS_FUNCTION_IS_DEPRECATED(func) __declspec(deprecated) func
+#elif defined(__clang__)
+#define THIS_FUNCTION_IS_DEPRECATED(func) func __deprecated
 #else
 #define THIS_FUNCTION_IS_DEPRECATED(func) func
 #endif
 
+#if defined(_MSC_VER) 
+#define JSON_EXPORT __declspec(dllexport)
+#else
+#define JSON_EXPORT extern
+#endif
+
+#include <stddef.h>
 #include "json_inttypes.h"
+#include "printbuf.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -51,36 +65,93 @@ extern "C" {
  */
 #define JSON_C_TO_STRING_PRETTY     (1<<1)
 /**
+ * A flag for the json_object_to_json_string_ext() and
+ * json_object_to_file_ext() functions which causes
+ * the output to be formatted.
+ *
+ * Instead of a "Two Space Tab" this gives a single tab character.
+ */
+#define JSON_C_TO_STRING_PRETTY_TAB (1<<3)
+/**
  * A flag to drop trailing zero for float values
  */
 #define JSON_C_TO_STRING_NOZERO     (1<<2)
 
+/**
+ * Don't escape forward slashes.
+ */
+#define JSON_C_TO_STRING_NOSLASHESCAPE (1<<4)
+
+/**
+ * A flag for the json_object_object_add_ex function which
+ * causes the value to be added without a check if it already exists.
+ * Note: it is the responsibilty of the caller to ensure that no
+ * key is added multiple times. If this is done, results are
+ * unpredictable. While this option is somewhat dangerous, it
+ * permits potentially large performance savings in code that
+ * knows for sure the key values are unique (e.g. because the
+ * code adds a well-known set of constant key values).
+ */
+#define JSON_C_OBJECT_ADD_KEY_IS_NEW (1<<1)
+/**
+ * A flag for the json_object_object_add_ex function which
+ * flags the key as being constant memory. This means that
+ * the key will NOT be copied via strdup(), resulting in a
+ * potentially huge performance win (malloc, strdup and
+ * free are usually performance hogs). It is acceptable to
+ * use this flag for keys in non-constant memory blocks if
+ * the caller ensure that the memory holding the key lives
+ * longer than the corresponding json object. However, this
+ * is somewhat dangerous and should only be done if really
+ * justified.
+ * The general use-case for this flag is cases where the
+ * key is given as a real constant value in the function
+ * call, e.g. as in
+ *   json_object_object_add_ex(obj, "ip", json,
+ *       JSON_C_OBJECT_KEY_IS_CONSTANT);
+ */
+#define JSON_C_OBJECT_KEY_IS_CONSTANT (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;
+/**
+ * Set the global value of an option, which will apply to all
+ * current and future threads that have not set a thread-local value.
+ *
+ * @see json_c_set_serialization_double_format
+ */
+#define JSON_C_OPTION_GLOBAL (0)
+/**
+ * Set a thread-local value of an option, overriding the global value.
+ * This will fail if json-c is not compiled with threading enabled, and
+ * with the __thread specifier (or equivalent) available.
+ *
+ * @see json_c_set_serialization_double_format
+ */
+#define JSON_C_OPTION_THREAD (1)
 
-/* CAW: added for ANSI C iteration correctness */
+/**
+ * A structure to use with json_object_object_foreachC() loops.
+ * Contains key, val and entry members.
+ */
 struct json_object_iter
 {
        char *key;
        struct json_object *val;
        struct lh_entry *entry;
 };
-
-/* forward structure definitions */
+typedef struct json_object_iter json_object_iter;
 
 typedef int json_bool;
-typedef struct printbuf printbuf;
-typedef struct lh_table lh_table;
-typedef struct array_list array_list;
+
+/**
+ * @brief The core type for all type of JSON objects handled by json-c
+ */
 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.
@@ -105,18 +176,18 @@ typedef enum json_type {
   json_type_int,
   json_type_object,
   json_type_array,
-  json_type_string,
+  json_type_string
 } json_type;
 
 /* reference counting functions */
 
 /**
- * Increment the reference count of json_object, thereby grabbing shared 
+ * 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);
+JSON_EXPORT struct json_object* json_object_get(struct json_object *obj);
 
 /**
  * Decrement the reference count of json_object and free if it reaches zero.
@@ -126,7 +197,7 @@ extern struct json_object* json_object_get(struct json_object *obj);
  * @param obj the json_object instance
  * @returns 1 if the object was freed.
  */
-int json_object_put(struct json_object *obj);
+JSON_EXPORT int json_object_put(struct json_object *obj);
 
 /**
  * Check if the json_object is of a given type
@@ -138,9 +209,9 @@ int json_object_put(struct json_object *obj);
      json_type_int,
      json_type_object,
      json_type_array,
-     json_type_string,
+     json_type_string
  */
-extern int json_object_is_type(struct json_object *obj, enum json_type type);
+JSON_EXPORT int json_object_is_type(const struct json_object *obj, enum json_type type);
 
 /**
  * Get the type of the json_object.  See also json_type_to_name() to turn this
@@ -154,39 +225,90 @@ extern int json_object_is_type(struct json_object *obj, enum json_type type);
      json_type_int,
      json_type_object,
      json_type_array,
-     json_type_string,
+     json_type_string
  */
-extern enum json_type json_object_get_type(struct json_object *obj);
+JSON_EXPORT enum json_type json_object_get_type(const struct json_object *obj);
 
 
 /** Stringify object to json format.
  * Equivalent to json_object_to_json_string_ext(obj, JSON_C_TO_STRING_SPACED)
+ * The pointer you get is an internal of your json object. You don't
+ * have to free it, later use of json_object_put() should be sufficient.
+ * If you can not ensure there's no concurrent access to *obj use
+ * strdup().
  * @param obj the json_object instance
  * @returns a string in JSON format
  */
-extern const char* json_object_to_json_string(struct json_object *obj);
+JSON_EXPORT const char* json_object_to_json_string(struct json_object *obj);
 
 /** Stringify object to json format
+ * @see json_object_to_json_string() for details on how to free string.
  * @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
+JSON_EXPORT const char* json_object_to_json_string_ext(struct json_object *obj, int
 flags);
 
+/** Stringify object to json format
+ * @see json_object_to_json_string() for details on how to free string.
+ * @param obj the json_object instance
+ * @param flags formatting options, see JSON_C_TO_STRING_PRETTY and other constants
+ * @param length a pointer where, if not NULL, the length (without null) is stored
+ * @returns a string in JSON format and the length if not NULL
+ */
+JSON_EXPORT const char* json_object_to_json_string_length(struct json_object *obj, int
+flags, size_t *length);
+
+/**
+ * Returns the userdata set by json_object_set_userdata() or
+ * json_object_set_serializer()
+ *
+ * @param jso the object to return the userdata for
+ */
+JSON_EXPORT void* json_object_get_userdata(json_object *jso);
+
+/**
+ * Set an opaque userdata value for an object
+ *
+ * The userdata can be retrieved using json_object_get_userdata().
+ *
+ * If custom userdata is already set on this object, any existing user_delete
+ * function is called before the new one is set.
+ *
+ * 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)
+ *
+ * Note: Objects created by parsing strings may have custom serializers set
+ * which expect the userdata to contain specific data (due to use of
+ * json_object_new_double_s()). In this case, json_object_set_serialiser() with
+ * NULL as to_string_func should be used instead to set the userdata and reset
+ * the serializer to its default value.
+ *
+ * @param jso the object to set the userdata for
+ * @param userdata an optional opaque cookie
+ * @param user_delete an optional function from freeing userdata
+ */
+JSON_EXPORT void json_object_set_userdata(json_object *jso, void *userdata,
+                                    json_object_delete_fn *user_delete);
+
 /**
  * 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 custom userdata 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.
+ * If to_string_func is NULL the default behaviour is reset (but the userdata
+ * and user_delete fields are still set).
  *
- * 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 userdata parameter is optional and may be passed as NULL. It can be used
+ * to provide additional data for to_string_func to use. 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
@@ -195,16 +317,30 @@ flags);
  * 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)
  *
+ * Note that the userdata is the same as set by json_object_set_userdata(), so
+ * care must be taken not to overwrite the value when both a custom serializer
+ * and json_object_set_userdata() are used.
+ *
  * @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,
+JSON_EXPORT 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);
 
+#ifdef __clang__
+/*
+ * Clang doesn't pay attention to the parameters defined in the
+ * function typedefs used here, so turn off spurious doc warnings.
+ * {
+ */
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdocumentation"
+#endif
+
 /**
  * Simply call free on the userdata pointer.
  * Can be used with json_object_set_serializer().
@@ -225,6 +361,11 @@ json_object_delete_fn json_object_free_userdata;
  */
 json_object_to_json_string_fn json_object_userdata_to_json_string;
 
+#ifdef __clang__
+/* } */
+#pragma clang diagnostic pop
+#endif
+
 
 /* object type methods */
 
@@ -238,18 +379,18 @@ json_object_to_json_string_fn json_object_userdata_to_json_string;
  *
  * @returns a json_object of type json_type_object
  */
-extern struct json_object* json_object_new_object(void);
+JSON_EXPORT 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);
+JSON_EXPORT struct lh_table* json_object_get_object(const 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);
+JSON_EXPORT int json_object_object_length(const struct json_object* obj);
 
 /** Add an object field to a json_object of type json_type_object
  *
@@ -266,11 +407,37 @@ extern int json_object_object_length(struct json_object* obj);
  * @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
+ *
+ * @return On success, <code>0</code> is returned.
+ *     On error, a negative value is returned.
  */
-extern void json_object_object_add(struct json_object* obj, const char *key,
+JSON_EXPORT int 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
+/** Add an object field to a json_object of type json_type_object
+ *
+ * The semantics are identical to json_object_object_add, except that an
+ * additional flag fields gives you more control over some detail aspects
+ * of processing. See the description of JSON_C_OBJECT_ADD_* flags for more
+ * details.
+ *
+ * @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
+ * @param opts process-modifying options. To specify multiple options, use 
+ *             arithmetic or (OPT1|OPT2)
+ */
+JSON_EXPORT int json_object_object_add_ex(struct json_object* obj,
+                               const char *const key,
+                               struct json_object *const val,
+                               const unsigned opts);
+
+/** Get the json_object associate with a given object field.
+ * Deprecated/discouraged: used json_object_object_get_ex instead.
+ *
+ * This returns NULL if the field is found but its value is null, or if
+ *  the field is not found, or if obj is not a json_type_object.  If you
+ *  need to distinguis between these cases, use json_object_object_get_ex().
  *
  * *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
@@ -285,14 +452,13 @@ extern void json_object_object_add(struct json_object* obj, const char *key,
  * @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
  */
-THIS_FUNCTION_IS_DEPRECATED(extern struct json_object* json_object_object_get(struct json_object* obj,
-                                                 const char *key));
+JSON_EXPORT struct json_object* json_object_object_get(const struct json_object* obj,
+                                                 const char *key);
 
-/** Get the json_object associated with a given object field.  
+/** Get the json_object associated with a given object field.
  *
- * This returns true if the key is found, false in all other cases (including 
+ * 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
@@ -302,15 +468,15 @@ THIS_FUNCTION_IS_DEPRECATED(extern struct json_object* json_object_object_get(st
  *
  * @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 
+ * @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);
+JSON_EXPORT json_bool json_object_object_get_ex(const struct json_object* obj,
+                                           const char *key,
+                                           struct json_object **value);
 
 /** Delete the given json_object field
  *
@@ -321,7 +487,7 @@ extern json_bool json_object_object_get_ex(struct json_object* obj,
  * @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);
+JSON_EXPORT void json_object_object_del(struct json_object* obj, const char *key);
 
 /**
  * Iterate through all keys and values of an object.
@@ -340,11 +506,11 @@ extern void json_object_object_del(struct json_object* obj, const char *key);
 
 # define json_object_object_foreach(obj,key,val) \
        char *key = NULL; \
-       struct json_object *val = NULL; \
+       struct json_object *val __attribute__((__unused__)) = NULL; \
        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; \
+                       key = (char*)lh_entry_k(entry ## key); \
+                       val = (struct json_object*)lh_entry_v(entry ## key); \
                        entry_next ## key = entry ## key->next; \
                } ; entry ## key; }); \
                entry ## key = entry_next ## key )
@@ -358,8 +524,8 @@ extern void json_object_object_del(struct json_object* obj, const char *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, \
+                       key = (char*)lh_entry_k(entry ## key), \
+                       val = (struct json_object*)lh_entry_v(entry ## key), \
                        entry_next ## key = entry ## key->next, \
                        entry ## key) : 0); \
                entry ## key = entry_next ## key)
@@ -368,39 +534,60 @@ extern void json_object_object_del(struct json_object* obj, const char *key);
 
 /** Iterate through all keys and values of an object (ANSI C Safe)
  * @param obj the json_object instance
- * @param iter the object iterator
+ * @param iter the object iterator, use type json_object_iter
  */
 #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)
+ for(iter.entry = json_object_get_object(obj)->head; \
+     (iter.entry ? (iter.key = (char*)lh_entry_k(iter.entry), iter.val = (struct json_object*)lh_entry_v(iter.entry), 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);
+JSON_EXPORT 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);
+JSON_EXPORT struct array_list* json_object_get_array(const 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);
+JSON_EXPORT size_t json_object_array_length(const 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
+* to sort_fn
 *
-* @param obj the json_object instance
+* @param jso 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 *));
+JSON_EXPORT void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *));
+
+/** Binary search a sorted array for a specified key object.
+ *
+ * It depends on your compare function what's sufficient as a key.
+ * Usually you create some dummy object with the parameter compared in
+ * it, to identify the right item you're actually looking for.
+ *
+ * @see json_object_array_sort() for hints on the compare function.
+ *
+ * @param key a dummy json_object with the right key
+ * @param jso the array object we're searching
+ * @param sort_fn the sort/compare function
+ *
+ * @return the wanted json_object instance
+ */
+JSON_EXPORT struct json_object* json_object_array_bsearch(
+               const struct json_object *key,
+               const 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
  *
@@ -411,7 +598,7 @@ extern void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const
  * @param obj the json_object instance
  * @param val the json_object to be added
  */
-extern int json_object_array_add(struct json_object *obj,
+JSON_EXPORT 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)
@@ -429,7 +616,7 @@ extern int json_object_array_add(struct json_object *obj,
  * @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,
+JSON_EXPORT int json_object_array_put_idx(struct json_object *obj, size_t idx,
                                     struct json_object *val);
 
 /** Get the element at specificed index of the array (a json_object of type json_type_array)
@@ -437,16 +624,29 @@ extern int json_object_array_put_idx(struct json_object *obj, int idx,
  * @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_EXPORT struct json_object* json_object_array_get_idx(const struct json_object *obj,
+                                                    size_t idx);
+
+/** Delete an elements from a specified index in an array (a json_object of type json_type_array)
+ *
+ * The reference count will be decremented for each of the deleted objects.  If there
+ * are no more owners of an element that is being deleted, then the value is 
+ * freed.  Otherwise, the reference to the value will remain in memory.
+ *
+ * @param obj the json_object instance
+ * @param idx the index to start deleting elements at
+ * @param count the number of elements to delete
+ * @returns 0 if the elements were successfully deleted
+ */
+JSON_EXPORT int json_object_array_del_idx(struct json_object *obj, size_t idx, size_t count);
 
 /* 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)
+ * @param b a json_bool TRUE or FALSE (1 or 0)
  * @returns a json_object of type json_type_boolean
  */
-extern struct json_object* json_object_new_boolean(json_bool b);
+JSON_EXPORT struct json_object* json_object_new_boolean(json_bool b);
 
 /** Get the json_bool value of a json_object
  *
@@ -459,7 +659,20 @@ extern struct json_object* json_object_new_boolean(json_bool b);
  * @param obj the json_object instance
  * @returns a json_bool
  */
-extern json_bool json_object_get_boolean(struct json_object *obj);
+JSON_EXPORT json_bool json_object_get_boolean(const struct json_object *obj);
+
+
+/** Set the json_bool value of a json_object
+ * 
+ * The type of obj is checked to be a json_type_boolean and 0 is returned 
+ * if it is not without any further actions. If type of obj is json_type_boolean
+ * the obect value is chaned to new_value
+ *
+ * @param obj the json_object instance
+ * @param new_value the value to be set
+ * @returns 1 if value is set correctly, 0 otherwise
+ */
+JSON_EXPORT int json_object_set_boolean(struct json_object *obj,json_bool new_value);
 
 
 /* int type methods */
@@ -470,14 +683,14 @@ extern json_bool json_object_get_boolean(struct json_object *obj);
  * @param i the integer
  * @returns a json_object of type json_type_int
  */
-extern struct json_object* json_object_new_int(int32_t i);
+JSON_EXPORT 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);
+JSON_EXPORT struct json_object* json_object_new_int64(int64_t i);
 
 
 /** Get the int value of a json_object
@@ -494,7 +707,36 @@ extern struct json_object* json_object_new_int64(int64_t i);
  * @param obj the json_object instance
  * @returns an int
  */
-extern int32_t json_object_get_int(struct json_object *obj);
+JSON_EXPORT int32_t json_object_get_int(const struct json_object *obj);
+
+/** Set the int value of a json_object
+ * 
+ * The type of obj is checked to be a json_type_int and 0 is returned 
+ * if it is not without any further actions. If type of obj is json_type_int
+ * the obect value is changed to new_value
+ *
+ * @param obj the json_object instance
+ * @param new_value the value to be set
+ * @returns 1 if value is set correctly, 0 otherwise
+ */
+JSON_EXPORT int json_object_set_int(struct json_object *obj,int new_value);
+
+/** Increment a json_type_int object by the given amount, which may be negative.
+ *
+ * If the type of obj is not json_type_int then 0 is returned with no further
+ * action taken.
+ * If the addition would result in a overflow, the object value
+ * is set to INT64_MAX.
+ * If the addition would result in a underflow, the object value
+ * is set to INT64_MIN.
+ * Neither overflow nor underflow affect the return value.
+ *
+ * @param obj the json_object instance
+ * @param val the value to add
+ * @returns 1 if the increment succeded, 0 otherwise
+ */
+JSON_EXPORT int json_object_int_inc(struct json_object *obj, int64_t val);
+
 
 /** Get the int value of a json_object
  *
@@ -509,16 +751,31 @@ extern int32_t json_object_get_int(struct json_object *obj);
  * @param obj the json_object instance
  * @returns an int64
  */
-extern int64_t json_object_get_int64(struct json_object *obj);
+JSON_EXPORT int64_t json_object_get_int64(const struct json_object *obj);
 
 
+/** Set the int64_t value of a json_object
+ * 
+ * The type of obj is checked to be a json_type_int and 0 is returned 
+ * if it is not without any further actions. If type of obj is json_type_int
+ * the obect value is chaned to new_value
+ *
+ * @param obj the json_object instance
+ * @param new_value the value to be set
+ * @returns 1 if value is set correctly, 0 otherwise
+ */
+JSON_EXPORT int json_object_set_int64(struct json_object *obj,int64_t new_value);
+
 /* double type methods */
 
 /** Create a new empty json_object of type json_type_double
+ *
+ * @see json_object_double_to_json_string() for how to set a custom format string.
+ *
  * @param d the double
  * @returns a json_object of type json_type_double
  */
-extern struct json_object* json_object_new_double(double d);
+JSON_EXPORT struct json_object* json_object_new_double(double d);
 
 /**
  * Create a new json_object of type json_type_double, using
@@ -528,20 +785,65 @@ extern struct json_object* json_object_new_double(double d);
  * 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.
+ * Notes:
+ *
+ * This is used by json_tokener_parse_ex() to allow for
+ * an exact re-serialization of a parsed object.
+ *
+ * The userdata field is used to store the string representation, so it
+ * can't be used for other data if this function is used.
  *
  * 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)
+ *   json_object_set_serializer(jso, 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);
+JSON_EXPORT struct json_object* json_object_new_double_s(double d, const char *ds);
+
+/**
+ * Set a global or thread-local json-c option, depending on whether
+ *  JSON_C_OPTION_GLOBAL or JSON_C_OPTION_THREAD is passed.
+ * Thread-local options default to undefined, and inherit from the global
+ *  value, even if the global value is changed after the thread is created.
+ * Attempting to set thread-local options when threading is not compiled in
+ *  will result in an error.  Be sure to check the return value.
+ *
+ * double_format is a "%g" printf format, such as "%.20g"
+ *
+ * @return -1 on errors, 0 on success.
+ */
+int json_c_set_serialization_double_format(const char *double_format, int global_or_thread);
+
+
+
+/** Serialize a json_object of type json_type_double to a string.
+ *
+ * This function isn't meant to be called directly. Instead, you can set a
+ * custom format string for the serialization of this double using the
+ * following call (where "%.17g" actually is the default):
+ *
+ * @code
+ *   jso = json_object_new_double(d);
+ *   json_object_set_serializer(jso, json_object_double_to_json_string,
+ *       "%.17g", NULL);
+ * @endcode
+ *
+ * @see printf(3) man page for format strings
+ *
+ * @param jso The json_type_double object that is serialized.
+ * @param pb The destination buffer.
+ * @param level Ignored.
+ * @param flags Ignored.
+ */
+JSON_EXPORT int json_object_double_to_json_string(struct json_object* jso,
+                                            struct printbuf *pb,
+                                            int level,
+                                            int flags);
 
 /** Get the double floating point value of a json_object
  *
@@ -566,7 +868,21 @@ extern struct json_object* json_object_new_double_s(double d, const char *ds);
  * @param obj the json_object instance
  * @returns a double floating point number
  */
-extern double json_object_get_double(struct json_object *obj);
+JSON_EXPORT double json_object_get_double(const struct json_object *obj);
+
+
+/** Set the double value of a json_object
+ * 
+ * The type of obj is checked to be a json_type_double and 0 is returned 
+ * if it is not without any further actions. If type of obj is json_type_double
+ * the obect value is chaned to new_value
+ *
+ * @param obj the json_object instance
+ * @param new_value the value to be set
+ * @returns 1 if value is set correctly, 0 otherwise
+ */
+JSON_EXPORT int json_object_set_double(struct json_object *obj,double new_value);
+
 
 
 /* string type methods */
@@ -578,22 +894,27 @@ extern double json_object_get_double(struct json_object *obj);
  * @param s the string
  * @returns a json_object of type json_type_string
  */
-extern struct json_object* json_object_new_string(const char *s);
+JSON_EXPORT struct json_object* json_object_new_string(const char *s);
 
-extern struct json_object* json_object_new_string_len(const char *s, int len);
+JSON_EXPORT 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.
+ * If the passed object is of type json_type_null (i.e. obj == NULL),
+ * NULL is returned.
+ *
+ * If the passed object of type json_type_string, the string contents
+ * are returned.
+ *
+ * Otherwise 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
+ * @returns a string or NULL
  */
-extern const char* json_object_get_string(struct json_object *obj);
+JSON_EXPORT const char* json_object_get_string(struct json_object *obj);
 
 /** Get the string length of a json_object
  *
@@ -603,8 +924,98 @@ extern const char* json_object_get_string(struct json_object *obj);
  * @param obj the json_object instance
  * @returns int
  */
-extern int json_object_get_string_len(struct json_object *obj);
+JSON_EXPORT int json_object_get_string_len(const struct json_object *obj);
+
+
+/** Set the string value of a json_object with zero terminated strings
+ * equivalent to json_object_set_string_len (obj, new_value, strlen(new_value))
+ * @returns 1 if value is set correctly, 0 otherwise
+ */
+JSON_EXPORT int json_object_set_string(json_object* obj, const char* new_value);
+
+/** Set the string value of a json_object str
+ * 
+ * The type of obj is checked to be a json_type_string and 0 is returned 
+ * if it is not without any further actions. If type of obj is json_type_string
+ * the obect value is chaned to new_value
+ *
+ * @param obj the json_object instance
+ * @param new_value the value to be set; Since string legth is given in len this need not be zero terminated
+ * @param len the length of new_value
+ * @returns 1 if value is set correctly, 0 otherwise
+ */
+JSON_EXPORT int json_object_set_string_len(json_object* obj, const char* new_value, int len);
+
+/** Check if two json_object's are equal
+ *
+ * If the passed objects are equal 1 will be returned.
+ * Equality is defined as follows:
+ * - json_objects of different types are never equal
+ * - json_objects of the same primitive type are equal if the
+ *   c-representation of their value is equal
+ * - json-arrays are considered equal if all values at the same
+ *   indices are equal (same order)
+ * - Complex json_objects are considered equal if all
+ *   contained objects referenced by their key are equal,
+ *   regardless their order.
+ *
+ * @param obj1 the first json_object instance
+ * @param obj2 the second json_object instance
+ * @returns whether both objects are equal or not
+ */
+JSON_EXPORT int json_object_equal(struct json_object *obj1,
+                            struct json_object *obj2);
+
+/**
+ * Perform a shallow copy of src into *dst as part of an overall json_object_deep_copy().
+ *
+ * If src is part of a containing object or array, parent will be non-NULL,
+ * and key or index will be provided.
+ * When shallow_copy is called *dst will be NULL, and must be non-NULL when it returns.
+ * src will never be NULL.
+ *
+ * If shallow_copy sets the serializer on an object, return 2 to indicate to 
+ *  json_object_deep_copy that it should not attempt to use the standard userdata
+ *  copy function.
+ *
+ * @return On success 1 or 2, -1 on errors
+ */
+typedef int (json_c_shallow_copy_fn)(json_object *src, json_object *parent, const char *key, size_t index, json_object **dst);
+
+/**
+ * The default shallow copy implementation for use with json_object_deep_copy().
+ * This simply calls the appropriate json_object_new_<type>() function and 
+ * copies over the serializer function (_to_json_string internal field of
+ * the json_object structure) but not any _userdata or _user_delete values.
+ *
+ * If you're writing a custom shallow_copy function, perhaps because you're using
+ * your own custom serializer, you can call this first to create the new object
+ * before customizing it with json_object_set_serializer().
+ *
+ * @return 1 on success, -1 on errors, but never 2.
+ */
+json_c_shallow_copy_fn json_c_shallow_copy_default;
+
+/**
+ * Copy the contents of the JSON object.
+ * The destination object must be initialized to NULL,
+ * to make sure this function won't overwrite an existing JSON object.
+ *
+ * This does roughly the same thing as
+ * `json_tokener_parse(json_object_get_string(src))`.
+ *
+ * @param src source JSON object whose contents will be copied
+ * @param dst pointer to the destination object where the contents of `src`;
+ *            make sure this pointer is initialized to NULL
+ * @param shallow_copy an optional function to copy individual objects, needed
+ *                     when custom serializers are in use.  See also
+ *                     json_object set_serializer.
+ *
+ * @returns 0 if the copy went well, -1 if an error occured during copy
+ *          or if the destination pointer is non-NULL
+ */
 
+JSON_EXPORT int json_object_deep_copy(struct json_object *src, struct json_object **dst, json_c_shallow_copy_fn *shallow_copy); 
 #ifdef __cplusplus
 }
 #endif
index 7066649..f8d69ab 100644 (file)
@@ -7,11 +7,6 @@
 * 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
-*         implementation corrects that by abstracting the
-*         private json-c details.
-*
 *******************************************************************************
 */
 
@@ -105,7 +100,7 @@ json_object_iter_next(struct json_object_iterator* iter)
     JASSERT(NULL != iter);
     JASSERT(kObjectEndIterValue != iter->opaque_);
 
-    iter->opaque_ = ((struct lh_entry *)iter->opaque_)->next;
+    iter->opaque_ = ((const struct lh_entry *)iter->opaque_)->next;
 }
 
 
@@ -118,7 +113,7 @@ json_object_iter_peek_name(const struct json_object_iterator* iter)
     JASSERT(NULL != iter);
     JASSERT(kObjectEndIterValue != iter->opaque_);
 
-    return (const char*)(((struct lh_entry *)iter->opaque_)->k);
+    return (const char*)(((const struct lh_entry *)iter->opaque_)->k);
 }
 
 
@@ -131,7 +126,7 @@ json_object_iter_peek_value(const struct json_object_iterator* iter)
     JASSERT(NULL != iter);
     JASSERT(kObjectEndIterValue != iter->opaque_);
 
-    return (struct json_object*)(((struct lh_entry *)iter->opaque_)->v);
+    return (struct json_object*)lh_entry_v((const struct lh_entry *)iter->opaque_);
 }
 
 
index 44c9fb2..f226cbd 100644 (file)
@@ -7,10 +7,11 @@
 * 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.
+* @brief  An API for iterating over json_type_object objects,
+*         styled to be familiar to C++ programmers.
+*         Unlike json_object_object_foreach() and
+*         json_object_object_foreachC(), this avoids the need to expose
+*         json-c internals like lh_entry.
 *
 * API attributes: <br>
 *   * Thread-safe: NO<br>
index 5ed791b..53be70d 100644 (file)
@@ -9,6 +9,10 @@
  *
  */
 
+/**
+ * @file
+ * @brief Do not use, json-c internal, may be changed or removed at any time.
+ */
 #ifndef _json_object_private_h_
 #define _json_object_private_h_
 
@@ -16,6 +20,8 @@
 extern "C" {
 #endif
 
+#define LEN_DIRECT_STRING_DATA 32 /**< how many bytes are directly stored in json_object for strings? */
+
 typedef void (json_object_private_delete_fn)(struct json_object *o);
 
 struct json_object
@@ -32,7 +38,13 @@ struct json_object
     struct lh_table *c_object;
     struct array_list *c_array;
     struct {
-        char *str;
+       union {
+               /* optimize: if we have small strings, we can store them
+                * directly. This saves considerable CPU cycles AND memory.
+                */
+               char *ptr;
+               char data[LEN_DIRECT_STRING_DATA];
+       } str;
         int len;
     } c_string;
   } o;
@@ -40,6 +52,11 @@ struct json_object
   void *_userdata;
 };
 
+void _json_c_set_last_err(const char *err_fmt, ...);
+
+extern const char *json_number_chars;
+extern const char *json_hex_chars;
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/json_pointer.c b/json_pointer.c
new file mode 100644 (file)
index 0000000..2b2a9ef
--- /dev/null
@@ -0,0 +1,327 @@
+/*
+ * Copyright (c) 2016 Alexandru Ardelean.
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the MIT license. See COPYING for details.
+ *
+ */
+
+#include "config.h"
+
+#include "strerror_override.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "json_pointer.h"
+#include "strdup_compat.h"
+#include "vasprintf_compat.h"
+
+/**
+ * JavaScript Object Notation (JSON) Pointer
+ *   RFC 6901 - https://tools.ietf.org/html/rfc6901
+ */
+
+static void string_replace_all_occurrences_with_char(char *s, const char *occur, char repl_char)
+{
+       int slen = strlen(s);
+       int skip = strlen(occur) - 1; /* length of the occurence, minus the char we're replacing */
+       char *p = s;
+       while ((p = strstr(p, occur))) {
+               *p = repl_char;
+               p++;
+               slen -= skip;
+               memmove(p, (p + skip), slen - (p - s) + 1); /* includes null char too */
+       }
+}
+
+static int is_valid_index(struct json_object *jo, const char *path, int32_t *idx)
+{
+       int i, len = strlen(path);
+       /* this code-path optimizes a bit, for when we reference the 0-9 index range in a JSON array
+          and because leading zeros not allowed */
+       if (len == 1) {
+               if (isdigit((int)path[0])) {
+                       *idx = (path[0] - '0');
+                       goto check_oob;
+               }
+               errno = EINVAL;
+               return 0;
+       }
+       /* leading zeros not allowed per RFC */
+       if (path[0] == '0') {
+               errno = EINVAL;
+               return 0;
+       }
+       /* RFC states base-10 decimals */
+       for (i = 0; i < len; i++) {
+               if (!isdigit((int)path[i])) {
+                       errno = EINVAL;
+                       return 0;
+               }
+       }
+
+       *idx = strtol(path, NULL, 10);
+       if (*idx < 0) {
+               errno = EINVAL;
+               return 0;
+       }
+check_oob:
+       len = json_object_array_length(jo);
+       if (*idx >= len) {
+               errno = ENOENT;
+               return 0;
+       }
+
+       return 1;
+}
+
+static int json_pointer_get_single_path(struct json_object *obj, char *path, struct json_object **value)
+{
+       if (json_object_is_type(obj, json_type_array)) {
+               int32_t idx;
+               if (!is_valid_index(obj, path, &idx))
+                       return -1;
+               obj = json_object_array_get_idx(obj, idx);
+               if (obj) {
+                       if (value)
+                               *value = obj;
+                       return 0;
+               }
+               /* Entry not found */
+               errno = ENOENT;
+               return -1;
+       }
+
+       /* RFC states that we first must eval all ~1 then all ~0 */
+       string_replace_all_occurrences_with_char(path, "~1", '/');
+       string_replace_all_occurrences_with_char(path, "~0", '~');
+
+       if (!json_object_object_get_ex(obj, path, value)) {
+               errno = ENOENT;
+               return -1;
+       }
+
+       return 0;
+}
+
+static int json_pointer_set_single_path(
+       struct json_object *parent,
+       const char *path,
+       struct json_object *value)
+{
+       if (json_object_is_type(parent, json_type_array)) {
+               int32_t idx;
+               /* RFC (Chapter 4) states that '-' may be used to add new elements to an array */
+               if (path[0] == '-' && path[1] == '\0')
+                       return json_object_array_add(parent, value);
+               if (!is_valid_index(parent, path, &idx))
+                       return -1;
+               return json_object_array_put_idx(parent, idx, value);
+       }
+
+       /* path replacements should have been done in json_pointer_get_single_path(),
+          and we should still be good here */
+       if (json_object_is_type(parent, json_type_object))
+               return json_object_object_add(parent, path, value);
+
+       /* Getting here means that we tried to "dereference" a primitive JSON type (like string, int, bool).
+          i.e. add a sub-object to it */
+       errno = ENOENT;
+       return -1;
+}
+
+static int json_pointer_get_recursive(
+       struct json_object *obj,
+       char *path,
+       struct json_object **value)
+{
+       char *endp;
+       int rc;
+
+       /* All paths (on each recursion level must have a leading '/' */
+       if (path[0] != '/') {
+               errno = EINVAL;
+               return -1;
+       }
+       path++;
+
+       endp = strchr(path, '/');
+       if (endp)
+               *endp = '\0';
+
+       /* If we err-ed here, return here */
+       if ((rc = json_pointer_get_single_path(obj, path, &obj)))
+               return rc;
+
+       if (endp) {
+               *endp = '/'; /* Put the slash back, so that the sanity check passes on next recursion level */
+               return json_pointer_get_recursive(obj, endp, value);
+       }
+
+       /* We should be at the end of the recursion here */
+       if (value)
+               *value = obj;
+
+       return 0;
+}
+
+int json_pointer_get(struct json_object *obj, const char *path, struct json_object **res)
+{
+       char *path_copy = NULL;
+       int rc;
+
+       if (!obj || !path) {
+               errno = EINVAL;
+               return -1;
+       }
+
+       if (path[0] == '\0') {
+               if (res)
+                       *res = obj;
+               return 0;
+       }
+
+       /* pass a working copy to the recursive call */
+       if (!(path_copy = strdup(path))) {
+               errno = ENOMEM;
+               return -1;
+       }
+       rc = json_pointer_get_recursive(obj, path_copy, res);
+       free(path_copy);
+
+       return rc;
+}
+
+int json_pointer_getf(struct json_object *obj, struct json_object **res, const char *path_fmt, ...)
+{
+       char *path_copy = NULL;
+       int rc = 0;
+       va_list args;
+
+       if (!obj || !path_fmt) {
+               errno = EINVAL;
+               return -1;
+       }
+
+       va_start(args, path_fmt);
+       rc = vasprintf(&path_copy, path_fmt, args);
+       va_end(args);
+
+       if (rc < 0)
+               return rc;
+
+       if (path_copy[0] == '\0') {
+               if (res)
+                       *res = obj;
+               goto out;
+       }
+
+       rc = json_pointer_get_recursive(obj, path_copy, res);
+out:
+       free(path_copy);
+
+       return rc;
+}
+
+int json_pointer_set(struct json_object **obj, const char *path, struct json_object *value)
+{
+       const char *endp;
+       char *path_copy = NULL;
+       struct json_object *set = NULL;
+       int rc;
+
+       if (!obj || !path) {
+               errno = EINVAL;
+               return -1;
+       }
+
+       if (path[0] == '\0') {
+               json_object_put(*obj);
+               *obj = value;
+               return 0;
+       }
+
+       if (path[0] != '/') {
+               errno = EINVAL;
+               return -1;
+       }
+
+       /* If there's only 1 level to set, stop here */
+       if ((endp = strrchr(path, '/')) == path) {
+               path++;
+               return json_pointer_set_single_path(*obj, path, value);
+       }
+
+       /* pass a working copy to the recursive call */
+       if (!(path_copy = strdup(path))) {
+               errno = ENOMEM;
+               return -1;
+       }
+       path_copy[endp - path] = '\0';
+       rc = json_pointer_get_recursive(*obj, path_copy, &set);
+       free(path_copy);
+
+       if (rc)
+               return rc;
+
+       endp++;
+       return json_pointer_set_single_path(set, endp, value);
+}
+
+int json_pointer_setf(struct json_object **obj, struct json_object *value, const char *path_fmt, ...)
+{
+       char *endp;
+       char *path_copy = NULL;
+       struct json_object *set = NULL;
+       va_list args;
+       int rc = 0;
+
+       if (!obj || !path_fmt) {
+               errno = EINVAL;
+               return -1;
+       }
+
+       /* pass a working copy to the recursive call */
+       va_start(args, path_fmt);
+       rc = vasprintf(&path_copy, path_fmt, args);
+       va_end(args);
+
+       if (rc < 0)
+               return rc;
+
+       if (path_copy[0] == '\0') {
+               json_object_put(*obj);
+               *obj = value;
+               goto out;
+       }
+
+       if (path_copy[0] != '/') {
+               errno = EINVAL;
+               rc = -1;
+               goto out;
+       }
+
+       /* If there's only 1 level to set, stop here */
+       if ((endp = strrchr(path_copy, '/')) == path_copy) {
+               set = *obj;
+               goto set_single_path;
+       }
+
+       *endp = '\0';
+       rc = json_pointer_get_recursive(*obj, path_copy, &set);
+
+       if (rc)
+               goto out;
+
+set_single_path:
+       endp++;
+       rc = json_pointer_set_single_path(set, endp, value);
+out:
+       free(path_copy);
+       return rc;
+}
+
diff --git a/json_pointer.h b/json_pointer.h
new file mode 100644 (file)
index 0000000..b8746c0
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2016 Alexadru Ardelean.
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the MIT license. See COPYING for details.
+ *
+ */
+
+/**
+ * @file
+ * @brief JSON Pointer (RFC 6901) implementation for retrieving
+ *        objects from a json-c object tree.
+ */
+#ifndef _json_pointer_h_
+#define _json_pointer_h_
+
+#include "json_object.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Retrieves a JSON sub-object from inside another JSON object
+ * using the JSON pointer notation as defined in RFC 6901
+ *   https://tools.ietf.org/html/rfc6901
+ *
+ * The returned JSON sub-object is equivalent to parsing manually the
+ * 'obj' JSON tree ; i.e. it's not a new object that is created, but rather
+ * a pointer inside the JSON tree.
+ *
+ * Internally, this is equivalent to doing a series of 'json_object_object_get()'
+ * and 'json_object_array_get_idx()' along the given 'path'.
+ *
+ * Note that the 'path' string supports 'printf()' type arguments, so, whatever
+ * is added after the 'res' param will be treated as an argument for 'path'
+ * Example: json_pointer_get(obj, "/foo/%d/%s", &res, 0, bar)
+ * This means, that you need to escape '%' with '%%' (just like in printf())
+ *
+ * @param obj the json_object instance/tree from where to retrieve sub-objects
+ * @param path a (RFC6901) string notation for the sub-object to retrieve
+ * @param res a pointer where to store a reference to the json_object
+ *              associated with the given path
+ *
+ * @return negative if an error (or not found), or 0 if succeeded
+ */
+int json_pointer_get(struct json_object *obj, const char *path, struct json_object **res);
+
+/**
+ * This is a variant of 'json_pointer_get()' that supports printf() style arguments.
+ *
+ * Example: json_pointer_getf(obj, res, "/foo/%d/%s", 0, bak)
+ * This also means that you need to escape '%' with '%%' (just like in printf())
+ *
+ * Please take into consideration all recommended 'printf()' format security
+ * aspects when using this function.
+ *
+ * @param obj the json_object instance/tree to which to add a sub-object
+ * @param res a pointer where to store a reference to the json_object
+ *              associated with the given path
+ * @param path_fmt a printf() style format for the path
+ *
+ * @return negative if an error (or not found), or 0 if succeeded
+ */
+int json_pointer_getf(struct json_object *obj, struct json_object **res, const char *path_fmt, ...);
+
+/**
+ * Sets JSON object 'value' in the 'obj' tree at the location specified
+ * by the 'path'. 'path' is JSON pointer notation as defined in RFC 6901
+ *   https://tools.ietf.org/html/rfc6901
+ *
+ * Note that 'obj' is a double pointer, mostly for the "" (empty string)
+ * case, where the entire JSON object would be replaced by 'value'.
+ * In the case of the "" path, the object at '*obj' will have it's refcount
+ * decremented with 'json_object_put()' and the 'value' object will be assigned to it.
+ *
+ * For other cases (JSON sub-objects) ownership of 'value' will be transferred into
+ * '*obj' via 'json_object_object_add()' & 'json_object_array_put_idx()', so the
+ * only time the refcount should be decremented for 'value' is when the return value of
+ * 'json_pointer_set()' is negative (meaning the 'value' object did not get set into '*obj').
+ *
+ * That also implies that 'json_pointer_set()' does not do any refcount incrementing.
+ * (Just that single decrement that was mentioned above).
+ *
+ * Note that the 'path' string supports 'printf()' type arguments, so, whatever
+ * is added after the 'value' param will be treated as an argument for 'path'
+ * Example: json_pointer_set(obj, "/foo/%d/%s", value, 0, bak)
+ * This means, that you need to escape '%' with '%%' (just like in printf())
+ *
+ * @param obj the json_object instance/tree to which to add a sub-object
+ * @param path a (RFC6901) string notation for the sub-object to set in the tree
+ * @param value object to set at path
+ *
+ * @return negative if an error (or not found), or 0 if succeeded
+ */
+int json_pointer_set(struct json_object **obj, const char *path, struct json_object *value);
+
+/**
+ * This is a variant of 'json_pointer_set()' that supports printf() style arguments.
+ *
+ * Example: json_pointer_setf(obj, value, "/foo/%d/%s", 0, bak)
+ * This also means that you need to escape '%' with '%%' (just like in printf())
+ *
+ * Please take into consideration all recommended 'printf()' format security
+ * aspects when using this function.
+ *
+ * @param obj the json_object instance/tree to which to add a sub-object
+ * @param value object to set at path
+ * @param path_fmt a printf() style format for the path
+ *
+ * @return negative if an error (or not found), or 0 if succeeded
+ */
+int json_pointer_setf(struct json_object **obj, struct json_object *value, const char *path_fmt, ...);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
index 9a76293..449a82d 100644 (file)
@@ -16,6 +16,7 @@
 #include "config.h"
 
 #include <math.h>
+#include "math_compat.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <stddef.h>
 #include <string.h>
 #include <limits.h>
 
-#include "bits.h"
 #include "debug.h"
 #include "printbuf.h"
 #include "arraylist.h"
 #include "json_inttypes.h"
 #include "json_object.h"
+#include "json_object_private.h"
 #include "json_tokener.h"
 #include "json_util.h"
+#include "strdup_compat.h"
 
 #ifdef HAVE_LOCALE_H
 #include <locale.h>
 #endif /* HAVE_LOCALE_H */
+#ifdef HAVE_XLOCALE_H
+#include <xlocale.h>
+#endif
 
-#if !HAVE_STRDUP && defined(_MSC_VER)
-  /* MSC has the version as _strdup */
-# define strdup _strdup
-#elif !HAVE_STRDUP
-# error You do not have strdup on your system.
-#endif /* HAVE_STRDUP */
+#define jt_hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x) & 7) + 9)
 
 #if !HAVE_STRNCASECMP && defined(_MSC_VER)
   /* MSC has the version as _strnicmp */
@@ -58,7 +58,8 @@
 static const char json_null_str[] = "null";
 static const int json_null_str_len = sizeof(json_null_str) - 1;
 static const char json_inf_str[] = "Infinity";
-static const int json_inf_str_len = sizeof(json_inf_str) - 1;
+static const char json_inf_str_lower[] = "infinity";
+static const unsigned int json_inf_str_len = sizeof(json_inf_str) - 1;
 static const char json_nan_str[] = "NaN";
 static const int json_nan_str_len = sizeof(json_nan_str) - 1;
 static const char json_true_str[] = "true";
@@ -86,13 +87,15 @@ static const char* json_tokener_errors[] = {
 
 const char *json_tokener_error_desc(enum json_tokener_error jerr)
 {
-       int jerr_int = (int)jerr;
-       if (jerr_int < 0 || jerr_int >= (int)(sizeof(json_tokener_errors) / sizeof(json_tokener_errors[0])))
-               return "Unknown error, invalid json_tokener_error value passed to json_tokener_error_desc()";
+       int jerr_int = (int) jerr;
+       if (jerr_int < 0 ||
+           jerr_int >= (int)(sizeof(json_tokener_errors) / sizeof(json_tokener_errors[0])))
+               return "Unknown error, "
+                      "invalid json_tokener_error value passed to json_tokener_error_desc()";
        return json_tokener_errors[jerr];
 }
 
-enum json_tokener_error json_tokener_get_error(json_tokener *tok)
+enum json_tokener_error json_tokener_get_error(struct json_tokener *tok)
 {
        return tok->err;
 }
@@ -109,7 +112,8 @@ struct json_tokener* json_tokener_new_ex(int depth)
 
   tok = (struct json_tokener*)calloc(1, sizeof(struct json_tokener));
   if (!tok) return NULL;
-  tok->stack = (struct json_tokener_srec *)calloc(depth, sizeof(struct json_tokener_srec));
+  tok->stack = (struct json_tokener_srec *) calloc(depth,
+                                                  sizeof(struct json_tokener_srec));
   if (!tok->stack) {
     free(tok);
     return NULL;
@@ -129,7 +133,7 @@ void json_tokener_free(struct json_tokener *tok)
 {
   json_tokener_reset(tok);
   if (tok->pb) printbuf_free(tok->pb);
-  if (tok->stack) free(tok->stack);
+  free(tok->stack);
   free(tok);
 }
 
@@ -163,7 +167,8 @@ struct json_object* json_tokener_parse(const char *str)
     return obj;
 }
 
-struct json_object* json_tokener_parse_verbose(const char *str, enum json_tokener_error *error)
+struct json_object* json_tokener_parse_verbose(const char *str,
+                                              enum json_tokener_error *error)
 {
     struct json_tokener* tok;
     struct json_object* obj;
@@ -206,14 +211,17 @@ struct json_object* json_tokener_parse_verbose(const char *str, enum json_tokene
  *   Returns 1 on success, sets tok->err and returns 0 if no more chars.
  *   Implicit inputs:  str, len vars
  */
-#define PEEK_CHAR(dest, tok)                                                  \
-  (((tok)->char_offset == len) ?                                          \
-   (((tok)->depth == 0 && state == json_tokener_state_eatws && saved_state == json_tokener_state_finish) ? \
-    (((tok)->err = json_tokener_success), 0)                              \
-    :                                                                   \
-    (((tok)->err = json_tokener_continue), 0)                             \
-    ) :                                                                 \
-   (((dest) = *str), 1)                                                 \
+#define PEEK_CHAR(dest, tok)                   \
+  (((tok)->char_offset == len) ?               \
+   (((tok)->depth == 0 &&                      \
+     state == json_tokener_state_eatws &&      \
+     saved_state == json_tokener_state_finish  \
+     ) ?                                       \
+    (((tok)->err = json_tokener_success), 0)   \
+    :                                          \
+    (((tok)->err = json_tokener_continue), 0)  \
+    ) :                                                \
+   (((dest) = *str), 1)                                \
    )
 
 /* ADVANCE_CHAR() macro:
@@ -233,12 +241,11 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
 {
   struct json_object *obj = NULL;
   char c = '\1';
-#ifdef HAVE_SETLOCALE
-  char *oldlocale=NULL, *tmplocale;
-
-  tmplocale = setlocale(LC_NUMERIC, NULL);
-  if (tmplocale) oldlocale = strdup(tmplocale);
-  setlocale(LC_NUMERIC, "C");
+#ifdef HAVE_USELOCALE
+  locale_t oldlocale = uselocale(NULL);
+  locale_t newloc;
+#elif defined(HAVE_SETLOCALE)
+  char *oldlocale = NULL;
 #endif
 
   tok->char_offset = 0;
@@ -254,6 +261,33 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
     return NULL;
   }
 
+#ifdef HAVE_USELOCALE
+  {
+    locale_t duploc = duplocale(oldlocale);
+    newloc = newlocale(LC_NUMERIC, "C", duploc);
+    // XXX at least Debian 8.4 has a bug in newlocale where it doesn't
+    //  change the decimal separator unless you set LC_TIME!
+    if (newloc)
+    {
+      duploc = newloc; // original duploc has been freed by newlocale()
+      newloc = newlocale(LC_TIME, "C", duploc);
+    }
+    if (newloc == NULL)
+    {
+      freelocale(duploc);
+      return NULL;
+    }
+    uselocale(newloc);
+  }
+#elif defined(HAVE_SETLOCALE)
+  {
+    char *tmplocale;
+    tmplocale = setlocale(LC_NUMERIC, NULL);
+    if (tmplocale) oldlocale = strdup(tmplocale);
+    setlocale(LC_NUMERIC, "C");
+  }
+#endif
+
   while (PEEK_CHAR(c, tok)) {
 
   redo_char:
@@ -281,11 +315,15 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
        state = json_tokener_state_eatws;
        saved_state = json_tokener_state_object_field_start;
        current = json_object_new_object();
+       if(current == NULL)
+               goto out;
        break;
       case '[':
        state = json_tokener_state_eatws;
        saved_state = json_tokener_state_array;
        current = json_object_new_array();
+       if(current == NULL)
+               goto out;
        break;
       case 'I':
       case 'i':
@@ -305,6 +343,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
             tok->err = json_tokener_error_parse_unexpected;
             goto out;
         }
+       /* FALLTHRU */
       case '"':
        state = json_tokener_state_string;
        printbuf_reset(tok->pb);
@@ -318,10 +357,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
        printbuf_reset(tok->pb);
        tok->st_pos = 0;
        goto redo_char;
-#if defined(__GNUC__)
-         case '0' ... '9':
-#else
-         case '0':
+      case '0':
       case '1':
       case '2':
       case '3':
@@ -331,7 +367,6 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
       case '7':
       case '8':
       case '9':
-#endif
       case '-':
        state = json_tokener_state_number;
        printbuf_reset(tok->pb);
@@ -350,36 +385,55 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
       tok->depth--;
       goto redo_char;
 
-    case json_tokener_state_inf: /* aka starts with 'i' */
+    case json_tokener_state_inf: /* aka starts with 'i' (or 'I', or "-i", or "-I") */
       {
-       int size_inf;
+       /* If we were guaranteed to have len set, then we could (usually) handle
+        * the entire "Infinity" check in a single strncmp (strncasecmp), but
+        * since len might be -1 (i.e. "read until \0"), we need to check it
+        * a character at a time.
+        * Trying to handle it both ways would make this code considerably more
+        * complicated with likely little performance benefit.
+        */
        int is_negative = 0;
+       const char *_json_inf_str = json_inf_str;
+       if (!(tok->flags & JSON_TOKENER_STRICT))
+               _json_inf_str = json_inf_str_lower;
 
-       printbuf_memappend_fast(tok->pb, &c, 1);
-       size_inf = json_min(tok->st_pos+1, json_inf_str_len);
-       char *infbuf = tok->pb->buf;
-       if (*infbuf == '-')
+       /* Note: tok->st_pos must be 0 when state is set to json_tokener_state_inf */
+       while (tok->st_pos < (int)json_inf_str_len)
        {
-               infbuf++;
-               is_negative = 1;
-       }
-       if ((!(tok->flags & JSON_TOKENER_STRICT) &&
-                 strncasecmp(json_inf_str, infbuf, size_inf) == 0) ||
-                (strncmp(json_inf_str, infbuf, size_inf) == 0)
-               )
-       {
-               if (tok->st_pos == json_inf_str_len)
+               char inf_char = *str;
+               if (!(tok->flags & JSON_TOKENER_STRICT))
+                       inf_char = tolower((int)*str);
+               if (inf_char != _json_inf_str[tok->st_pos])
                {
-                       current = json_object_new_double(is_negative ? -INFINITY : INFINITY); 
-                       saved_state = json_tokener_state_finish;
-                       state = json_tokener_state_eatws;
-                       goto redo_char;
+                       tok->err = json_tokener_error_parse_unexpected;
+                       goto out;
+               }
+               tok->st_pos++;
+               (void)ADVANCE_CHAR(str, tok);
+               if (!PEEK_CHAR(c, tok))
+               {
+                       /* out of input chars, for now at least */
+                       goto out;
                }
-       } else {
-               tok->err = json_tokener_error_parse_unexpected;
-               goto out;
        }
-       tok->st_pos++;
+       /* We checked the full length of "Infinity", so create the object.
+        * When handling -Infinity, the number parsing code will have dropped
+        * the "-" into tok->pb for us, so check it now.
+        */
+       if (printbuf_length(tok->pb) > 0 && *(tok->pb->buf) == '-')
+       {
+               is_negative = 1;
+       }
+       current = json_object_new_double(is_negative
+                                        ? -INFINITY : INFINITY);
+       if (current == NULL)
+               goto out;
+       saved_state = json_tokener_state_finish;
+       state = json_tokener_state_eatws;
+       goto redo_char;
+        
       }
       break;
     case json_tokener_state_null: /* aka starts with 'n' */
@@ -408,6 +462,8 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
                if (tok->st_pos == json_nan_str_len)
                {
                        current = json_object_new_double(NAN);
+                       if (current == NULL)
+                           goto out;
                        saved_state = json_tokener_state_finish;
                        state = json_tokener_state_eatws;
                        goto redo_char;
@@ -481,6 +537,8 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
          if(c == tok->quote_char) {
            printbuf_memappend_fast(tok->pb, case_start, str-case_start);
            current = json_object_new_string_len(tok->pb->buf, tok->pb->bpos);
+           if(current == NULL)
+               goto out;
            saved_state = json_tokener_state_finish;
            state = json_tokener_state_eatws;
            break;
@@ -535,8 +593,8 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
 
          /* Handle a 4-byte sequence, or two sequences if a surrogate pair */
          while(1) {
-           if(strchr(json_hex_chars, c)) {
-             tok->ucs_char += ((unsigned int)hexdigit(c) << ((3-tok->st_pos++)*4));
+           if (c && strchr(json_hex_chars, c)) {
+             tok->ucs_char += ((unsigned int)jt_hexdigit(c) << ((3-tok->st_pos++)*4));
              if(tok->st_pos == 4) {
                unsigned char unescaped_utf[4];
 
@@ -566,8 +624,8 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
                    */
                   got_hi_surrogate = tok->ucs_char;
                   /* Not at end, and the next two chars should be "\u" */
-                  if ((tok->char_offset+1 != len) &&
-                      (tok->char_offset+2 != len) &&
+                  if ((len == -1 || len > (tok->char_offset + 2)) &&
+                      // str[0] != '0' &&  // implied by json_hex_chars, above.
                       (str[1] == '\\') &&
                       (str[2] == 'u'))
                   {
@@ -576,13 +634,15 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
                  * characters.
                  */
                    if( !ADVANCE_CHAR(str, tok) || !ADVANCE_CHAR(str, tok) ) {
-                    printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
-                }
+                    printbuf_memappend_fast(tok->pb,
+                                           (char*) utf8_replacement_char, 3);
+                   }
                     /* Advance to the first char of the next sequence and
                      * continue processing with the next sequence.
                      */
                    if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
-                     printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
+                     printbuf_memappend_fast(tok->pb,
+                                             (char*) utf8_replacement_char, 3);
                      goto out;
                     }
                    tok->ucs_char = 0;
@@ -593,7 +653,8 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
                      * it.  Put a replacement char in for the hi surrogate
                      * and pretend we finished.
                      */
-                   printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
+                   printbuf_memappend_fast(tok->pb,
+                                           (char*) utf8_replacement_char, 3);
                   }
                } else if (IS_LOW_SURROGATE(tok->ucs_char)) {
                   /* Got a low surrogate not preceded by a high */
@@ -641,6 +702,8 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
          ) {
          if(tok->st_pos == json_true_str_len) {
            current = json_object_new_boolean(1);
+           if(current == NULL)
+               goto out;
            saved_state = json_tokener_state_finish;
            state = json_tokener_state_eatws;
            goto redo_char;
@@ -650,6 +713,8 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
          || (strncmp(json_false_str, tok->pb->buf, size2) == 0)) {
          if(tok->st_pos == json_false_str_len) {
            current = json_object_new_boolean(0);
+           if(current == NULL)
+               goto out;
            saved_state = json_tokener_state_finish;
            state = json_tokener_state_eatws;
            goto redo_char;
@@ -667,10 +732,45 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
        /* Advance until we change state */
        const char *case_start = str;
        int case_len=0;
+       int is_exponent=0;
+       int negativesign_next_possible_location=1;
        while(c && strchr(json_number_chars, c)) {
          ++case_len;
-         if(c == '.' || c == 'e' || c == 'E')
+
+         /* non-digit characters checks */
+         /* note: since the main loop condition to get here was
+                  an input starting with 0-9 or '-', we are
+                  protected from input starting with '.' or
+                  e/E. */
+         if (c == '.') {
+           if (tok->is_double != 0) {
+             /* '.' can only be found once, and out of the exponent part.
+                Thus, if the input is already flagged as double, it
+                is invalid. */
+             tok->err = json_tokener_error_parse_number;
+             goto out;
+           }
            tok->is_double = 1;
+         }
+         if (c == 'e' || c == 'E') {
+           if (is_exponent != 0) {
+             /* only one exponent possible */
+             tok->err = json_tokener_error_parse_number;
+             goto out;
+           }
+           is_exponent = 1;
+           tok->is_double = 1;
+           /* the exponent part can begin with a negative sign */
+           negativesign_next_possible_location = case_len + 1;
+         }
+         if (c == '-' && case_len != negativesign_next_possible_location) {
+           /* If the negative sign is not where expected (ie
+              start of input or start of exponent part), the
+              input is invalid. */
+           tok->err = json_tokener_error_parse_number;
+           goto out;
+         }
+
          if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
            printbuf_memappend_fast(tok->pb, case_start, case_len);
            goto out;
@@ -680,10 +780,11 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
           printbuf_memappend_fast(tok->pb, case_start, case_len);
 
        // Check for -Infinity
-       if (tok->pb->buf[0] == '-' && case_len == 1 &&
+       if (tok->pb->buf[0] == '-' && case_len <= 1 &&
            (c == 'i' || c == 'I'))
        {
                state = json_tokener_state_inf;
+               tok->st_pos = 0;
                goto redo_char;
        }
       }
@@ -691,16 +792,21 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
        int64_t num64;
        double  numd;
        if (!tok->is_double && json_parse_int64(tok->pb->buf, &num64) == 0) {
-               if (num64 && tok->pb->buf[0]=='0' && (tok->flags & JSON_TOKENER_STRICT)) {
+               if (num64 && tok->pb->buf[0]=='0' &&
+                   (tok->flags & JSON_TOKENER_STRICT)) {
                        /* in strict mode, number must not start with 0 */
                        tok->err = json_tokener_error_parse_number;
                        goto out;
                }
                current = json_object_new_int64(num64);
+               if(current == NULL)
+                   goto out;
        }
        else if(tok->is_double && json_parse_double(tok->pb->buf, &numd) == 0)
        {
           current = json_object_new_double_s(numd, tok->pb->buf);
+         if(current == NULL)
+               goto out;
         } else {
           tok->err = json_tokener_error_parse_number;
           goto out;
@@ -714,12 +820,12 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
     case json_tokener_state_array_after_sep:
     case json_tokener_state_array:
       if(c == ']') {
-               if (state == json_tokener_state_array_after_sep &&
-                       (tok->flags & JSON_TOKENER_STRICT))
-               {
-                       tok->err = json_tokener_error_parse_unexpected;
-                       goto out;
-               }
+       if (state == json_tokener_state_array_after_sep &&
+           (tok->flags & JSON_TOKENER_STRICT))
+         {
+           tok->err = json_tokener_error_parse_unexpected;
+           goto out;
+         }
        saved_state = json_tokener_state_finish;
        state = json_tokener_state_eatws;
       } else {
@@ -735,7 +841,8 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
       break;
 
     case json_tokener_state_array_add:
-      json_object_array_add(current, obj);
+      if( json_object_array_add(current, obj) != 0 )
+        goto out;
       saved_state = json_tokener_state_array_sep;
       state = json_tokener_state_eatws;
       goto redo_char;
@@ -828,6 +935,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
       goto redo_char;
 
     case json_tokener_state_object_sep:
+      /* { */
       if(c == '}') {
        saved_state = json_tokener_state_finish;
        state = json_tokener_state_eatws;
@@ -843,7 +951,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
     }
     if (!ADVANCE_CHAR(str, tok))
       goto out;
-  } /* while(POP_CHAR) */
+  } /* while(PEEK_CHAR) */
 
  out:
   if (c &&
@@ -859,9 +967,12 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
       tok->err = json_tokener_error_parse_eof;
   }
 
-#ifdef HAVE_SETLOCALE
+#ifdef HAVE_USELOCALE
+  uselocale(oldlocale);
+  freelocale(newloc); 
+#elif defined(HAVE_SETLOCALE)
   setlocale(LC_NUMERIC, oldlocale);
-  if (oldlocale) free(oldlocale);
+  free(oldlocale);
 #endif
 
   if (tok->err == json_tokener_success)
index a72d2bd..ed272b6 100644 (file)
@@ -9,6 +9,10 @@
  *
  */
 
+/**
+ * @file
+ * @brief Methods to parse an input string into a tree of json_object objects.
+ */
 #ifndef _json_tokener_h_
 #define _json_tokener_h_
 
@@ -86,6 +90,10 @@ struct json_tokener
   struct json_tokener_srec *stack;
   int flags;
 };
+/**
+ * @deprecated Unused in json-c code
+ */
+typedef struct json_tokener json_tokener;
 
 /**
  * Be strict when parsing JSON input.  Use caution with
@@ -116,34 +124,34 @@ const char *json_tokener_error_desc(enum json_tokener_error jerr);
  *
  * See also json_tokener_error_desc().
  */
-enum json_tokener_error json_tokener_get_error(struct json_tokener *tok);
+JSON_EXPORT 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);
+JSON_EXPORT struct json_tokener* json_tokener_new(void);
+JSON_EXPORT struct json_tokener* json_tokener_new_ex(int depth);
+JSON_EXPORT void json_tokener_free(struct json_tokener *tok);
+JSON_EXPORT void json_tokener_reset(struct json_tokener *tok);
+JSON_EXPORT struct json_object* json_tokener_parse(const char *str);
+JSON_EXPORT 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);
+JSON_EXPORT 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 
+ * NULL will be returned and json_tokener_get_error() will return
  * json_tokener_continue.
  * json_tokener_parse_ex() can then be called with additional bytes in str
- * to continue the parsing.  
+ * to continue the parsing.
  *
- * If json_tokener_parse_ex() returns NULL and the error anything other than
+ * If json_tokener_parse_ex() returns NULL and the error is 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
+ * halted.  Then, the tok object must not be reused until json_tokener_reset() is
  * called.
  *
  * When a valid JSON value is parsed, a non-NULL json_object will be
@@ -152,7 +160,7 @@ extern void json_tokener_set_flags(struct json_tokener *tok, int flags);
  * 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 
+ * 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.
@@ -198,7 +206,7 @@ if (tok->char_offset < stringlen) // XXX shouldn't access internal fields
  * @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,
+JSON_EXPORT struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
                                                 const char *str, int len);
 
 #ifdef __cplusplus
index 531f9af..ad7704a 100644 (file)
 #include "config.h"
 #undef realloc
 
+#include "strerror_override.h"
+
+#include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stddef.h>
 #include <limits.h>
 #include <string.h>
-#include <errno.h>
 #include <ctype.h>
 
 #ifdef HAVE_SYS_TYPES_H
 #endif /* HAVE_UNISTD_H */
 
 #ifdef WIN32
+# if MSC_VER < 1800
+/* strtoll is available only since Visual Studio 2013 */
+#  define strtoll _strtoi64
+# endif
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
 # include <io.h>
 # define open _open
 #endif
 
-#if !defined(HAVE_SNPRINTF) && defined(_MSC_VER)
-  /* MSC has the version as _snprintf */
-# define snprintf _snprintf
-#elif !defined(HAVE_SNPRINTF)
-# error You do not have snprintf on your system.
-#endif /* HAVE_SNPRINTF */
+#include "snprintf_compat.h"
 
-#include "bits.h"
 #include "debug.h"
 #include "printbuf.h"
 #include "json_inttypes.h"
 #include "json_tokener.h"
 #include "json_util.h"
 
-static int sscanf_is_broken = 0;
-static int sscanf_is_broken_testdone = 0;
-static void sscanf_is_broken_test(void);
+static int _json_object_to_fd(int fd, struct json_object *obj, int flags, const char *filename);
 
-struct json_object* json_object_from_file(const char *filename)
+static char _last_err[256] = "";
+
+const char *json_util_get_last_err()
+{
+       if (_last_err[0] == '\0')
+               return NULL;
+       return _last_err;
+}
+
+void _json_c_set_last_err(const char *err_fmt, ...)
+{
+       va_list ap;
+       va_start(ap, err_fmt);
+       // Ignore (attempted) overruns from snprintf
+       (void)vsnprintf(_last_err, sizeof(_last_err), err_fmt, ap);
+       va_end(ap);
+}
+
+struct json_object* json_object_from_fd(int fd)
 {
   struct printbuf *pb;
   struct json_object *obj;
   char buf[JSON_FILE_BUF_SIZE];
-  int fd, ret;
+  int ret;
 
-  if((fd = open(filename, O_RDONLY)) < 0) {
-    MC_ERROR("json_object_from_file: error opening file %s: %s\n",
-            filename, strerror(errno));
-    return NULL;
-  }
   if(!(pb = printbuf_new())) {
-    close(fd);
-    MC_ERROR("json_object_from_file: printbuf_new failed\n");
+    _json_c_set_last_err("json_object_from_file: printbuf_new failed\n");
     return NULL;
   }
   while((ret = read(fd, buf, JSON_FILE_BUF_SIZE)) > 0) {
     printbuf_memappend(pb, buf, ret);
   }
-  close(fd);
   if(ret < 0) {
-    MC_ERROR("json_object_from_file: error reading file %s: %s\n",
-            filename, strerror(errno));
+    _json_c_set_last_err("json_object_from_fd: error reading fd %d: %s\n", fd, strerror(errno));
     printbuf_free(pb);
     return NULL;
   }
@@ -97,173 +105,108 @@ struct json_object* json_object_from_file(const char *filename)
   return obj;
 }
 
-/* extended "format and write to file" function */
-
-int json_object_to_file_ext(const char *filename, struct json_object *obj, int flags)
+struct json_object* json_object_from_file(const char *filename)
 {
-  const char *json_str;
-  int fd, ret;
-  unsigned int wpos, wsize;
-
-  if(!obj) {
-    MC_ERROR("json_object_to_file: object is null\n");
-    return -1;
-  }
-
-  if((fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, 0644)) < 0) {
-    MC_ERROR("json_object_to_file: error opening file %s: %s\n",
-            filename, strerror(errno));
-    return -1;
-  }
-
-  if(!(json_str = json_object_to_json_string_ext(obj,flags))) {
-    close(fd);
-    return -1;
-  }
+  struct json_object *obj;
+  int fd;
 
-  wsize = (unsigned int)(strlen(json_str) & UINT_MAX); /* CAW: probably unnecessary, but the most 64bit safe */
-  wpos = 0;
-  while(wpos < wsize) {
-    if((ret = write(fd, json_str + wpos, wsize-wpos)) < 0) {
-      close(fd);
-      MC_ERROR("json_object_to_file: error writing file %s: %s\n",
+  if((fd = open(filename, O_RDONLY)) < 0) {
+    _json_c_set_last_err("json_object_from_file: error opening file %s: %s\n",
             filename, strerror(errno));
-      return -1;
-    }
-
-       /* because of the above check for ret < 0, we can safely cast and add */
-    wpos += (unsigned int)ret;
+    return NULL;
   }
-
+  obj = json_object_from_fd(fd);
   close(fd);
-  return 0;
-}
-
-// backwards compatible "format and write to file" function
-
-int json_object_to_file(const char *filename, struct json_object *obj)
-{
-  return json_object_to_file_ext(filename, obj, JSON_C_TO_STRING_PLAIN);
+  return obj;
 }
 
-int json_parse_double(const char *buf, double *retval)
-{
-  return (sscanf(buf, "%lf", retval)==1 ? 0 : 1);
-}
+/* extended "format and write to file" function */
 
-/*
- * Not all implementations of sscanf actually work properly.
- * Check whether the one we're currently using does, and if
- * it's broken, enable the workaround code.
- */
-static void sscanf_is_broken_test()
+int json_object_to_file_ext(const char *filename, struct json_object *obj, int flags)
 {
-       int64_t num64;
-       int ret_errno, is_int64_min, ret_errno2, is_int64_max;
-
-       (void)sscanf(" -01234567890123456789012345", "%" SCNd64, &num64);
-       ret_errno = errno;
-       is_int64_min = (num64 == INT64_MIN);
+       int fd, ret;
+       int saved_errno;
 
-       (void)sscanf(" 01234567890123456789012345", "%" SCNd64, &num64);
-       ret_errno2 = errno;
-       is_int64_max = (num64 == INT64_MAX);
+       if (!obj) {
+               _json_c_set_last_err("json_object_to_file: object is null\n");
+               return -1;
+       }
 
-       if (ret_errno != ERANGE || !is_int64_min ||
-           ret_errno2 != ERANGE || !is_int64_max)
-       {
-               MC_DEBUG("sscanf_is_broken_test failed, enabling workaround code\n");
-               sscanf_is_broken = 1;
+       if ((fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, 0644)) < 0) {
+               _json_c_set_last_err("json_object_to_file: error opening file %s: %s\n",
+                             filename, strerror(errno));
+               return -1;
        }
+       ret = _json_object_to_fd(fd, obj, flags, filename);
+       saved_errno = errno;
+       close(fd);
+       errno = saved_errno;
+       return ret;
 }
 
-int json_parse_int64(const char *buf, int64_t *retval)
+int json_object_to_fd(int fd, struct json_object *obj, int flags)
 {
-       int64_t num64;
-       const char *buf_sig_digits;
-       int orig_has_neg;
-       int saved_errno;
-
-       if (!sscanf_is_broken_testdone)
-       {
-               sscanf_is_broken_test();
-               sscanf_is_broken_testdone = 1;
+       if (!obj) {
+               _json_c_set_last_err("json_object_to_fd: object is null\n");
+               return -1;
        }
 
-       // Skip leading spaces
-       while (isspace((int)*buf) && *buf)
-               buf++;
+       return _json_object_to_fd(fd, obj, flags, NULL);
+}
+static int _json_object_to_fd(int fd, struct json_object *obj, int flags, const char *filename)
+{
+       int ret;
+       const char *json_str;
+       unsigned int wpos, wsize;
 
-       errno = 0; // sscanf won't always set errno, so initialize
-       if (sscanf(buf, "%" SCNd64, &num64) != 1)
-       {
-               MC_DEBUG("Failed to parse, sscanf != 1\n");
-               return 1;
-       }
+       filename = filename ? filename : "(fd)";
 
-       saved_errno = errno;
-       buf_sig_digits = buf;
-       orig_has_neg = 0;
-       if (*buf_sig_digits == '-')
-       {
-               buf_sig_digits++;
-               orig_has_neg = 1;
+       if (!(json_str = json_object_to_json_string_ext(obj,flags))) {
+               return -1;
        }
 
-       // Not all sscanf implementations actually work
-       if (sscanf_is_broken && saved_errno != ERANGE)
-       {
-               char buf_cmp[100];
-               char *buf_cmp_start = buf_cmp;
-               int recheck_has_neg = 0;
-               int buf_cmp_len;
-
-               // Skip leading zeros, but keep at least one digit
-               while (buf_sig_digits[0] == '0' && buf_sig_digits[1] != '\0')
-                       buf_sig_digits++;
-               if (num64 == 0) // assume all sscanf impl's will parse -0 to 0
-                       orig_has_neg = 0; // "-0" is the same as just plain "0"
-
-               snprintf(buf_cmp_start, sizeof(buf_cmp), "%" PRId64, num64);
-               if (*buf_cmp_start == '-')
-               {
-                       recheck_has_neg = 1;
-                       buf_cmp_start++;
-               }
-               // No need to skip leading spaces or zeros here.
-
-               buf_cmp_len = strlen(buf_cmp_start);
-               /**
-                * If the sign is different, or
-                * some of the digits are different, or
-                * there is another digit present in the original string
-                * then we have NOT successfully parsed the value.
-                */
-               if (orig_has_neg != recheck_has_neg ||
-                   strncmp(buf_sig_digits, buf_cmp_start, strlen(buf_cmp_start)) != 0 ||
-                       ((int)strlen(buf_sig_digits) != buf_cmp_len &&
-                        isdigit((int)buf_sig_digits[buf_cmp_len])
-                   )
-                  )
-               {
-                       saved_errno = ERANGE;
+       wsize = (unsigned int)(strlen(json_str) & UINT_MAX); /* CAW: probably unnecessary, but the most 64bit safe */
+       wpos = 0;
+       while(wpos < wsize) {
+               if((ret = write(fd, json_str + wpos, wsize-wpos)) < 0) {
+                 _json_c_set_last_err("json_object_to_file: error writing file %s: %s\n",
+                        filename, strerror(errno));
+                 return -1;
                }
-       }
 
-       // Not all sscanf impl's set the value properly when out of range.
-       // Always do this, even for properly functioning implementations,
-       // since it shouldn't slow things down much.
-       if (saved_errno == ERANGE)
-       {
-               if (orig_has_neg)
-                       num64 = INT64_MIN;
-               else
-                       num64 = INT64_MAX;
+               /* because of the above check for ret < 0, we can safely cast and add */
+               wpos += (unsigned int)ret;
        }
-       *retval = num64;
+
        return 0;
 }
 
+// backwards compatible "format and write to file" function
+
+int json_object_to_file(const char *filename, struct json_object *obj)
+{
+  return json_object_to_file_ext(filename, obj, JSON_C_TO_STRING_PLAIN);
+}
+
+int json_parse_double(const char *buf, double *retval)
+{
+  char *end;
+  *retval = strtod(buf, &end);
+  return end == buf ? 1 : 0;
+}
+
+int json_parse_int64(const char *buf, int64_t *retval)
+{
+       char *end = NULL;
+       int64_t val;
+
+       errno = 0;
+       val = strtoll(buf, &end, 10);
+       if (end != buf)
+               *retval = val;
+       return ((val == 0 && errno != 0) || (end == buf)) ? 1 : 0;
+}
+
 #ifndef HAVE_REALLOC
 void* rpl_realloc(void* p, size_t n)
 {
@@ -292,7 +235,7 @@ const char *json_type_to_name(enum json_type o_type)
        int o_type_int = (int)o_type;
        if (o_type_int < 0 || o_type_int >= (int)NELEM(json_type_name))
        {
-               MC_ERROR("json_type_to_name: type %d is out of range [0,%d]\n", o_type, NELEM(json_type_name));
+               _json_c_set_last_err("json_type_to_name: type %d is out of range [0,%d]\n", o_type, NELEM(json_type_name));
                return NULL;
        }
        return json_type_name[o_type];
index 1005e58..e065f60 100644 (file)
@@ -9,11 +9,24 @@
  *
  */
 
+/**
+ * @file
+ * @brief Miscllaneous utility functions and macros.
+ */ 
 #ifndef _json_util_h_
 #define _json_util_h_
 
 #include "json_object.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
+
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -21,13 +34,65 @@ extern "C" {
 #define JSON_FILE_BUF_SIZE 4096
 
 /* utility functions */
+/**
+ * Read the full contents of the given file, then convert it to a
+ * json_object using json_tokener_parse().
+ *
+ * Returns -1 if something fails.  See json_util_get_last_err() for details.
+ */
 extern struct json_object* json_object_from_file(const char *filename);
+
+/**
+ * Create a JSON object from already opened file descriptor.
+ *
+ * This function can be helpful, when you opened the file already,
+ * e.g. when you have a temp file.
+ * Note, that the fd must be readable at the actual position, i.e.
+ * use lseek(fd, 0, SEEK_SET) before.
+ *
+ * Returns -1 if something fails.  See json_util_get_last_err() for details.
+ */
+extern struct json_object* json_object_from_fd(int fd);
+
+/**
+ * Equivalent to:
+ *   json_object_to_file_ext(filename, obj, JSON_C_TO_STRING_PLAIN);
+ *
+ * Returns -1 if something fails.  See json_util_get_last_err() for details.
+ */
 extern int json_object_to_file(const char *filename, struct json_object *obj);
+
+/**
+ * Open and truncate the given file, creating it if necessary, then
+ * convert the json_object to a string and write it to the file.
+ *
+ * Returns -1 if something fails.  See json_util_get_last_err() for details.
+ */
 extern int json_object_to_file_ext(const char *filename, struct json_object *obj, int flags);
+
+/**
+ * Convert the json_object to a string and write it to the file descriptor.
+ * Handles partial writes and will keep writing until done, or an error
+ * occurs.
+ *
+ * @param fd an open, writable file descriptor to write to
+ * @param obj the object to serializer and write
+ * @param flags flags to pass to json_object_to_json_string_ext()
+ * @return -1 if something fails.  See json_util_get_last_err() for details.
+ */
+extern int json_object_to_fd(int fd, struct json_object *obj, int flags);
+
+/**
+ * Return the last error from various json-c functions, including:
+ * json_object_to_file{,_ext}, json_object_to_fd() or
+ * json_object_from_{file,fd}, or NULL if there is none.
+ */
+const char *json_util_get_last_err(void);
+
+
 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...
diff --git a/json_visit.c b/json_visit.c
new file mode 100644 (file)
index 0000000..1126ff8
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2016 Eric Haszlakiewicz
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the MIT license. See COPYING for details.
+ */
+
+#include <stdio.h>
+
+#include "config.h"
+#include "json_inttypes.h"
+#include "json_object.h"
+#include "json_visit.h"
+#include "linkhash.h"
+
+static int _json_c_visit(json_object *jso, json_object *parent_jso,
+                         const char *jso_key, size_t *jso_index,
+                         json_c_visit_userfunc *userfunc, void *userarg);
+
+int json_c_visit(json_object *jso, int future_flags,
+                 json_c_visit_userfunc *userfunc, void *userarg)
+{
+       int ret = _json_c_visit(jso, NULL, NULL, NULL, userfunc, userarg);
+       switch(ret)
+       {
+       case JSON_C_VISIT_RETURN_CONTINUE:
+       case JSON_C_VISIT_RETURN_SKIP:
+       case JSON_C_VISIT_RETURN_POP:
+       case JSON_C_VISIT_RETURN_STOP:
+               return 0;
+       default:
+               return JSON_C_VISIT_RETURN_ERROR;
+       }
+}
+static int _json_c_visit(json_object *jso, json_object *parent_jso,
+                         const char *jso_key, size_t *jso_index,
+                         json_c_visit_userfunc *userfunc, void *userarg)
+{
+       int userret = userfunc(jso, 0, parent_jso, jso_key, jso_index, userarg);
+       switch(userret)
+       {
+       case JSON_C_VISIT_RETURN_CONTINUE:
+               break;
+       case JSON_C_VISIT_RETURN_SKIP:
+       case JSON_C_VISIT_RETURN_POP:
+       case JSON_C_VISIT_RETURN_STOP:
+       case JSON_C_VISIT_RETURN_ERROR:
+               return userret;
+       default:
+               fprintf(stderr, "ERROR: invalid return value from json_c_visit userfunc: %d\n", userret);
+               return JSON_C_VISIT_RETURN_ERROR;
+       }
+
+       switch(json_object_get_type(jso))
+       {
+       case json_type_null:
+       case json_type_boolean:
+       case json_type_double:
+       case json_type_int:
+       case json_type_string:
+               // we already called userfunc above, move on to the next object
+               return JSON_C_VISIT_RETURN_CONTINUE;
+
+       case json_type_object:
+       {
+               json_object_object_foreach(jso, key, child)
+               {
+                       userret = _json_c_visit(child, jso, key, NULL, userfunc, userarg);
+                       if (userret == JSON_C_VISIT_RETURN_POP)
+                               break;
+                       if (userret == JSON_C_VISIT_RETURN_STOP ||
+                               userret == JSON_C_VISIT_RETURN_ERROR)
+                               return userret;
+                       if (userret != JSON_C_VISIT_RETURN_CONTINUE &&
+                               userret != JSON_C_VISIT_RETURN_SKIP)
+                       {
+                               fprintf(stderr, "INTERNAL ERROR: _json_c_visit returned %d\n", userret);
+                               return JSON_C_VISIT_RETURN_ERROR;
+                       }
+               }
+               break;
+       }
+       case json_type_array:
+       {
+               size_t array_len = json_object_array_length(jso);
+               size_t ii;
+               for (ii = 0; ii < array_len; ii++)
+               {
+                       json_object *child = json_object_array_get_idx(jso, ii);
+                       userret = _json_c_visit(child, jso, NULL, &ii, userfunc, userarg);
+                       if (userret == JSON_C_VISIT_RETURN_POP)
+                               break;
+                       if (userret == JSON_C_VISIT_RETURN_STOP ||
+                               userret == JSON_C_VISIT_RETURN_ERROR)
+                               return userret;
+                       if (userret != JSON_C_VISIT_RETURN_CONTINUE &&
+                               userret != JSON_C_VISIT_RETURN_SKIP)
+                       {
+                               fprintf(stderr, "INTERNAL ERROR: _json_c_visit returned %d\n", userret);
+                               return JSON_C_VISIT_RETURN_ERROR;
+                       }
+               }
+               break;
+       }
+       default:
+               fprintf(stderr, "INTERNAL ERROR: _json_c_visit found object of unknown type: %d\n", json_object_get_type(jso));
+               return JSON_C_VISIT_RETURN_ERROR;
+       }
+
+       // Call userfunc for the second type on container types, after all
+       //  members of the container have been visited.
+       // Non-container types will have already returned before this point.
+
+       userret = userfunc(jso, JSON_C_VISIT_SECOND, parent_jso, jso_key, jso_index, userarg);
+       switch(userret)
+       {
+       case JSON_C_VISIT_RETURN_SKIP:
+       case JSON_C_VISIT_RETURN_POP:
+               // These are not really sensible during JSON_C_VISIT_SECOND, 
+               // but map them to JSON_C_VISIT_CONTINUE anyway.
+               // FALLTHROUGH
+       case JSON_C_VISIT_RETURN_CONTINUE:
+               return JSON_C_VISIT_RETURN_CONTINUE;
+       case JSON_C_VISIT_RETURN_STOP:
+       case JSON_C_VISIT_RETURN_ERROR:
+               return userret;
+       default:
+               fprintf(stderr, "ERROR: invalid return value from json_c_visit userfunc: %d\n", userret);
+               return JSON_C_VISIT_RETURN_ERROR;
+       }
+       // NOTREACHED
+}
+
diff --git a/json_visit.h b/json_visit.h
new file mode 100644 (file)
index 0000000..b147d99
--- /dev/null
@@ -0,0 +1,95 @@
+
+#ifndef _json_c_json_visit_h_
+#define _json_c_json_visit_h_
+
+/**
+ * @file
+ * @brief Methods for walking a tree of objects.
+ */
+#include "json_object.h"
+
+typedef int (json_c_visit_userfunc)(json_object *jso, int flags,
+                                     json_object *parent_jso,                                                        const char *jso_key,
+                                     size_t *jso_index, void *userarg);
+
+/**
+ * Visit each object in the JSON hierarchy starting at jso.
+ * For each object, userfunc is called, passing the object and userarg.
+ * If the object has a parent (i.e. anything other than jso itself)
+ * its parent will be passed as parent_jso, and either jso_key or jso_index
+ * will be set, depending on whether the parent is an object or an array.
+ *
+ * Nodes will be visited depth first, but containers (arrays and objects)
+ * will be visited twice, the second time with JSON_C_VISIT_SECOND set in
+ * flags.
+ *
+ * userfunc must return one of the defined return values, to indicate
+ * whether and how to continue visiting nodes, or one of various ways to stop.
+ *
+ * Returns 0 if nodes were visited successfully, even if some were 
+ *  intentionally skipped due to what userfunc returned.
+ * Returns <0 if an error occurred during iteration, including if
+ *  userfunc returned JSON_C_VISIT_RETURN_ERROR.
+ */
+int json_c_visit(json_object *jso, int future_flags,
+                 json_c_visit_userfunc *userfunc, void *userarg);
+
+/**
+ * Passed to json_c_visit_userfunc as one of the flags values to indicate
+ * that this is the second time a container (array or object) is being
+ * called, after all of it's members have been iterated over.
+ */
+#define JSON_C_VISIT_SECOND  0x02
+
+/**
+ * This json_c_visit_userfunc return value indicates that iteration
+ * should proceed normally.
+ */
+#define JSON_C_VISIT_RETURN_CONTINUE 0
+
+
+/**
+ * This json_c_visit_userfunc return value indicates that iteration
+ * over the members of the current object should be skipped.
+ * If the current object isn't a container (array or object), this
+ * is no different than JSON_C_VISIT_RETURN_CONTINUE.
+ */
+#define JSON_C_VISIT_RETURN_SKIP 7547
+
+/**
+ * This json_c_visit_userfunc return value indicates that iteration
+ * of the fields/elements of the <b>containing</b> object should stop
+ * and continue "popped up" a level of the object hierarchy.
+ * For example, returning this when handling arg will result in 
+ * arg3 and any other fields being skipped.   The next call to userfunc
+ * will be the JSON_C_VISIT_SECOND call on "foo", followed by a userfunc
+ * call on "bar".
+ * <pre>
+ * {
+ *   "foo": {
+ *     "arg1": 1,
+ *     "arg2": 2,
+ *     "arg3": 3,
+ *     ...
+ *   },
+ *   "bar": {
+ *     ...
+ *   }
+ * }
+ * </pre>
+ */
+#define JSON_C_VISIT_RETURN_POP 767
+
+/**
+ * This json_c_visit_userfunc return value indicates that iteration
+ * should stop immediately, and cause json_c_visit to return success.
+ */
+#define JSON_C_VISIT_RETURN_STOP 7867
+
+/**
+ * This json_c_visit_userfunc return value indicates that iteration
+ * should stop immediately, and cause json_c_visit to return an error.
+ */
+#define JSON_C_VISIT_RETURN_ERROR -1
+
+#endif /* _json_c_json_visit_h_ */
index 5284fd0..b19df42 100644 (file)
--- a/libjson.c
+++ b/libjson.c
@@ -16,7 +16,7 @@
 #define __warn_references(sym,msg)    /* nothing */
 #endif
 
-#endif 
+#endif
 
 #include "json_object.h"
 
index 712c387..5497061 100644 (file)
@@ -10,6 +10,8 @@
  *
  */
 
+#include "config.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 # include <endian.h>    /* attempt to define endianness */
 #endif
 
+#if defined(_MSC_VER) || defined(__MINGW32__)
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>   /* Get InterlockedCompareExchange */
+#endif
+
 #include "random_seed.h"
 #include "linkhash.h"
 
+/* hash functions */
+static unsigned long lh_char_hash(const void *k);
+static unsigned long lh_perllike_str_hash(const void *k);
+static lh_hash_fn *char_hash_fn = lh_char_hash;
+
+int
+json_global_set_string_hash(const int h)
+{
+       switch(h) {
+       case JSON_C_STR_HASH_DFLT:
+               char_hash_fn = lh_char_hash;
+               break;
+       case JSON_C_STR_HASH_PERLLIKE:
+               char_hash_fn = lh_perllike_str_hash;
+               break;
+       default:
+               return -1;
+       }
+       return 0;
+}
+
 void lh_abort(const char *msg, ...)
 {
        va_list ap;
@@ -33,7 +61,7 @@ void lh_abort(const char *msg, ...)
        exit(1);
 }
 
-unsigned long lh_ptr_hash(const void *k)
+static unsigned long lh_ptr_hash(const void *k)
 {
        /* CAW: refactored to be 64bit nice */
        return (unsigned long)((((ptrdiff_t)k * LH_PRIME) >> 4) & ULONG_MAX);
@@ -44,7 +72,7 @@ int lh_ptr_equal(const void *k1, const void *k2)
        return (k1 == k2);
 }
 
-/* 
+/*
  * hashlittle from lookup3.c, by Bob Jenkins, May 2006, Public Domain.
  * http://burtleburtle.net/bob/c/lookup3.c
  * minor modifications to make functions static so no symbols are exported
@@ -56,8 +84,8 @@ int lh_ptr_equal(const void *k1, const void *k2)
 lookup3.c, by Bob Jenkins, May 2006, Public Domain.
 
 These are functions for producing 32-bit hashes for hash table lookup.
-hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final() 
-are externally useful functions.  Routines to test the hash are included 
+hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final()
+are externally useful functions.  Routines to test the hash are included
 if SELF_TEST is defined.  You can use this free for any purpose.  It's in
 the public domain.  It has no warranty.
 
@@ -65,7 +93,7 @@ You probably want to use hashlittle().  hashlittle() and hashbig()
 hash byte arrays.  hashlittle() is is faster than hashbig() on
 little-endian machines.  Intel and AMD are little-endian machines.
 On second thought, you probably want hashlittle2(), which is identical to
-hashlittle() except it returns two 32-bit hashes for the price of one.  
+hashlittle() except it returns two 32-bit hashes for the price of one.
 You could implement hashbig2() if you wanted but I haven't bothered here.
 
 If you want to find a hash of, say, exactly 7 integers, do
@@ -78,9 +106,9 @@ If you want to find a hash of, say, exactly 7 integers, do
 then use c as the hash value.  If you have a variable length array of
 4-byte integers to hash, use hashword().  If you have a byte array (like
 a character string), use hashlittle().  If you have several byte arrays, or
-a mix of things, see the comments above hashlittle().  
+a mix of things, see the comments above hashlittle().
 
-Why is this so big?  I read 12 bytes at a time into 3 4-byte integers, 
+Why is this so big?  I read 12 bytes at a time into 3 4-byte integers,
 then mix those integers.  This is fast (you can do a lot more thorough
 mixing with 12*3 instructions on 3 integers than you can with 3 instructions
 on 1 byte), but shoehorning those bytes into integers efficiently is messy.
@@ -129,7 +157,7 @@ This was tested for:
   the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
   is commonly produced by subtraction) look like a single 1-bit
   difference.
-* the base values were pseudorandom, all zero but one bit set, or 
+* the base values were pseudorandom, all zero but one bit set, or
   all zero plus a counter that starts at zero.
 
 Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that
@@ -139,7 +167,7 @@ satisfy this are
    14  9  3  7 17  3
 Well, "9 15 3 18 27 15" didn't quite get 32 bits diffing
 for "differ" defined as + with a one-bit base and a two-bit delta.  I
-used http://burtleburtle.net/bob/hash/avalanche.html to choose 
+used http://burtleburtle.net/bob/hash/avalanche.html to choose
 the operations, constants, and arrangements of the variables.
 
 This does not achieve avalanche.  There are input bits of (a,b,c)
@@ -178,7 +206,7 @@ produce values of c that look totally different.  This was tested for
   the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
   is commonly produced by subtraction) look like a single 1-bit
   difference.
-* the base values were pseudorandom, all zero but one bit set, or 
+* the base values were pseudorandom, all zero but one bit set, or
   all zero plus a counter that starts at zero.
 
 These constants passed:
@@ -253,7 +281,7 @@ static uint32_t hashlittle( const void *key, size_t length, uint32_t initval)
     }
 
     /*----------------------------- handle the last (probably partial) block */
-    /* 
+    /*
      * "k[2]&0xffffff" actually reads beyond the end of the string, but
      * then masks off the part it's not allowed to read.  Because the
      * string is aligned, the masked-off tail is in the same word as the
@@ -261,8 +289,19 @@ static uint32_t hashlittle( const void *key, size_t length, uint32_t initval)
      * does it on word boundaries, so is OK with this.  But VALGRIND will
      * still catch it and complain.  The masking trick does make the hash
      * noticably faster for short strings (like English words).
+     * AddressSanitizer is similarly picky about overrunning
+        * the buffer. (http://clang.llvm.org/docs/AddressSanitizer.html
      */
-#ifndef VALGRIND
+#ifdef VALGRIND
+#    define PRECISE_MEMORY_ACCESS 1
+#elif defined(__SANITIZE_ADDRESS__) /* GCC's ASAN */
+#    define PRECISE_MEMORY_ACCESS 1
+#elif defined(__has_feature)
+#  if __has_feature(address_sanitizer) /* Clang's ASAN */
+#    define PRECISE_MEMORY_ACCESS 1
+#  endif
+#endif
+#ifndef PRECISE_MEMORY_ACCESS
 
     switch(length)
     {
@@ -376,17 +415,17 @@ static uint32_t hashlittle( const void *key, size_t length, uint32_t initval)
     /*-------------------------------- last block: affect all 32 bits of (c) */
     switch(length)                   /* all the case statements fall through */
     {
-    case 12: c+=((uint32_t)k[11])<<24;
-    case 11: c+=((uint32_t)k[10])<<16;
-    case 10: c+=((uint32_t)k[9])<<8;
-    case 9 : c+=k[8];
-    case 8 : b+=((uint32_t)k[7])<<24;
-    case 7 : b+=((uint32_t)k[6])<<16;
-    case 6 : b+=((uint32_t)k[5])<<8;
-    case 5 : b+=k[4];
-    case 4 : a+=((uint32_t)k[3])<<24;
-    case 3 : a+=((uint32_t)k[2])<<16;
-    case 2 : a+=((uint32_t)k[1])<<8;
+    case 12: c+=((uint32_t)k[11])<<24; /* FALLTHRU */
+    case 11: c+=((uint32_t)k[10])<<16; /* FALLTHRU */
+    case 10: c+=((uint32_t)k[9])<<8; /* FALLTHRU */
+    case 9 : c+=k[8]; /* FALLTHRU */
+    case 8 : b+=((uint32_t)k[7])<<24; /* FALLTHRU */
+    case 7 : b+=((uint32_t)k[6])<<16; /* FALLTHRU */
+    case 6 : b+=((uint32_t)k[5])<<8; /* FALLTHRU */
+    case 5 : b+=k[4]; /* FALLTHRU */
+    case 4 : a+=((uint32_t)k[3])<<24; /* FALLTHRU */
+    case 3 : a+=((uint32_t)k[2])<<16; /* FALLTHRU */
+    case 2 : a+=((uint32_t)k[1])<<8; /* FALLTHRU */
     case 1 : a+=k[0];
              break;
     case 0 : return c;
@@ -397,25 +436,53 @@ static uint32_t hashlittle( const void *key, size_t length, uint32_t initval)
   return c;
 }
 
-unsigned long lh_char_hash(const void *k)
+/* a simple hash function similiar to what perl does for strings.
+ * for good results, the string should not be excessivly large.
+ */
+static unsigned long lh_perllike_str_hash(const void *k) 
+{
+    const char *rkey = (const char *)k;
+    unsigned hashval = 1;
+
+    while (*rkey)
+        hashval = hashval * 33 + *rkey++;
+
+    return hashval;
+}
+
+static unsigned long lh_char_hash(const void *k)
 {
-       static volatile int random_seed = -1;
+#if defined _MSC_VER || defined __MINGW32__
+#define RANDOM_SEED_TYPE LONG
+#else
+#define RANDOM_SEED_TYPE int
+#endif
+       static volatile RANDOM_SEED_TYPE random_seed = -1;
 
        if (random_seed == -1) {
-               int seed;
+               RANDOM_SEED_TYPE seed;
                /* we can't use -1 as it is the unitialized sentinel */
                while ((seed = json_c_get_random_seed()) == -1);
-#if defined __GNUC__
-               __sync_val_compare_and_swap(&random_seed, -1, seed);
-#elif defined _MSC_VER
+#if SIZEOF_INT == 8 && defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
+#define USE_SYNC_COMPARE_AND_SWAP 1
+#endif
+#if SIZEOF_INT == 4 && defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
+#define USE_SYNC_COMPARE_AND_SWAP 1
+#endif
+#if SIZEOF_INT == 2 && defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
+#define USE_SYNC_COMPARE_AND_SWAP 1
+#endif
+#if defined USE_SYNC_COMPARE_AND_SWAP
+               (void)__sync_val_compare_and_swap(&random_seed, -1, seed);
+#elif defined _MSC_VER || defined __MINGW32__
                InterlockedCompareExchange(&random_seed, seed, -1);
 #else
-#warning "racy random seed initializtion if used by multiple threads"
+//#warning "racy random seed initializtion if used by multiple threads"
                random_seed = seed; /* potentially racy */
 #endif
        }
 
-       return hashlittle((const char*)k, strlen((const char*)k), random_seed); 
+       return hashlittle((const char*)k, strlen((const char*)k), random_seed);
 }
 
 int lh_char_equal(const void *k1, const void *k2)
@@ -423,7 +490,7 @@ int lh_char_equal(const void *k1, const void *k2)
        return (strcmp((const char*)k1, (const char*)k2) == 0);
 }
 
-struct lh_table* lh_table_new(int size, const char *name,
+struct lh_table* lh_table_new(int size,
                              lh_entry_free_fn *free_fn,
                              lh_hash_fn *hash_fn,
                              lh_equal_fn *equal_fn)
@@ -432,12 +499,17 @@ struct lh_table* lh_table_new(int size, const char *name,
        struct lh_table *t;
 
        t = (struct lh_table*)calloc(1, sizeof(struct lh_table));
-       if(!t) lh_abort("lh_table_new: calloc failed\n");
+       if (!t)
+               return NULL;
+
        t->count = 0;
        t->size = size;
-       t->name = name;
        t->table = (struct lh_entry*)calloc(size, sizeof(struct lh_entry));
-       if(!t->table) lh_abort("lh_table_new: calloc failed\n");
+       if (!t->table)
+       {
+               free(t);
+               return NULL;
+       }
        t->free_fn = free_fn;
        t->hash_fn = hash_fn;
        t->equal_fn = equal_fn;
@@ -445,68 +517,78 @@ struct lh_table* lh_table_new(int size, const char *name,
        return t;
 }
 
-struct lh_table* lh_kchar_table_new(int size, const char *name,
+struct lh_table* lh_kchar_table_new(int size,
                                    lh_entry_free_fn *free_fn)
 {
-       return lh_table_new(size, name, free_fn, lh_char_hash, lh_char_equal);
+       return lh_table_new(size, free_fn, char_hash_fn, lh_char_equal);
 }
 
-struct lh_table* lh_kptr_table_new(int size, const char *name,
+struct lh_table* lh_kptr_table_new(int size,
                                   lh_entry_free_fn *free_fn)
 {
-       return lh_table_new(size, name, free_fn, lh_ptr_hash, lh_ptr_equal);
+       return lh_table_new(size, free_fn, lh_ptr_hash, lh_ptr_equal);
 }
 
-void lh_table_resize(struct lh_table *t, int new_size)
+int lh_table_resize(struct lh_table *t, int new_size)
 {
        struct lh_table *new_t;
        struct lh_entry *ent;
 
-       new_t = lh_table_new(new_size, t->name, NULL, t->hash_fn, t->equal_fn);
-       ent = t->head;
-       while(ent) {
-               lh_table_insert(new_t, ent->k, ent->v);
-               ent = ent->next;
+       new_t = lh_table_new(new_size, NULL, t->hash_fn, t->equal_fn);
+       if (new_t == NULL)
+               return -1;
+
+       for (ent = t->head; ent != NULL; ent = ent->next)
+       {
+               unsigned long h = lh_get_hash(new_t, ent->k);
+               unsigned int opts = 0;
+               if (ent->k_is_constant)
+                       opts = JSON_C_OBJECT_KEY_IS_CONSTANT;
+               if (lh_table_insert_w_hash(new_t, ent->k, ent->v, h, opts) != 0)
+               {
+                       lh_table_free(new_t);
+                       return -1;
+               }
        }
        free(t->table);
        t->table = new_t->table;
        t->size = new_size;
        t->head = new_t->head;
        t->tail = new_t->tail;
-       t->resizes++;
        free(new_t);
+
+       return 0;
 }
 
 void lh_table_free(struct lh_table *t)
 {
        struct lh_entry *c;
-       for(c = t->head; c != NULL; c = c->next) {
-               if(t->free_fn) {
+       if(t->free_fn) {
+               for(c = t->head; c != NULL; c = c->next)
                        t->free_fn(c);
-               }
        }
        free(t->table);
        free(t);
 }
 
 
-int lh_table_insert(struct lh_table *t, void *k, const void *v)
+int lh_table_insert_w_hash(struct lh_table *t, const void *k, const void *v, const unsigned long h, const unsigned opts)
 {
-       unsigned long h, n;
+       unsigned long n;
 
-       t->inserts++;
-       if(t->count >= t->size * LH_LOAD_FACTOR) lh_table_resize(t, t->size * 2);
+       if (t->count >= t->size * LH_LOAD_FACTOR)
+               if (lh_table_resize(t, t->size * 2) != 0)
+                       return -1;
 
-       h = t->hash_fn(k);
        n = h % t->size;
 
        while( 1 ) {
                if(t->table[n].k == LH_EMPTY || t->table[n].k == LH_FREED) break;
-               t->collisions++;
                if ((int)++n == t->size) n = 0;
        }
 
        t->table[n].k = k;
+       t->table[n].k_is_constant = (opts & JSON_C_OBJECT_KEY_IS_CONSTANT);
        t->table[n].v = v;
        t->count++;
 
@@ -522,15 +604,17 @@ int lh_table_insert(struct lh_table *t, void *k, const void *v)
 
        return 0;
 }
+int lh_table_insert(struct lh_table *t, const void *k, const void *v)
+{
+       return lh_table_insert_w_hash(t, k, v, lh_get_hash(t, k), 0);
+}
 
 
-struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k)
+struct lh_entry* lh_table_lookup_entry_w_hash(struct lh_table *t, const void *k, const unsigned long h)
 {
-       unsigned long h = t->hash_fn(k);
        unsigned long n = h % t->size;
        int count = 0;
 
-       t->lookups++;
        while( count < t->size ) {
                if(t->table[n].k == LH_EMPTY) return NULL;
                if(t->table[n].k != LH_FREED &&
@@ -541,6 +625,10 @@ struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k)
        return NULL;
 }
 
+struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k)
+{
+       return lh_table_lookup_entry_w_hash(t, k, lh_get_hash(t, k));
+}
 
 const void* lh_table_lookup(struct lh_table *t, const void *k)
 {
@@ -553,11 +641,11 @@ json_bool lh_table_lookup_ex(struct lh_table* t, const void* k, void **v)
 {
        struct lh_entry *e = lh_table_lookup_entry(t, k);
        if (e != NULL) {
-               if (v != NULL) *v = (void *)e->v;
+               if (v != NULL) *v = lh_entry_v(e);
                return TRUE; /* key found */
        }
        if (v != NULL) *v = NULL;
-       return FALSE; /* key not found */
+               return FALSE; /* key not found */
 }
 
 int lh_table_delete_entry(struct lh_table *t, struct lh_entry *e)
index 950d09f..9c2f5c1 100644 (file)
@@ -9,7 +9,13 @@
  * it under the terms of the MIT license. See COPYING for details.
  *
  */
+
+/**
+ * @file
+ * @brief Internal methods for working with json_type_object objects.  Although
+ *        this is exposed by the json_object_get_object() function and within the
+ *        json_object_iter type, it is not recommended for direct use.
+ */
 #ifndef _linkhash_h_
 #define _linkhash_h_
 
@@ -26,7 +32,7 @@ extern "C" {
 
 /**
  * The fraction of filled hash buckets until an insert will cause the table
- * to be resized.  
+ * to be resized.
  * This can range from just above 0 up to 1.0.
  */
 #define LH_LOAD_FACTOR 0.66
@@ -41,6 +47,23 @@ extern "C" {
  */
 #define LH_FREED (void*)-2
 
+/**
+ * default string hash function
+ */
+#define JSON_C_STR_HASH_DFLT 0
+
+/**
+ * perl-like string hash function
+ */
+#define JSON_C_STR_HASH_PERLLIKE 1
+
+/**
+ * This function sets the hash function to be used for strings.
+ * Must be one of the JSON_C_STR_HASH_* values.
+ * @returns 0 - ok, -1 if parameter was invalid
+ */
+int json_global_set_string_hash(const int h);
+
 struct lh_entry;
 
 /**
@@ -61,11 +84,16 @@ typedef int (lh_equal_fn) (const void *k1, const void *k2);
  */
 struct lh_entry {
        /**
-        * The key.
+        * The key.  Use lh_entry_k() instead of accessing this directly.
+        */
+       const void *k;
+       /**
+        * A flag for users of linkhash to know whether or not they
+        * need to free k.
         */
-       void *k;
+       int k_is_constant;
        /**
-        * The value.
+        * The value.  Use lh_entry_v() instead of accessing this directly.
         */
        const void *v;
        /**
@@ -93,36 +121,6 @@ struct lh_table {
        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;
@@ -141,16 +139,7 @@ struct lh_table {
        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);
+typedef struct lh_table lh_table;
 
 
 /**
@@ -161,6 +150,10 @@ for(entry = table->head; entry; entry = entry->next)
 
 /**
  * lh_foreach_safe allows calling of deletion routine while iterating.
+ *
+ * @param table a struct lh_table * to iterate over
+ * @param entry a struct lh_entry * variable to hold each element
+ * @param tmp a struct lh_entry * variable to hold a temporary pointer to the next element
  */
 #define lh_foreach_safe(table, entry, tmp) \
 for(entry = table->head; entry && ((tmp = entry->next) || 1); entry = tmp)
@@ -169,9 +162,9 @@ 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
@@ -182,41 +175,44 @@ for(entry = table->head; entry && ((tmp = entry->next) || 1); entry = tmp)
  * @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.
+ * @return On success, a pointer to the new linkhash table is returned.
+ *     On error, a null pointer is returned.
  */
-extern struct lh_table* lh_table_new(int size, const char *name,
+extern struct lh_table* lh_table_new(int size,
                                     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.
+ * 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.
+ * @return On success, a pointer to the new linkhash table is returned.
+ *     On error, a null pointer is returned.
  */
-extern struct lh_table* lh_kchar_table_new(int size, const char *name,
+extern struct lh_table* lh_kchar_table_new(int size,
                                           lh_entry_free_fn *free_fn);
 
 
 /**
- * Convenience function to create a new linkhash
- * table with ptr keys.
+ * 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.
+ * @return On success, a pointer to the new linkhash table is returned.
+ *     On error, a null pointer is returned.
  */
-extern struct lh_table* lh_kptr_table_new(int size, const char *name,
+extern struct lh_table* lh_kptr_table_new(int size,
                                          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.
+ *
+ * If a lh_entry_free_fn callback free function was 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);
@@ -224,15 +220,37 @@ 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.
+ *
+ * @return On success, <code>0</code> is returned.
+ *     On error, a negative value is returned.
  */
-extern int lh_table_insert(struct lh_table *t, void *k, const void *v);
+extern int lh_table_insert(struct lh_table *t, const void *k, const void *v);
 
 
 /**
- * Lookup a record into the table.
+ * Insert a record into the table using a precalculated key hash.
+ *
+ * The hash h, which should be calculated with lh_get_hash() on k, is provided by
+ *  the caller, to allow for optimization when multiple operations with the same
+ *  key are known to be needed.
+ *
+ * @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.
+ * @param h hash value of the key to insert
+ * @param opts if set to JSON_C_OBJECT_KEY_IS_CONSTANT, sets lh_entry.k_is_constant
+ *             so t's free function knows to avoid freeing the key.
+ */
+extern int lh_table_insert_w_hash(struct lh_table *t, const void *k, const void *v, const unsigned long h, const unsigned opts);
+
+
+/**
+ * Lookup a record in 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.
@@ -240,16 +258,32 @@ extern int lh_table_insert(struct lh_table *t, void *k, const void *v);
 extern struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k);
 
 /**
- * Lookup a record into the table
+ * Lookup a record in the table using a precalculated key hash.
+ *
+ * The hash h, which should be calculated with lh_get_hash() on k, is provided by
+ *  the caller, to allow for optimization when multiple operations with the same
+ *  key are known to be needed.
+ *
+ * @param t the table to lookup
+ * @param k a pointer to the key to lookup
+ * @param h hash value of 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_w_hash(struct lh_table *t, const void *k, const unsigned long h);
+
+/**
+ * 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.
+ * @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
+ * 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).
@@ -259,6 +293,7 @@ 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.
@@ -271,6 +306,7 @@ 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.
@@ -282,8 +318,86 @@ 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);
+/**
+ * Prints a message to <code>stdout</code>,
+ * then exits the program with an exit code of <code>1</code>.
+ *
+ * @param msg Message format string, like for <code>printf</code>.
+ * @param ... Format args.
+ *
+ * @deprecated Since it is not a good idea to exit the entire program
+ *     because of an internal library failure, json-c will no longer
+ *     use this function internally.
+ *     However, because its interface is public, it will remain part of
+ *     the API on the off chance of legacy software using it externally.
+ */
+THIS_FUNCTION_IS_DEPRECATED(void lh_abort(const char *msg, ...));
+
+/**
+ * Resizes the specified table.
+ *
+ * @param t Pointer to table to resize.
+ * @param new_size New table size. Must be positive.
+ *
+ * @return On success, <code>0</code> is returned.
+ *     On error, a negative value is returned.
+ */
+int lh_table_resize(struct lh_table *t, int new_size);
+
+
+/**
+ * @deprecated Don't use this outside of linkhash.h:
+ */
+#if !defined(_MSC_VER) || (_MSC_VER > 1800)
+/* VS2010 can't handle inline funcs, so skip it there */
+#define _LH_INLINE inline
+#else
+#define _LH_INLINE
+#endif
+
+/**
+ * Calculate the hash of a key for a given table.
+ *
+ * This is an exension to support functions that need to calculate
+ * the hash several times and allows them to do it just once and then pass
+ * in the hash to all utility functions. Depending on use case, this can be a
+ * considerable performance improvement.
+ * @param t the table (used to obtain hash function)
+ * @param k a pointer to the key to lookup
+ * @return the key's hash
+ */
+static _LH_INLINE unsigned long lh_get_hash(const struct lh_table *t, const void *k)
+{
+       return t->hash_fn(k);
+}
+
+#undef _LH_INLINE
+
+/**
+ * @deprecated Don't use this outside of linkhash.h:
+ */
+#ifdef __UNCONST
+#define _LH_UNCONST(a) __UNCONST(a)
+#else
+#define _LH_UNCONST(a) ((void *)(uintptr_t)(const void *)(a))
+#endif
+
+/**
+ * Return a non-const version of lh_entry.k.
+ *
+ * lh_entry.k is const to indicate and help ensure that linkhash itself doesn't modify
+ * it, but callers are allowed to do what they want with it.
+ * See also lh_entry.k_is_constant
+ */
+#define lh_entry_k(entry) _LH_UNCONST((entry)->k)
+
+/**
+ * Return a non-const version of lh_entry.v.
+ *
+ * v is const to indicate and help ensure that linkhash itself doesn't modify
+ * it, but callers are allowed to do what they want with it.
+ */
+#define lh_entry_v(entry) _LH_UNCONST((entry)->v)
 
 #ifdef __cplusplus
 }
index f53abfd..bffda54 100644 (file)
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -70,7 +70,7 @@
 #         compiler:            $LTCC
 #         compiler flags:              $LTCFLAGS
 #         linker:              $LD (gnu? $with_gnu_ld)
-#         $progname:   (GNU libtool) 2.4.2
+#         $progname:   (GNU libtool) 2.4.2 Debian-2.4.2-1.11
 #         automake:    $automake_version
 #         autoconf:    $autoconf_version
 #
@@ -80,7 +80,7 @@
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION=2.4.2
+VERSION="2.4.2 Debian-2.4.2-1.11"
 TIMESTAMP=""
 package_revision=1.3337
 
@@ -133,9 +133,8 @@ $lt_unset CDPATH
 # function.
 progpath="$0"
 
-unset CP
-unset MV
-unset RM
+
+
 : ${CP="cp -f"}
 test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
 : ${MAKE="make"}
@@ -6125,7 +6124,10 @@ func_mode_link ()
        case $pass in
        dlopen) libs="$dlfiles" ;;
        dlpreopen) libs="$dlprefiles" ;;
-       link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+       link)
+         libs="$deplibs %DEPLIBS%"
+         test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+         ;;
        esac
       fi
       if test "$linkmode,$pass" = "lib,dlpreopen"; then
@@ -6445,19 +6447,19 @@ func_mode_link ()
            # It is a libtool convenience library, so add in its objects.
            func_append convenience " $ladir/$objdir/$old_library"
            func_append old_convenience " $ladir/$objdir/$old_library"
+           tmp_libs=
+           for deplib in $dependency_libs; do
+             deplibs="$deplib $deplibs"
+             if $opt_preserve_dup_deps ; then
+               case "$tmp_libs " in
+               *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+               esac
+             fi
+             func_append tmp_libs " $deplib"
+           done
          elif test "$linkmode" != prog && test "$linkmode" != lib; then
            func_fatal_error "\`$lib' is not a convenience library"
          fi
-         tmp_libs=
-         for deplib in $dependency_libs; do
-           deplibs="$deplib $deplibs"
-           if $opt_preserve_dup_deps ; then
-             case "$tmp_libs " in
-             *" $deplib "*) func_append specialdeplibs " $deplib" ;;
-             esac
-           fi
-           func_append tmp_libs " $deplib"
-         done
          continue
        fi # $pass = conv
 
@@ -7350,6 +7352,9 @@ func_mode_link ()
            revision="$number_minor"
            lt_irix_increment=no
            ;;
+         *)
+           func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+           ;;
          esac
          ;;
        no)
@@ -7392,7 +7397,6 @@ func_mode_link ()
        # Calculate the version variables.
        major=
        versuffix=
-       versuffix2=
        verstring=
        case $version_type in
        none) ;;
@@ -7453,7 +7457,6 @@ func_mode_link ()
          func_arith $current - $age
          major=.$func_arith_result
          versuffix="$major.$age.$revision"
-         versuffix2="$major.$age"
          ;;
 
        osf)
@@ -7514,10 +7517,8 @@ func_mode_link ()
          esac
          if test "$need_version" = no; then
            versuffix=
-           versuffix2=
          else
            versuffix=".0.0"
-           versuffix2=".0.0"
          fi
        fi
 
@@ -7525,7 +7526,6 @@ func_mode_link ()
        if test "$avoid_version" = yes && test "$need_version" = no; then
          major=
          versuffix=
-         versuffix2=
          verstring=""
        fi
 
@@ -7636,7 +7636,7 @@ func_mode_link ()
          *-*-netbsd*)
            # Don't link with libc until the a.out ld.so is fixed.
            ;;
-         *-*-openbsd* | *-*-mirbsd* | *-*-freebsd* | *-*-dragonfly*)
+         *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
            # Do not include libc due to us having libc/libc_r.
            ;;
          *-*-sco3.2v5* | *-*-sco5v6*)
@@ -7659,14 +7659,12 @@ func_mode_link ()
        libname_save=$libname
        release_save=$release
        versuffix_save=$versuffix
-       versuffix2_save=$versuffix2
        major_save=$major
        # I'm not sure if I'm treating the release correctly.  I think
        # release should show up in the -l (ie -lgmp5) so we don't want to
        # add it in twice.  Is that correct?
        release=""
        versuffix=""
-       versuffix2=""
        major=""
        newdeplibs=
        droppeddeps=no
@@ -7943,7 +7941,6 @@ EOF
          ;;
        esac
        versuffix=$versuffix_save
-       versuffix2=$versuffix2_save
        major=$major_save
        release=$release_save
        libname=$libname_save
index f40b8fa..d530537 100644 (file)
@@ -1,7 +1,12 @@
 #ifndef __math_compat_h
 #define __math_compat_h
 
-/* Define isnan and isinf on Windows/MSVC */
+/**
+ * @file
+ * @brief Do not use, json-c internal, may be changed or removed at any time.
+ */
+
+/* Define isnan, isinf, infinity and nan on Windows/MSVC */
 
 #ifndef HAVE_DECL_ISNAN
 # ifdef HAVE_DECL__ISNAN
 # endif
 #endif
 
-#ifndef HAVE_DECL_NAN
-#error This platform does not have nan()
+#ifndef HAVE_DECL_INFINITY
+#include <float.h>
+#define INFINITY (DBL_MAX + DBL_MAX)
+#define HAVE_DECL_INFINITY
 #endif
 
-#ifndef HAVE_DECL_INFINITY
-#error This platform does not have INFINITY
+#ifndef HAVE_DECL_NAN
+#define NAN (INFINITY - INFINITY)
+#define HAVE_DECL_NAN
 #endif
 
 #endif
diff --git a/missing b/missing
index cdea514..db98974 100755 (executable)
--- a/missing
+++ b/missing
@@ -1,7 +1,7 @@
 #! /bin/sh
 # Common wrapper for a few potentially missing GNU programs.
 
-scriptversion=2012-06-26.16; # UTC
+scriptversion=2013-10-28.13; # UTC
 
 # Copyright (C) 1996-2013 Free Software Foundation, Inc.
 # Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
@@ -160,7 +160,7 @@ give_advice ()
       ;;
    autom4te*)
       echo "You might have modified some maintainer files that require"
-      echo "the 'automa4te' program to be rebuilt."
+      echo "the 'autom4te' program to be rebuilt."
       program_details 'autom4te'
       ;;
     bison*|yacc*)
index 9d56522..6c77b5d 100644 (file)
 # error Not enough var arg support!
 #endif /* HAVE_STDARG_H */
 
-#include "bits.h"
 #include "debug.h"
 #include "printbuf.h"
+#include "snprintf_compat.h"
+#include "vasprintf_compat.h"
 
 static int printbuf_extend(struct printbuf *p, int min_size);
 
@@ -43,6 +44,7 @@ struct printbuf* printbuf_new(void)
     free(p);
     return NULL;
   }
+  p->buf[0]= '\0';
   return p;
 }
 
@@ -63,7 +65,9 @@ static int printbuf_extend(struct printbuf *p, int min_size)
        if (p->size >= min_size)
                return 0;
 
-       new_size = json_max(p->size * 2, min_size + 8);
+       new_size = p->size * 2;
+       if (new_size < min_size + 8)
+               new_size =  min_size + 8;
 #ifdef PRINTBUF_DEBUG
        MC_DEBUG("printbuf_memappend: realloc "
          "bpos=%d min_size=%d old_size=%d new_size=%d\n",
@@ -108,47 +112,6 @@ int printbuf_memset(struct printbuf *pb, int offset, int charvalue, int len)
        return 0;
 }
 
-#if !defined(HAVE_VSNPRINTF) && defined(_MSC_VER)
-# define vsnprintf _vsnprintf
-#elif !defined(HAVE_VSNPRINTF) /* !HAVE_VSNPRINTF */
-# error Need vsnprintf!
-#endif /* !HAVE_VSNPRINTF && defined(WIN32) */
-
-#if !defined(HAVE_VASPRINTF)
-/* CAW: compliant version of vasprintf */
-static int vasprintf(char **buf, const char *fmt, va_list ap)
-{
-#ifndef WIN32
-       static char _T_emptybuffer = '\0';
-#endif /* !defined(WIN32) */
-       int chars;
-       char *b;
-
-       if(!buf) { return -1; }
-
-#ifdef WIN32
-       chars = _vscprintf(fmt, ap)+1;
-#else /* !defined(WIN32) */
-       /* CAW: RAWR! We have to hope to god here that vsnprintf doesn't overwrite
-          our buffer like on some 64bit sun systems.... but hey, its time to move on */
-       chars = vsnprintf(&_T_emptybuffer, 0, fmt, ap)+1;
-       if(chars < 0) { chars *= -1; } /* CAW: old glibc versions have this problem */
-#endif /* defined(WIN32) */
-
-       b = (char*)malloc(sizeof(char)*chars);
-       if(!b) { return -1; }
-
-       if((chars = vsprintf(b, fmt, ap)) < 0)
-       {
-               free(b);
-       } else {
-               *buf = b;
-       }
-
-       return chars;
-}
-#endif /* !HAVE_VASPRINTF */
-
 int sprintbuf(struct printbuf *p, const char *msg, ...)
 {
   va_list ap;
index b1bde7f..567a6a0 100644 (file)
  * (http://www.opensource.org/licenses/mit-license.php)
  */
 
+/**
+ * @file
+ * @brief Internal string buffer handing.  Unless you're writing a 
+ *        json_object_to_json_string_fn implementation for use with
+ *        json_object_set_serializer() direct use of this is not
+ *        recommended.
+ */
 #ifndef _printbuf_h_
 #define _printbuf_h_
 
@@ -25,16 +32,18 @@ struct printbuf {
   int bpos;
   int size;
 };
+typedef struct printbuf printbuf;
 
 extern struct printbuf*
 printbuf_new(void);
 
-/* As an optimization, printbuf_memappend_fast is defined as a macro
+/* 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
+ * it invokes printbuf_memappend() 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.
+ *
+ * Your code should not use printbuf_memappend() directly unless it
+ * checks the return code. Use printbuf_memappend_fast() instead.
  */
 extern int
 printbuf_memappend(struct printbuf *p, const char *buf, int size);
@@ -51,6 +60,28 @@ do {                                                         \
 #define printbuf_length(p) ((p)->bpos)
 
 /**
+ * Results in a compile error if the argument is not a string literal.
+ */
+#define _printbuf_check_literal(mystr) ("" mystr)
+
+/**
+ * This is an optimization wrapper around printbuf_memappend() that is useful
+ * for appending string literals. Since the size of string constants is known
+ * at compile time, using this macro can avoid a costly strlen() call. This is
+ * especially helpful when a constant string must be appended many times. If
+ * you got here because of a compilation error caused by passing something
+ * other than a string literal, use printbuf_memappend_fast() in conjunction
+ * with strlen().
+ *
+ * See also:
+ *   printbuf_memappend_fast()
+ *   printbuf_memappend()
+ *   sprintbuf()
+ */
+#define printbuf_strappend(pb, str) \
+   printbuf_memappend ((pb), _printbuf_check_literal(str), sizeof(str) - 1)
+
+/**
  * Set len bytes of the buffer to charvalue, starting at offset offset.
  * Similar to calling memset(x, charvalue, len);
  *
@@ -61,6 +92,20 @@ do {                                                         \
 extern int
 printbuf_memset(struct printbuf *pb, int offset, int charvalue, int len);
 
+/**
+ * Formatted print to printbuf.
+ *
+ * This function is the most expensive of the available functions for appending
+ * string data to a printbuf and should be used only where convenience is more
+ * important than speed. Avoid using this function in high performance code or
+ * tight loops; in these scenarios, consider using snprintf() with a static
+ * buffer in conjunction with one of the printbuf_*append() functions.
+ *
+ * See also:
+ *   printbuf_memappend_fast()
+ *   printbuf_memappend()
+ *   printbuf_strappend()
+ */
 extern int
 sprintbuf(struct printbuf *p, const char *msg, ...);
 
index 3b520d4..3232777 100644 (file)
@@ -9,8 +9,10 @@
  *
  */
 
+#include "strerror_override.h"
 #include <stdio.h>
 #include "config.h"
+#include "random_seed.h"
 
 #define DEBUG_SEED(s)
 
@@ -127,7 +129,6 @@ retry:
 #include <string.h>
 #include <fcntl.h>
 #include <unistd.h>
-#include <errno.h>
 #include <stdlib.h>
 #include <sys/stat.h>
 
@@ -150,23 +151,20 @@ static int has_dev_urandom()
 static int get_dev_random_seed()
 {
     DEBUG_SEED("get_dev_random_seed");
-    
+
     int fd = open(dev_random_file, O_RDONLY);
     if (fd < 0) {
         fprintf(stderr, "error opening %s: %s", dev_random_file, strerror(errno));
         exit(1);
     }
-    
+
     int r;
     ssize_t nread = read(fd, &r, sizeof(r));
     if (nread != sizeof(r)) {
-        fprintf(stderr, "error read %s: %s", dev_random_file, strerror(errno));
-        exit(1);
-    }
-    else if (nread != sizeof(r)) {
-        fprintf(stderr, "error short read %s", dev_random_file);
+        fprintf(stderr, "error short read %s: %s", dev_random_file, strerror(errno));
         exit(1);
     }
+
     close(fd);
     return r;
 }
@@ -181,27 +179,30 @@ static int get_dev_random_seed()
 #define HAVE_CRYPTGENRANDOM 1
 
 #include <windows.h>
+#include <wincrypt.h>
+#ifndef __GNUC__
 #pragma comment(lib, "advapi32.lib")
+#endif
 
 static int get_cryptgenrandom_seed()
 {
-    DEBUG_SEED("get_cryptgenrandom_seed");
-    
     HCRYPTPROV hProvider = 0;
     int r;
-    
+
+    DEBUG_SEED("get_cryptgenrandom_seed");
+
     if (!CryptAcquireContextW(&hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
         fprintf(stderr, "error CryptAcquireContextW");
         exit(1);
     }
-    
+
     if (!CryptGenRandom(hProvider, sizeof(r), (BYTE*)&r)) {
         fprintf(stderr, "error CryptGenRandom");
         exit(1);
     }
-    
+
     CryptReleaseContext(hProvider, 0);
-    
+
     return r;
 }
 
@@ -215,7 +216,7 @@ static int get_cryptgenrandom_seed()
 static int get_time_seed()
 {
     DEBUG_SEED("get_time_seed");
-    
+
     return (int)time(NULL) * 433494437;
 }
 
index 7362d67..2f43dad 100644 (file)
@@ -9,6 +9,10 @@
  *
  */
 
+/**
+ * @file
+ * @brief Do not use, json-c internal, may be changed or removed at any time.
+ */
 #ifndef seed_h
 #define seed_h
 
diff --git a/snprintf_compat.h b/snprintf_compat.h
new file mode 100644 (file)
index 0000000..8ca9b31
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef __snprintf_compat_h
+#define __snprintf_compat_h
+
+/**
+ * @file
+ * @brief Do not use, json-c internal, may be changed or removed at any time.
+ */
+
+/*
+ * Microsoft's _vsnprintf and _snprint don't always terminate
+ * the string, so use wrappers that ensure that.
+ */
+
+#include <stdarg.h>
+
+#if !defined(HAVE_SNPRINTF) && defined(_MSC_VER)
+static int json_c_vsnprintf(char *str, size_t size, const char *format, va_list ap)
+{
+       int ret;
+       ret = _vsnprintf(str, size, format, ap);
+       str[size - 1] = '\0';
+       return ret;
+}
+#define vsnprintf json_c_vsnprintf
+
+static int json_c_snprintf(char *str, size_t size, const char *format, ...)
+{
+       va_list ap;
+       int ret;
+       va_start(ap, format);
+       ret = json_c_vsnprintf(str, size, format, ap);
+       va_end(ap);
+       return ret;
+}
+#define snprintf json_c_snprintf
+
+#elif !defined(HAVE_SNPRINTF) /* !HAVE_SNPRINTF */
+# error Need vsnprintf!
+#endif /* !HAVE_SNPRINTF && defined(WIN32) */
+
+#endif /* __snprintf_compat_h */
diff --git a/strdup_compat.h b/strdup_compat.h
new file mode 100644 (file)
index 0000000..9c52359
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef __strdup_compat_h
+#define __strdup_compat_h
+
+/**
+ * @file
+ * @brief Do not use, json-c internal, may be changed or removed at any time.
+ */
+
+#if !defined(HAVE_STRDUP) && defined(_MSC_VER)
+  /* MSC has the version as _strdup */
+# define strdup _strdup
+#elif !defined(HAVE_STRDUP)
+# error You do not have strdup on your system.
+#endif /* HAVE_STRDUP */
+
+#endif
diff --git a/strerror_override.c b/strerror_override.c
new file mode 100644 (file)
index 0000000..90a1581
--- /dev/null
@@ -0,0 +1,101 @@
+#define STRERROR_OVERRIDE_IMPL 1
+#include "strerror_override.h"
+
+/*
+ * Override strerror() to get consistent output across platforms.
+ */
+
+static struct {
+       int errno_value;
+       const char *errno_str;
+} errno_list[] = {
+#define STRINGIFY(x) #x
+#define ENTRY(x) {x, &STRINGIFY(undef_ ## x)[6]}
+       ENTRY(EPERM),
+       ENTRY(ENOENT),
+       ENTRY(ESRCH),
+       ENTRY(EINTR),
+       ENTRY(EIO),
+       ENTRY(ENXIO),
+       ENTRY(E2BIG),
+       ENTRY(ENOEXEC),
+       ENTRY(EBADF),
+       ENTRY(ECHILD),
+       ENTRY(EDEADLK),
+       ENTRY(ENOMEM),
+       ENTRY(EACCES),
+       ENTRY(EFAULT),
+#ifdef ENOTBLK
+       ENTRY(ENOTBLK),
+#endif
+       ENTRY(EBUSY),
+       ENTRY(EEXIST),
+       ENTRY(EXDEV),
+       ENTRY(ENODEV),
+       ENTRY(ENOTDIR),
+       ENTRY(EISDIR),
+       ENTRY(EINVAL),
+       ENTRY(ENFILE),
+       ENTRY(EMFILE),
+       ENTRY(ENOTTY),
+#ifdef ETXTBSY
+       ENTRY(ETXTBSY),
+#endif
+       ENTRY(EFBIG),
+       ENTRY(ENOSPC),
+       ENTRY(ESPIPE),
+       ENTRY(EROFS),
+       ENTRY(EMLINK),
+       ENTRY(EPIPE),
+       ENTRY(EDOM),
+       ENTRY(ERANGE),
+       ENTRY(EAGAIN),
+       { 0, (char *)0 }
+};
+
+// Enabled during tests
+int _json_c_strerror_enable = 0;
+
+#define PREFIX "ERRNO="
+static char errno_buf[128] = PREFIX;
+char *_json_c_strerror(int errno_in)
+{
+       int start_idx;
+       char digbuf[20];
+       int ii, jj;
+
+       if (!_json_c_strerror_enable)
+               return strerror(errno_in);
+
+       // Avoid standard functions, so we don't need to include any
+       // headers, or guess at signatures.
+
+       for (ii = 0; errno_list[ii].errno_str != (char *)0; ii++)
+       {
+               const char *errno_str = errno_list[ii].errno_str;
+               if (errno_list[ii].errno_value != errno_in)
+                       continue;
+
+               for (start_idx = sizeof(PREFIX) - 1, jj = 0; errno_str[jj] != '\0'; jj++, start_idx++)
+               {
+                       errno_buf[start_idx] = errno_str[jj];
+               }
+               errno_buf[start_idx] = '\0';
+               return errno_buf;
+       }
+
+       // It's not one of the known errno values, return the numeric value.
+       for (ii = 0; errno_in > 10; errno_in /= 10, ii++)
+       {
+               digbuf[ii] = "0123456789"[(errno_in % 10)];
+       }
+       digbuf[ii] = "0123456789"[(errno_in % 10)];
+
+       // Reverse the digits
+       for (start_idx = sizeof(PREFIX) - 1 ; ii >= 0; ii--, start_idx++)
+       {
+               errno_buf[start_idx] = digbuf[ii];
+       }
+       return errno_buf;
+}
+
diff --git a/strerror_override.h b/strerror_override.h
new file mode 100644 (file)
index 0000000..5674381
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef _json_strerror_override_h_
+#define _json_strerror_override_h_
+
+/**
+ * @file
+ * @brief Do not use, json-c internal, may be changed or removed at any time.
+ */
+
+#include "config.h"
+#include <errno.h>
+
+#include "json_object.h" /* for JSON_EXPORT */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <string.h>
+
+JSON_EXPORT char *_json_c_strerror(int errno_in);
+
+#ifndef STRERROR_OVERRIDE_IMPL
+#define strerror       _json_c_strerror
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _json_strerror_override_h_ */ 
diff --git a/strerror_override_private.h b/strerror_override_private.h
new file mode 100644 (file)
index 0000000..5180b4f
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef __json_strerror_override_private_h__
+#define __json_strerror_override_private_h__
+
+/**
+ * @file
+ * @brief Do not use, json-c internal, may be changed or removed at any time.
+ */
+
+/* Used by tests to get consistent output */
+extern int _json_c_strerror_enable;
+
+#endif
index 32bf39e..d306056 100755 (executable)
@@ -1,7 +1,7 @@
 #! /bin/sh
 # test-driver - basic testsuite driver script.
 
-scriptversion=2012-06-27.10; # UTC
+scriptversion=2013-07-13.22; # UTC
 
 # Copyright (C) 2011-2013 Free Software Foundation, Inc.
 #
@@ -44,13 +44,12 @@ print_usage ()
 Usage:
   test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
               [--expect-failure={yes|no}] [--color-tests={yes|no}]
-              [--enable-hard-errors={yes|no}] [--] TEST-SCRIPT
+              [--enable-hard-errors={yes|no}] [--]
+              TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
 The '--test-name', '--log-file' and '--trs-file' options are mandatory.
 END
 }
 
-# TODO: better error handling in option parsing (in particular, ensure
-# TODO: $log_file, $trs_file and $test_name are defined).
 test_name= # Used for reporting.
 log_file=  # Where to save the output of the test script.
 trs_file=  # Where to save the metadata of the test run.
@@ -69,10 +68,23 @@ while test $# -gt 0; do
   --enable-hard-errors) enable_hard_errors=$2; shift;;
   --) shift; break;;
   -*) usage_error "invalid option: '$1'";;
+   *) break;;
   esac
   shift
 done
 
+missing_opts=
+test x"$test_name" = x && missing_opts="$missing_opts --test-name"
+test x"$log_file"  = x && missing_opts="$missing_opts --log-file"
+test x"$trs_file"  = x && missing_opts="$missing_opts --trs-file"
+if test x"$missing_opts" != x; then
+  usage_error "the following mandatory options are missing:$missing_opts"
+fi
+
+if test $# -eq 0; then
+  usage_error "missing argument"
+fi
+
 if test $color_tests = yes; then
   # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
   red='\e[0;31m' # Red.
index a388eeb..ea57bda 100644 (file)
@@ -1,41 +1,64 @@
 
-include ../Makefile.am.inc
+AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/tests
+
 LDADD= $(LIBJSON_LA)
 
 LIBJSON_LA=$(top_builddir)/libjson-c.la
 
 TESTS=
+TESTS+= test_util_file.test
+TESTS+= test_float.test
 TESTS+= test1.test
 TESTS+= test2.test
 TESTS+= test4.test
 TESTS+= testReplaceExisting.test
 TESTS+= test_parse_int64.test
+TESTS+= test_deep_copy.test
 TESTS+= test_null.test
 TESTS+= test_cast.test
+TESTS+= test_double_serializer.test
 TESTS+= test_parse.test
 TESTS+= test_locale.test
 TESTS+= test_charcase.test
 TESTS+= test_printbuf.test
 TESTS+= test_set_serializer.test
+TESTS+= test_compare.test
+TESTS+= test_set_value.test
+TESTS+= test_visit.test
+TESTS+= test_json_pointer.test
+TESTS+= test_int_add.test
 
 check_PROGRAMS=
 check_PROGRAMS += $(TESTS:.test=)
 
+EXTRA_DIST=
+EXTRA_DIST += $(TESTS)
+EXTRA_DIST += $(TESTS:.test=.expected)
+EXTRA_DIST += test-defs.sh
+EXTRA_DIST += valid.json
+
+
 # Note: handled by test1.test
-check_PROGRAMS += test1Formatted 
-test1Formatted_SOURCES = test1.c parse_flags.c
-test1Formatted_CPPFLAGS = -DTEST_FORMATTED
+check_PROGRAMS += test1Formatted
+test1Formatted_SOURCES = test1.c parse_flags.c parse_flags.h
+test1Formatted_CPPFLAGS = $(AM_CPPFLAGS) -DTEST_FORMATTED
+EXTRA_DIST+= test1Formatted_plain.expected
+EXTRA_DIST+= test1Formatted_pretty.expected
+EXTRA_DIST+= test1Formatted_spaced.expected
 
 # Note: handled by test2.test
 check_PROGRAMS += test2Formatted
-test2Formatted_SOURCES = test2.c parse_flags.c
-test2Formatted_CPPFLAGS = -DTEST_FORMATTED
+test2Formatted_SOURCES = test2.c parse_flags.c parse_flags.h
+test2Formatted_CPPFLAGS = $(AM_CPPFLAGS) -DTEST_FORMATTED
+EXTRA_DIST+= test2Formatted_plain.expected
+EXTRA_DIST+= test2Formatted_pretty.expected
+EXTRA_DIST+= test2Formatted_spaced.expected
 
-EXTRA_DIST=
-EXTRA_DIST += $(TESTS)
+test_util_file_SOURCES = test_util_file.c
 
 testsubdir=testSubDir
 TESTS_ENVIRONMENT       = top_builddir=$(top_builddir)
 
 distclean-local:
        -rm -rf $(testsubdir)
+       -rm -f *.vg.out
index dac63b8..fb6f8d1 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 @SET_MAKE@
 VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -90,20 +80,32 @@ host_triplet = @host@
 check_PROGRAMS = $(am__EXEEXT_1) test1Formatted$(EXEEXT) \
        test2Formatted$(EXEEXT)
 subdir = tests
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+       $(top_srcdir)/depcomp $(top_srcdir)/test-driver
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__aclocal_m4_deps =  \
+       $(top_srcdir)/autoconf-archive/m4/ax_append_compile_flags.m4 \
+       $(top_srcdir)/autoconf-archive/m4/ax_append_flag.m4 \
+       $(top_srcdir)/autoconf-archive/m4/ax_check_compile_flag.m4 \
+       $(top_srcdir)/autoconf-archive/m4/ax_compile_check_sizeof.m4 \
+       $(top_srcdir)/autoconf-archive/m4/ax_require_defined.m4 \
+       $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/json_config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-am__EXEEXT_1 = test1$(EXEEXT) test2$(EXEEXT) test4$(EXEEXT) \
+am__EXEEXT_1 = test_util_file$(EXEEXT) test_float$(EXEEXT) \
+       test1$(EXEEXT) test2$(EXEEXT) test4$(EXEEXT) \
        testReplaceExisting$(EXEEXT) test_parse_int64$(EXEEXT) \
-       test_null$(EXEEXT) test_cast$(EXEEXT) test_parse$(EXEEXT) \
+       test_deep_copy$(EXEEXT) test_null$(EXEEXT) test_cast$(EXEEXT) \
+       test_double_serializer$(EXEEXT) test_parse$(EXEEXT) \
        test_locale$(EXEEXT) test_charcase$(EXEEXT) \
-       test_printbuf$(EXEEXT) test_set_serializer$(EXEEXT)
+       test_printbuf$(EXEEXT) test_set_serializer$(EXEEXT) \
+       test_compare$(EXEEXT) test_set_value$(EXEEXT) \
+       test_visit$(EXEEXT) test_json_pointer$(EXEEXT) \
+       test_int_add$(EXEEXT)
 test1_SOURCES = test1.c
 test1_OBJECTS = test1.$(OBJEXT)
 test1_LDADD = $(LDADD)
@@ -142,6 +144,30 @@ test_charcase_SOURCES = test_charcase.c
 test_charcase_OBJECTS = test_charcase.$(OBJEXT)
 test_charcase_LDADD = $(LDADD)
 test_charcase_DEPENDENCIES = $(LIBJSON_LA)
+test_compare_SOURCES = test_compare.c
+test_compare_OBJECTS = test_compare.$(OBJEXT)
+test_compare_LDADD = $(LDADD)
+test_compare_DEPENDENCIES = $(LIBJSON_LA)
+test_deep_copy_SOURCES = test_deep_copy.c
+test_deep_copy_OBJECTS = test_deep_copy.$(OBJEXT)
+test_deep_copy_LDADD = $(LDADD)
+test_deep_copy_DEPENDENCIES = $(LIBJSON_LA)
+test_double_serializer_SOURCES = test_double_serializer.c
+test_double_serializer_OBJECTS = test_double_serializer.$(OBJEXT)
+test_double_serializer_LDADD = $(LDADD)
+test_double_serializer_DEPENDENCIES = $(LIBJSON_LA)
+test_float_SOURCES = test_float.c
+test_float_OBJECTS = test_float.$(OBJEXT)
+test_float_LDADD = $(LDADD)
+test_float_DEPENDENCIES = $(LIBJSON_LA)
+test_int_add_SOURCES = test_int_add.c
+test_int_add_OBJECTS = test_int_add.$(OBJEXT)
+test_int_add_LDADD = $(LDADD)
+test_int_add_DEPENDENCIES = $(LIBJSON_LA)
+test_json_pointer_SOURCES = test_json_pointer.c
+test_json_pointer_OBJECTS = test_json_pointer.$(OBJEXT)
+test_json_pointer_LDADD = $(LDADD)
+test_json_pointer_DEPENDENCIES = $(LIBJSON_LA)
 test_locale_SOURCES = test_locale.c
 test_locale_OBJECTS = test_locale.$(OBJEXT)
 test_locale_LDADD = $(LDADD)
@@ -166,6 +192,18 @@ test_set_serializer_SOURCES = test_set_serializer.c
 test_set_serializer_OBJECTS = test_set_serializer.$(OBJEXT)
 test_set_serializer_LDADD = $(LDADD)
 test_set_serializer_DEPENDENCIES = $(LIBJSON_LA)
+test_set_value_SOURCES = test_set_value.c
+test_set_value_OBJECTS = test_set_value.$(OBJEXT)
+test_set_value_LDADD = $(LDADD)
+test_set_value_DEPENDENCIES = $(LIBJSON_LA)
+am_test_util_file_OBJECTS = test_util_file.$(OBJEXT)
+test_util_file_OBJECTS = $(am_test_util_file_OBJECTS)
+test_util_file_LDADD = $(LDADD)
+test_util_file_DEPENDENCIES = $(LIBJSON_LA)
+test_visit_SOURCES = test_visit.c
+test_visit_OBJECTS = test_visit.$(OBJEXT)
+test_visit_LDADD = $(LDADD)
+test_visit_DEPENDENCIES = $(LIBJSON_LA)
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -202,14 +240,18 @@ am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
 SOURCES = test1.c $(test1Formatted_SOURCES) test2.c \
        $(test2Formatted_SOURCES) test4.c testReplaceExisting.c \
-       test_cast.c test_charcase.c test_locale.c test_null.c \
-       test_parse.c test_parse_int64.c test_printbuf.c \
-       test_set_serializer.c
+       test_cast.c test_charcase.c test_compare.c test_deep_copy.c \
+       test_double_serializer.c test_float.c test_int_add.c \
+       test_json_pointer.c test_locale.c test_null.c test_parse.c \
+       test_parse_int64.c test_printbuf.c test_set_serializer.c \
+       test_set_value.c $(test_util_file_SOURCES) test_visit.c
 DIST_SOURCES = test1.c $(test1Formatted_SOURCES) test2.c \
        $(test2Formatted_SOURCES) test4.c testReplaceExisting.c \
-       test_cast.c test_charcase.c test_locale.c test_null.c \
-       test_parse.c test_parse_int64.c test_printbuf.c \
-       test_set_serializer.c
+       test_cast.c test_charcase.c test_compare.c test_deep_copy.c \
+       test_double_serializer.c test_float.c test_int_add.c \
+       test_json_pointer.c test_locale.c test_null.c test_parse.c \
+       test_parse_int64.c test_printbuf.c test_set_serializer.c \
+       test_set_value.c $(test_util_file_SOURCES) test_visit.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -436,8 +478,6 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
-am__DIST_COMMON = $(srcdir)/../Makefile.am.inc $(srcdir)/Makefile.in \
-       $(top_srcdir)/depcomp $(top_srcdir)/test-driver
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
@@ -554,25 +594,32 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CFLAGS = -Wall -Werror -Wno-error=deprecated-declarations -Wextra -Wwrite-strings -Wno-unused-parameter -std=gnu99 -D_GNU_SOURCE -D_REENTRANT
+AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/tests
 LDADD = $(LIBJSON_LA)
 LIBJSON_LA = $(top_builddir)/libjson-c.la
-TESTS = test1.test test2.test test4.test testReplaceExisting.test \
-       test_parse_int64.test test_null.test test_cast.test \
-       test_parse.test test_locale.test test_charcase.test \
-       test_printbuf.test test_set_serializer.test
-test1Formatted_SOURCES = test1.c parse_flags.c
-test1Formatted_CPPFLAGS = -DTEST_FORMATTED
-test2Formatted_SOURCES = test2.c parse_flags.c
-test2Formatted_CPPFLAGS = -DTEST_FORMATTED
-EXTRA_DIST = $(TESTS)
+TESTS = test_util_file.test test_float.test test1.test test2.test \
+       test4.test testReplaceExisting.test test_parse_int64.test \
+       test_deep_copy.test test_null.test test_cast.test \
+       test_double_serializer.test test_parse.test test_locale.test \
+       test_charcase.test test_printbuf.test test_set_serializer.test \
+       test_compare.test test_set_value.test test_visit.test \
+       test_json_pointer.test test_int_add.test
+EXTRA_DIST = $(TESTS) $(TESTS:.test=.expected) test-defs.sh valid.json \
+       test1Formatted_plain.expected test1Formatted_pretty.expected \
+       test1Formatted_spaced.expected test2Formatted_plain.expected \
+       test2Formatted_pretty.expected test2Formatted_spaced.expected
+test1Formatted_SOURCES = test1.c parse_flags.c parse_flags.h
+test1Formatted_CPPFLAGS = $(AM_CPPFLAGS) -DTEST_FORMATTED
+test2Formatted_SOURCES = test2.c parse_flags.c parse_flags.h
+test2Formatted_CPPFLAGS = $(AM_CPPFLAGS) -DTEST_FORMATTED
+test_util_file_SOURCES = test_util_file.c
 testsubdir = testSubDir
 TESTS_ENVIRONMENT = top_builddir=$(top_builddir)
 all: all-am
 
 .SUFFIXES:
 .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/../Makefile.am.inc $(am__configure_deps)
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        @for dep in $?; do \
          case '$(am__configure_deps)' in \
            *$$dep*) \
@@ -584,6 +631,7 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/../Makefile.am.inc $(am_
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnu tests/Makefile
+.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -592,7 +640,6 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
            echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
        esac;
-$(srcdir)/../Makefile.am.inc $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -644,6 +691,30 @@ test_charcase$(EXEEXT): $(test_charcase_OBJECTS) $(test_charcase_DEPENDENCIES) $
        @rm -f test_charcase$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_charcase_OBJECTS) $(test_charcase_LDADD) $(LIBS)
 
+test_compare$(EXEEXT): $(test_compare_OBJECTS) $(test_compare_DEPENDENCIES) $(EXTRA_test_compare_DEPENDENCIES) 
+       @rm -f test_compare$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_compare_OBJECTS) $(test_compare_LDADD) $(LIBS)
+
+test_deep_copy$(EXEEXT): $(test_deep_copy_OBJECTS) $(test_deep_copy_DEPENDENCIES) $(EXTRA_test_deep_copy_DEPENDENCIES) 
+       @rm -f test_deep_copy$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_deep_copy_OBJECTS) $(test_deep_copy_LDADD) $(LIBS)
+
+test_double_serializer$(EXEEXT): $(test_double_serializer_OBJECTS) $(test_double_serializer_DEPENDENCIES) $(EXTRA_test_double_serializer_DEPENDENCIES) 
+       @rm -f test_double_serializer$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_double_serializer_OBJECTS) $(test_double_serializer_LDADD) $(LIBS)
+
+test_float$(EXEEXT): $(test_float_OBJECTS) $(test_float_DEPENDENCIES) $(EXTRA_test_float_DEPENDENCIES) 
+       @rm -f test_float$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_float_OBJECTS) $(test_float_LDADD) $(LIBS)
+
+test_int_add$(EXEEXT): $(test_int_add_OBJECTS) $(test_int_add_DEPENDENCIES) $(EXTRA_test_int_add_DEPENDENCIES) 
+       @rm -f test_int_add$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_int_add_OBJECTS) $(test_int_add_LDADD) $(LIBS)
+
+test_json_pointer$(EXEEXT): $(test_json_pointer_OBJECTS) $(test_json_pointer_DEPENDENCIES) $(EXTRA_test_json_pointer_DEPENDENCIES) 
+       @rm -f test_json_pointer$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_json_pointer_OBJECTS) $(test_json_pointer_LDADD) $(LIBS)
+
 test_locale$(EXEEXT): $(test_locale_OBJECTS) $(test_locale_DEPENDENCIES) $(EXTRA_test_locale_DEPENDENCIES) 
        @rm -f test_locale$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_locale_OBJECTS) $(test_locale_LDADD) $(LIBS)
@@ -668,6 +739,18 @@ test_set_serializer$(EXEEXT): $(test_set_serializer_OBJECTS) $(test_set_serializ
        @rm -f test_set_serializer$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_set_serializer_OBJECTS) $(test_set_serializer_LDADD) $(LIBS)
 
+test_set_value$(EXEEXT): $(test_set_value_OBJECTS) $(test_set_value_DEPENDENCIES) $(EXTRA_test_set_value_DEPENDENCIES) 
+       @rm -f test_set_value$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_set_value_OBJECTS) $(test_set_value_LDADD) $(LIBS)
+
+test_util_file$(EXEEXT): $(test_util_file_OBJECTS) $(test_util_file_DEPENDENCIES) $(EXTRA_test_util_file_DEPENDENCIES) 
+       @rm -f test_util_file$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_util_file_OBJECTS) $(test_util_file_LDADD) $(LIBS)
+
+test_visit$(EXEEXT): $(test_visit_OBJECTS) $(test_visit_DEPENDENCIES) $(EXTRA_test_visit_DEPENDENCIES) 
+       @rm -f test_visit$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_visit_OBJECTS) $(test_visit_LDADD) $(LIBS)
+
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
 
@@ -684,12 +767,21 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testReplaceExisting.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cast.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_charcase.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_compare.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_deep_copy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_double_serializer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_float.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_int_add.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_json_pointer.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_locale.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_null.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_parse.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_parse_int64.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_printbuf.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_set_serializer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_set_value.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_util_file.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_visit.Po@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -856,7 +948,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
        if test -n "$$am__remaking_logs"; then \
          echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
               "recursion detected" >&2; \
-       elif test -n "$$redo_logs"; then \
+       else \
          am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
        fi; \
        if $(am__make_dryrun); then :; else \
@@ -1138,11 +1230,10 @@ uninstall-am:
        mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
        recheck tags tags-am uninstall uninstall-am
 
-.PRECIOUS: Makefile
-
 
 distclean-local:
        -rm -rf $(testsubdir)
+       -rm -f *.vg.out
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
index 1af61ea..b1f8337 100644 (file)
@@ -22,7 +22,7 @@ static struct {
 };
 
 #ifndef NELEM
-#define NELEM(x) (sizeof(x) / sizeof(&x[0]))
+#define NELEM(x) (sizeof(x) / sizeof(x[0]))
 #endif
 
 int parse_flags(int argc, char **argv)
index 658a75d..7e1739b 100755 (executable)
@@ -50,6 +50,14 @@ echo "=== Running test $progname"
 CMP="${CMP-cmp}"
 
 use_valgrind=${USE_VALGRIND-1}
+case "${use_valgrind}" in
+       [0Nn]*)
+               use_valgrind=0
+               ;;
+       *)
+               use_valgrind=1
+               ;;
+esac
 valgrind_path=$(which valgrind 2> /dev/null)
 if [ -z "${valgrind_path}" -o ! -x "${valgrind_path}" ] ; then
        use_valgrind=0
@@ -114,15 +122,13 @@ run_output_test()
                fi
        fi
 
-       if ! "$CMP" -s "${top_builddir}/${TEST_OUTPUT}.expected" "${TEST_OUTPUT}.out" ; then
+       if ! "$CMP" -s "${srcdir}/${TEST_OUTPUT}.expected" "${TEST_OUTPUT}.out" ; then
                echo "ERROR: \"${TEST_COMMAND} $@\" (${TEST_OUTPUT}) failed (set VERBOSE=1 to see full output):" 1>&2
-               (cd "${CURDIR}" ; set -x ; diff "${top_builddir}/${TEST_OUTPUT}.expected" "$testsubdir/${TEST_OUTPUT}.out")
-               echo "cp \"$testsubdir/${TEST_OUTPUT}.out\" \"${top_builddir}/${TEST_OUTPUT}.expected\"" 1>&2
+               (cd "${CURDIR}" ; set -x ; diff "${srcdir}/${TEST_OUTPUT}.expected" "$testsubdir/${TEST_OUTPUT}.out")
+               echo "cp \"$testsubdir/${TEST_OUTPUT}.out\" \"${srcdir}/${TEST_OUTPUT}.expected\"" 1>&2
 
                err=1
        fi
 
        return $err
 }
-
-
index 7acea62..3ddaf72 100644 (file)
@@ -28,15 +28,117 @@ static int sort_fn (const void *j1, const void *j2)
 }
 
 #ifdef TEST_FORMATTED
-#define json_object_to_json_string(obj) json_object_to_json_string_ext(obj,sflags)
+static const char *to_json_string(json_object *obj, int flags)
+{
+       size_t length;
+       char *copy;
+       const char *result;
+
+       result = json_object_to_json_string_length(obj, flags, &length);
+       copy = strdup(result);
+       if (copy == NULL)
+               printf("to_json_string: Allocation failed!\n");
+       else {
+               result = json_object_to_json_string_ext(obj, flags);
+               if (length != strlen(result))
+                       printf("to_json_string: Length mismatch!\n");
+               if (strcmp(copy, result) != 0)
+                       printf("to_json_string: Comparison Failed!\n");
+               free(copy);
+       }
+       return result;
+}
+#define json_object_to_json_string(obj) to_json_string(obj,sflags)
 #else
 /* no special define */
 #endif
 
+json_object *make_array(void);
+json_object *make_array()
+{
+       json_object *my_array;
+
+       my_array = json_object_new_array();
+       json_object_array_add(my_array, json_object_new_int(1));
+       json_object_array_add(my_array, json_object_new_int(2));
+       json_object_array_add(my_array, json_object_new_int(3));
+       json_object_array_put_idx(my_array, 4, json_object_new_int(5));
+       json_object_array_put_idx(my_array, 3, json_object_new_int(4));
+       json_object_array_put_idx(my_array, 6, json_object_new_int(7));
+
+       return my_array;
+}
+
+void test_array_del_idx(void);
+void test_array_del_idx()
+{
+       int rc;
+       size_t ii;
+       size_t orig_array_len;
+       json_object *my_array;
+#ifdef TEST_FORMATTED
+       int sflags = 0;
+#endif
+
+       my_array = make_array();
+       orig_array_len = json_object_array_length(my_array);
+
+       printf("my_array=\n");
+       for(ii = 0; ii < json_object_array_length(my_array); ii++)
+       {
+               json_object *obj = json_object_array_get_idx(my_array, ii);
+               printf("\t[%d]=%s\n", (int)ii, json_object_to_json_string(obj));
+       }
+       printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array));
+
+       for (ii = 0; ii < orig_array_len; ii++)
+       {
+               rc = json_object_array_del_idx(my_array, 0, 1);
+               printf("after del_idx(0,1)=%d, my_array.to_string()=%s\n",
+                      rc, json_object_to_json_string(my_array));
+       }
+
+       /* One more time, with the empty array: */
+       rc = json_object_array_del_idx(my_array, 0, 1);
+       printf("after del_idx(0,1)=%d, my_array.to_string()=%s\n",
+              rc, json_object_to_json_string(my_array));
+
+       json_object_put(my_array);
+
+       /* Delete all array indexes at once */
+       my_array = make_array();
+       rc = json_object_array_del_idx(my_array, 0, orig_array_len);
+       printf("after del_idx(0,%d)=%d, my_array.to_string()=%s\n",
+              (int)orig_array_len, rc, json_object_to_json_string(my_array));
+
+       json_object_put(my_array);
+
+       /* Delete *more* than all array indexes at once */
+       my_array = make_array();
+       rc = json_object_array_del_idx(my_array, 0, orig_array_len + 1);
+       printf("after del_idx(0,%d)=%d, my_array.to_string()=%s\n",
+              (int)(orig_array_len + 1), rc, json_object_to_json_string(my_array));
+
+       json_object_put(my_array);
+       
+       /* Delete some array indexes, then add more */
+       my_array = make_array();
+       rc = json_object_array_del_idx(my_array, 0, orig_array_len - 1);
+       printf("after del_idx(0,%d)=%d, my_array.to_string()=%s\n",
+              (int)(orig_array_len - 1), rc, json_object_to_json_string(my_array));
+       json_object_array_add(my_array, json_object_new_string("s1"));
+       json_object_array_add(my_array, json_object_new_string("s2"));
+       json_object_array_add(my_array, json_object_new_string("s3"));
+
+       printf("after adding more entries, my_array.to_string()=%s\n",
+              json_object_to_json_string(my_array));
+       json_object_put(my_array);
+}
+
 int main(int argc, char **argv)
 {
        json_object *my_string, *my_int, *my_object, *my_array;
-       int i;
+       size_t i;
 #ifdef TEST_FORMATTED
        int sflags = 0;
 #endif
@@ -57,6 +159,18 @@ int main(int argc, char **argv)
        printf("my_string.to_string()=%s\n", json_object_to_json_string(my_string));
        json_object_put(my_string);
 
+       my_string = json_object_new_string("/");
+       printf("my_string=%s\n", json_object_get_string(my_string));
+       printf("my_string.to_string()=%s\n", json_object_to_json_string(my_string));
+       printf("my_string.to_string(NOSLASHESCAPE)=%s\n", json_object_to_json_string_ext(my_string, JSON_C_TO_STRING_NOSLASHESCAPE));
+       json_object_put(my_string);
+
+       my_string = json_object_new_string("/foo/bar/baz");
+       printf("my_string=%s\n", json_object_get_string(my_string));
+       printf("my_string.to_string()=%s\n", json_object_to_json_string(my_string));
+       printf("my_string.to_string(NOSLASHESCAPE)=%s\n", json_object_to_json_string_ext(my_string, JSON_C_TO_STRING_NOSLASHESCAPE));
+       json_object_put(my_string);
+
        my_string = json_object_new_string("foo");
        printf("my_string=%s\n", json_object_get_string(my_string));
        printf("my_string.to_string()=%s\n", json_object_to_json_string(my_string));
@@ -74,12 +188,14 @@ int main(int argc, char **argv)
        for(i=0; i < json_object_array_length(my_array); i++)
        {
                json_object *obj = json_object_array_get_idx(my_array, i);
-               printf("\t[%d]=%s\n", i, json_object_to_json_string(obj));
+               printf("\t[%d]=%s\n", (int)i, json_object_to_json_string(obj));
        }
-       printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array));    
+       printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array));
 
        json_object_put(my_array);
 
+       test_array_del_idx();
+
        my_array = json_object_new_array();
        json_object_array_add(my_array, json_object_new_int(3));
        json_object_array_add(my_array, json_object_new_int(1));
@@ -89,19 +205,25 @@ int main(int argc, char **argv)
        for(i=0; i < json_object_array_length(my_array); i++)
        {
                json_object *obj = json_object_array_get_idx(my_array, i);
-               printf("\t[%d]=%s\n", i, json_object_to_json_string(obj));
+               printf("\t[%d]=%s\n", (int)i, json_object_to_json_string(obj));
        }
-       printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array));    
+       printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array));
        json_object_array_sort(my_array, sort_fn);
        printf("my_array=\n");
        for(i=0; i < json_object_array_length(my_array); i++)
        {
                json_object *obj = json_object_array_get_idx(my_array, i);
-               printf("\t[%d]=%s\n", i, json_object_to_json_string(obj));
+               printf("\t[%d]=%s\n", (int)i, json_object_to_json_string(obj));
        }
-       printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array));    
+       printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array));
 
        my_object = json_object_new_object();
+       int rc = json_object_object_add(my_object, "abc", my_object);
+       if (rc != -1)
+       {
+               printf("ERROR: able to successfully add object to itself!\n");
+               fflush(stdout);
+       }
        json_object_object_add(my_object, "abc", json_object_new_int(12));
        json_object_object_add(my_object, "foo", json_object_new_string("bar"));
        json_object_object_add(my_object, "bool0", json_object_new_boolean(0));
@@ -130,5 +252,5 @@ int main(int argc, char **argv)
        json_object_put(my_object);
        json_object_put(my_array);
 
-       return 0;
+       return EXIT_SUCCESS;
 }
index e36aaa4..e36d372 100644 (file)
@@ -2,6 +2,12 @@ my_string=
 my_string.to_string()="\t"
 my_string=\
 my_string.to_string()="\\"
+my_string=/
+my_string.to_string()="\/"
+my_string.to_string(NOSLASHESCAPE)="/"
+my_string=/foo/bar/baz
+my_string.to_string()="\/foo\/bar\/baz"
+my_string.to_string(NOSLASHESCAPE)="/foo/bar/baz"
 my_string=foo
 my_string.to_string()="foo"
 my_int=9
@@ -14,6 +20,27 @@ my_array=
        [4]=5
 my_array.to_string()=[ 1, 2, 3, null, 5 ]
 my_array=
+       [0]=1
+       [1]=2
+       [2]=3
+       [3]=4
+       [4]=5
+       [5]=null
+       [6]=7
+my_array.to_string()=[ 1, 2, 3, 4, 5, null, 7 ]
+after del_idx(0,1)=0, my_array.to_string()=[ 2, 3, 4, 5, null, 7 ]
+after del_idx(0,1)=0, my_array.to_string()=[ 3, 4, 5, null, 7 ]
+after del_idx(0,1)=0, my_array.to_string()=[ 4, 5, null, 7 ]
+after del_idx(0,1)=0, my_array.to_string()=[ 5, null, 7 ]
+after del_idx(0,1)=0, my_array.to_string()=[ null, 7 ]
+after del_idx(0,1)=0, my_array.to_string()=[ 7 ]
+after del_idx(0,1)=0, my_array.to_string()=[ ]
+after del_idx(0,1)=-1, my_array.to_string()=[ ]
+after del_idx(0,7)=0, my_array.to_string()=[ ]
+after del_idx(0,8)=-1, my_array.to_string()=[ 1, 2, 3, 4, 5, null, 7 ]
+after del_idx(0,6)=0, my_array.to_string()=[ 7 ]
+after adding more entries, my_array.to_string()=[ 7, "s1", "s2", "s3" ]
+my_array=
        [0]=3
        [1]=1
        [2]=2
index edcc1b9..8a05723 100644 (file)
@@ -2,6 +2,12 @@ my_string=
 my_string.to_string()="\t"
 my_string=\
 my_string.to_string()="\\"
+my_string=/
+my_string.to_string()="\/"
+my_string.to_string(NOSLASHESCAPE)="/"
+my_string=/foo/bar/baz
+my_string.to_string()="\/foo\/bar\/baz"
+my_string.to_string(NOSLASHESCAPE)="/foo/bar/baz"
 my_string=foo
 my_string.to_string()="foo"
 my_int=9
@@ -14,6 +20,27 @@ my_array=
        [4]=5
 my_array.to_string()=[1,2,3,null,5]
 my_array=
+       [0]=1
+       [1]=2
+       [2]=3
+       [3]=4
+       [4]=5
+       [5]=null
+       [6]=7
+my_array.to_string()=[1,2,3,4,5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[2,3,4,5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[3,4,5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[4,5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[null,7]
+after del_idx(0,1)=0, my_array.to_string()=[7]
+after del_idx(0,1)=0, my_array.to_string()=[]
+after del_idx(0,1)=-1, my_array.to_string()=[]
+after del_idx(0,7)=0, my_array.to_string()=[]
+after del_idx(0,8)=-1, my_array.to_string()=[1,2,3,4,5,null,7]
+after del_idx(0,6)=0, my_array.to_string()=[7]
+after adding more entries, my_array.to_string()=[7,"s1","s2","s3"]
+my_array=
        [0]=3
        [1]=1
        [2]=2
index 95e48ed..809dfbe 100644 (file)
@@ -2,6 +2,12 @@ my_string=
 my_string.to_string()="\t"
 my_string=\
 my_string.to_string()="\\"
+my_string=/
+my_string.to_string()="\/"
+my_string.to_string(NOSLASHESCAPE)="/"
+my_string=/foo/bar/baz
+my_string.to_string()="\/foo\/bar\/baz"
+my_string.to_string(NOSLASHESCAPE)="/foo/bar/baz"
 my_string=foo
 my_string.to_string()="foo"
 my_int=9
@@ -20,6 +26,27 @@ my_array.to_string()=[
   5
 ]
 my_array=
+       [0]=1
+       [1]=2
+       [2]=3
+       [3]=4
+       [4]=5
+       [5]=null
+       [6]=7
+my_array.to_string()=[1,2,3,4,5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[2,3,4,5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[3,4,5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[4,5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[null,7]
+after del_idx(0,1)=0, my_array.to_string()=[7]
+after del_idx(0,1)=0, my_array.to_string()=[]
+after del_idx(0,1)=-1, my_array.to_string()=[]
+after del_idx(0,7)=0, my_array.to_string()=[]
+after del_idx(0,8)=-1, my_array.to_string()=[1,2,3,4,5,null,7]
+after del_idx(0,6)=0, my_array.to_string()=[7]
+after adding more entries, my_array.to_string()=[7,"s1","s2","s3"]
+my_array=
        [0]=3
        [1]=1
        [2]=2
index e36aaa4..6afb39f 100644 (file)
@@ -2,6 +2,12 @@ my_string=
 my_string.to_string()="\t"
 my_string=\
 my_string.to_string()="\\"
+my_string=/
+my_string.to_string()="\/"
+my_string.to_string(NOSLASHESCAPE)="/"
+my_string=/foo/bar/baz
+my_string.to_string()="\/foo\/bar\/baz"
+my_string.to_string(NOSLASHESCAPE)="/foo/bar/baz"
 my_string=foo
 my_string.to_string()="foo"
 my_int=9
@@ -14,6 +20,27 @@ my_array=
        [4]=5
 my_array.to_string()=[ 1, 2, 3, null, 5 ]
 my_array=
+       [0]=1
+       [1]=2
+       [2]=3
+       [3]=4
+       [4]=5
+       [5]=null
+       [6]=7
+my_array.to_string()=[1,2,3,4,5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[2,3,4,5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[3,4,5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[4,5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[5,null,7]
+after del_idx(0,1)=0, my_array.to_string()=[null,7]
+after del_idx(0,1)=0, my_array.to_string()=[7]
+after del_idx(0,1)=0, my_array.to_string()=[]
+after del_idx(0,1)=-1, my_array.to_string()=[]
+after del_idx(0,7)=0, my_array.to_string()=[]
+after del_idx(0,8)=-1, my_array.to_string()=[1,2,3,4,5,null,7]
+after del_idx(0,6)=0, my_array.to_string()=[7]
+after adding more entries, my_array.to_string()=[7,"s1","s2","s3"]
+my_array=
        [0]=3
        [1]=1
        [2]=2
index ce44e46..06a453e 100644 (file)
@@ -26,9 +26,10 @@ int main(int argc, char **argv)
        sflags = parse_flags(argc, argv);
 #endif
 
-       new_obj = json_tokener_parse("/* more difficult test case */ { \"glossary\": { \"title\": \"example glossary\", \"GlossDiv\": { \"title\": \"S\", \"GlossList\": [ { \"ID\": \"SGML\", \"SortAs\": \"SGML\", \"GlossTerm\": \"Standard Generalized Markup Language\", \"Acronym\": \"SGML\", \"Abbrev\": \"ISO 8879:1986\", \"GlossDef\": \"A meta-markup language, used to create markup languages such as DocBook.\", \"GlossSeeAlso\": [\"GML\", \"XML\", \"markup\"] } ] } } }");
+       new_obj = json_tokener_parse("/* more difficult test case */"
+                                    "{ \"glossary\": { \"title\": \"example glossary\", \"GlossDiv\": { \"title\": \"S\", \"GlossList\": [ { \"ID\": \"SGML\", \"SortAs\": \"SGML\", \"GlossTerm\": \"Standard Generalized Markup Language\", \"Acronym\": \"SGML\", \"Abbrev\": \"ISO 8879:1986\", \"GlossDef\": \"A meta-markup language, used to create markup languages such as DocBook.\", \"GlossSeeAlso\": [\"GML\", \"XML\", \"markup\"] } ] } } }");
        printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
        json_object_put(new_obj);
 
-       return 0;
+       return EXIT_SUCCESS;
 }
index 23e97da..fc8b79d 100644 (file)
@@ -10,7 +10,7 @@
 #include "json_object.h"
 #include "json_tokener.h"
 
-void print_hex( const char* s)
+void print_hex(const char* s)
 {
        const char *iter = s;
        unsigned char ch;
@@ -21,14 +21,14 @@ void print_hex( const char* s)
                else
                        printf( ",");
        }
-       printf("\n");
+       putchar('\n');
 }
 
-int main()
+int main(void)
 {
        const char *input = "\"\\ud840\\udd26,\\ud840\\udd27,\\ud800\\udd26,\\ud800\\udd27\"";
        const char *expected = "\xF0\xA0\x84\xA6,\xF0\xA0\x84\xA7,\xF0\x90\x84\xA6,\xF0\x90\x84\xA7";
-       struct json_object *parse_result = json_tokener_parse((char*)input);
+       struct json_object *parse_result = json_tokener_parse(input);
        const char *unjson = json_object_get_string(parse_result);
 
        printf("input: %s\n", input);
@@ -38,14 +38,14 @@ int main()
        if (strings_match)
        {
                printf("JSON parse result is correct: %s\n", unjson);
-               printf("PASS\n");
+               puts("PASS");
        } else {
                printf("JSON parse result doesn't match expected string\n");
                printf("expected string bytes: ");
-               print_hex( expected);
+               print_hex(expected);
                printf("parsed string bytes:   ");
-               print_hex( unjson);
-               printf("FAIL\n");
+               print_hex(unjson);
+               puts("FAIL");
                retval = 1;
        }
        json_object_put(parse_result);
deleted file mode 100755 (executable)
index 8bcc4609b4c40fb8b2fe203296ddb28ca4a40d49..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Common definitions
-if test -z "$srcdir"; then
-    srcdir="${0%/*}"
-    test "$srcdir" = "$0" && srcdir=.
-    test -z "$srcdir" && srcdir=.
-fi
-. "$srcdir/test-defs.sh"
-
-run_output_test test4
-exit $?
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..58a13f4f327a79766a57c37dc53c4dbbcec6927e
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
index 6db7b98..79f37c5 100644 (file)
@@ -24,7 +24,7 @@ int main(int argc, char **argv)
        int orig_count = 0;
        json_object_object_foreach(my_object, key0, val0)
        {
-               printf("Key at index %d is [%s]", orig_count, key0);
+               printf("Key at index %d is [%s] %d", orig_count, key0, (val0 == NULL));
                if (strcmp(key0, "deleteme") == 0)
                {
                        json_object_object_del(my_object, key0);
@@ -41,7 +41,7 @@ int main(int argc, char **argv)
        orig_count = 0;
        json_object_object_foreach(my_object, key, val)
        {
-               printf("Key at index %d is [%s]\n", orig_count, key);
+               printf("Key at index %d is [%s] %d\n", orig_count, key, (val == NULL));
                orig_count++;
                if (strcmp(key, "foo2") != 0)
                        continue;
@@ -56,7 +56,7 @@ int main(int argc, char **argv)
        int retval = 0;
        json_object_object_foreach(my_object, key2, val2)
        {
-               printf("Key at index %d is [%s]\n", new_count, key2);
+               printf("Key at index %d is [%s] %d\n", new_count, key2, (val2 == NULL));
                new_count++;
                if (strcmp(key2, "foo2") != 0)
                        continue;
index b1d4461..57ef190 100644 (file)
@@ -1,15 +1,15 @@
 ==== delete-in-loop test starting ====
-Key at index 0 is [foo1] (kept)
-Key at index 1 is [foo2] (kept)
-Key at index 2 is [deleteme] (deleted)
-Key at index 3 is [foo3] (kept)
+Key at index 0 is [foo1] (kept)
+Key at index 1 is [foo2] (kept)
+Key at index 2 is [deleteme] (deleted)
+Key at index 3 is [foo3] (kept)
 ==== replace-value first loop starting ====
-Key at index 0 is [foo1]
-Key at index 1 is [foo2]
+Key at index 0 is [foo1] 0
+Key at index 1 is [foo2] 0
 replacing value for key [foo2]
-Key at index 2 is [foo3]
+Key at index 2 is [foo3] 0
 ==== second loop starting ====
-Key at index 0 is [foo1]
-Key at index 1 is [foo2]
+Key at index 0 is [foo1] 0
+Key at index 1 is [foo2] 0
 pointer for key [foo2] does match
-Key at index 2 is [foo3]
+Key at index 2 is [foo3] 0
deleted file mode 100755 (executable)
index ec5cbf1916cb5b8d888b2ada29f6599592390ca8..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Common definitions
-if test -z "$srcdir"; then
-    srcdir="${0%/*}"
-    test "$srcdir" = "$0" && srcdir=.
-    test -z "$srcdir" && srcdir=.
-fi
-. "$srcdir/test-defs.sh"
-
-run_output_test testReplaceExisting
-exit $?
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..58a13f4f327a79766a57c37dc53c4dbbcec6927e
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
diff --git a/tests/test_basic.test b/tests/test_basic.test
new file mode 100755 (executable)
index 0000000..154e036
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+# Common definitions
+if test -z "$srcdir"; then
+    srcdir="${0%/*}"
+    test "$srcdir" = "$0" && srcdir=.
+    test -z "$srcdir" && srcdir=.
+fi
+. "$srcdir/test-defs.sh"
+
+filename=$(basename "$0")
+filename="${filename%.*}"
+
+# This is only for the test_util_file.test ;
+# more stuff could be extended
+cp -f "$srcdir/valid.json" .
+
+run_output_test $filename "$srcdir"
+exit $?
index 72c8cc4..7e2bcd5 100644 (file)
@@ -65,7 +65,9 @@ int main(int argc, char **argv)
 
 static void getit(struct json_object *new_obj, const char *field)
 {
-       struct json_object *o = json_object_object_get(new_obj, field);
+       struct json_object *o = NULL;
+       if (!json_object_object_get_ex(new_obj, field, &o))
+               printf("Field %s does not exist\n", field);
 
        enum json_type o_type = json_object_get_type(o);
        printf("new_obj.%s json_object_get_type()=%s\n", field,
@@ -93,7 +95,10 @@ static void checktype_header()
 }
 static void checktype(struct json_object *new_obj, const char *field)
 {
-       struct json_object *o = field ? json_object_object_get(new_obj, field) : new_obj;
+       struct json_object *o = new_obj;
+       if (field && !json_object_object_get_ex(new_obj, field, &o))
+               printf("Field %s does not exist\n", field);
+                       
        printf("new_obj%s%-18s: %d,%d,%d,%d,%d,%d,%d\n",
                field ? "." : " ", field ? field : "",
                json_object_is_type(o, json_type_null),
deleted file mode 100755 (executable)
index 210246772f208b598f433b9211ef84fd21201d87..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Common definitions
-if test -z "$srcdir"; then
-    srcdir="${0%/*}"
-    test "$srcdir" = "$0" && srcdir=.
-    test -z "$srcdir" && srcdir=.
-fi
-. "$srcdir/test-defs.sh"
-
-run_output_test test_cast
-exit $?
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..58a13f4f327a79766a57c37dc53c4dbbcec6927e
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
index 936afee..cb2456b 100644 (file)
@@ -35,6 +35,6 @@ static void test_case_parse()
        assert (new_obj == NULL);
 
        printf("OK\n");
-       
+
        json_tokener_free(tok);
 }
deleted file mode 100755 (executable)
index c967475ce45aeeffa8b46ecb527e4c154fe4c71a..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Common definitions
-if test -z "$srcdir"; then
-    srcdir="${0%/*}"
-    test "$srcdir" = "$0" && srcdir=.
-    test -z "$srcdir" && srcdir=.
-fi
-. "$srcdir/test-defs.sh"
-
-run_output_test test_charcase
-exit $?
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..58a13f4f327a79766a57c37dc53c4dbbcec6927e
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
diff --git a/tests/test_compare.c b/tests/test_compare.c
new file mode 100644 (file)
index 0000000..c7e44f6
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+* Tests if json_object_equal behaves correct.
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include "config.h"
+
+#include "json_inttypes.h"
+#include "json_object.h"
+#include "json_tokener.h"
+
+int main()
+{
+       /* integer tests */
+       struct json_object *int1 = json_object_new_int(0);
+       struct json_object *int2 = json_object_new_int(1);
+       struct json_object *int3 = json_object_new_int(1);
+
+       if (!json_object_equal(int1, int2))
+               printf("JSON integer comparision is correct\n");
+       else
+               printf("JSON integer comparision failed\n");
+
+       if (json_object_equal(int1, int1))
+               printf("JSON same object comparision is correct\n");
+       else
+               printf("JSON same object comparision failed\n");
+
+       if (json_object_equal(int2, int3))
+               printf("JSON same integer comparision is correct\n");
+       else
+               printf("JSON same integer comparision failed\n");
+
+       json_object_put(int1);
+       json_object_put(int2);
+       json_object_put(int3);
+
+       /* string tests */
+       struct json_object *str1 = json_object_new_string("TESTSTRING");
+       struct json_object *str2 = json_object_new_string("TESTSTRING");
+       struct json_object *str3 = json_object_new_string("DIFFERENT");
+
+       if (json_object_equal(str1, str2))
+               printf("Comparing equal strings is correct\n");
+       else
+               printf("Comparing equal strings failed\n");
+
+       if (!json_object_equal(str1, str3))
+               printf("Comparing different strings is correct\n");
+       else
+               printf("Comparing different strings failed\n");
+
+       json_object_put(str1);
+       json_object_put(str2);
+       json_object_put(str3);
+
+       /* double tests */
+       struct json_object *dbl1 = json_object_new_double(3.14159);
+       struct json_object *dbl2 = json_object_new_double(3.14159);
+       struct json_object *dbl3 = json_object_new_double(3.0);
+
+       if (json_object_equal(dbl1, dbl2))
+               printf("Comparing equal doubles is correct\n");
+       else
+               printf("Comparing equal doubles failed\n");
+
+       if (!json_object_equal(dbl1, dbl3))
+               printf("Comparing different doubles is correct\n");
+       else
+               printf("Comparing different doubles failed\n");
+
+       json_object_put(dbl1);
+       json_object_put(dbl2);
+       json_object_put(dbl3);
+
+       /* array tests */
+       struct json_object *ar1 = json_object_new_array();
+       struct json_object *ar2 = json_object_new_array();
+       struct json_object *ar3 = json_object_new_array();
+       struct json_object *ar4 = json_object_new_array();
+
+       json_object_array_add(ar1, json_object_new_int(1));
+       json_object_array_add(ar1, json_object_new_int(2));
+
+       json_object_array_add(ar2, json_object_new_int(1));
+       json_object_array_add(ar2, json_object_new_int(2));
+
+       json_object_array_add(ar3, json_object_new_int(1));
+       json_object_array_add(ar3, json_object_new_int(1));
+
+       if (json_object_equal(ar1, ar2))
+               printf("Comparing equal arrays is correct\n");
+       else
+               printf("Comparing equal arrays failed\n");
+
+       json_object_array_add(ar2, json_object_new_int(1));
+       if (!json_object_equal(ar1, ar2))
+               printf("Comparing arrays of different len is correct\n");
+       else
+               printf("Comparing arrays of different len failed\n");
+
+       if (!json_object_equal(ar1, ar3))
+               printf("Comparing different arrays is correct\n");
+       else
+               printf("Comparing different arrays failed\n");
+
+       if (!json_object_equal(ar1, ar4))
+               printf("Comparing different arrays (one empty) is correct\n");
+       else
+               printf("Comparing different arrays (one empty) failed\n");
+
+       json_object_put(ar1);
+       json_object_put(ar2);
+       json_object_put(ar3);
+       json_object_put(ar4);
+
+       /* object tests */
+       struct json_object *obj1 = json_object_new_object();
+       struct json_object *obj2 = json_object_new_object();
+
+       json_object_object_add(obj1, "test1", json_object_new_int(123));
+       json_object_object_add(obj1, "test2", json_object_new_int(321));
+       json_object_object_add(obj1, "test3", json_object_new_int(320));
+       json_object_object_add(obj1, "test4", json_object_new_int(319));
+       json_object_object_add(obj1, "test5", json_object_new_int(318));
+
+       json_object_object_add(obj2, "test5", json_object_new_int(318));
+       json_object_object_add(obj2, "test4", json_object_new_int(319));
+       json_object_object_add(obj2, "test3", json_object_new_int(320));
+       json_object_object_add(obj2, "test2", json_object_new_int(321));
+       json_object_object_add(obj2, "test1", json_object_new_int(123));
+
+       /* key-order is different between obj1 and obj2, should still be equal */
+       if (json_object_equal(obj1, obj2))
+               printf("Comparing JSON object with different key order is correct\n");
+       else
+               printf("Comparing JSON object with different key order is incorrect\n");
+
+       /* make obj2 look different to obj1 */
+       json_object_object_add(obj2, "test3", json_object_new_int(234));
+       if (!json_object_equal(obj1, obj2))
+               printf("Comparing different objects is correct\n");
+       else
+               printf("Comparing different objects is incorrect\n");
+
+       json_object_put(obj1);
+       json_object_put(obj2);
+
+       return 0;
+}
diff --git a/tests/test_compare.expected b/tests/test_compare.expected
new file mode 100644 (file)
index 0000000..46f03c4
--- /dev/null
@@ -0,0 +1,13 @@
+JSON integer comparision is correct
+JSON same object comparision is correct
+JSON same integer comparision is correct
+Comparing equal strings is correct
+Comparing different strings is correct
+Comparing equal doubles is correct
+Comparing different doubles is correct
+Comparing equal arrays is correct
+Comparing arrays of different len is correct
+Comparing different arrays is correct
+Comparing different arrays (one empty) is correct
+Comparing JSON object with different key order is correct
+Comparing different objects is correct
diff --git a/tests/test_compare.test b/tests/test_compare.test
new file mode 120000 (symlink)
index 0000000..58a13f4
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
diff --git a/tests/test_deep_copy.c b/tests/test_deep_copy.c
new file mode 100644 (file)
index 0000000..7a6e63f
--- /dev/null
@@ -0,0 +1,248 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <time.h>
+
+#include "json.h"
+#include "printbuf.h"
+
+static void do_benchmark(json_object *src1);
+
+static const char *json_str1 = 
+"{"
+"    \"glossary\": {"
+"        \"title\": \"example glossary\","
+"        \"GlossDiv\": {"
+"            \"title\": \"S\","
+"            \"null_obj\": null, "
+"            \"GlossList\": {"
+"                \"GlossEntry\": {"
+"                    \"ID\": \"SGML\","
+"                    \"SortAs\": \"SGML\","
+"                    \"GlossTerm\": \"Standard Generalized Markup Language\","
+"                    \"Acronym\": \"SGML\","
+"                    \"Abbrev\": \"ISO 8879:1986\","
+"                    \"GlossDef\": {"
+"                        \"para\": \"A meta-markup language, used to create markup languages such as DocBook.\","
+"                        \"GlossSeeAlso\": [\"GML\", \"XML\"]"
+"                    },"
+"                    \"GlossSee\": \"markup\""
+"                }"
+"            }"
+"        }"
+"    }"
+"}";
+
+static const char *json_str2 =
+"{\"menu\": {"
+"    \"header\": \"SVG Viewer\","
+"    \"items\": ["
+"        {\"id\": \"Open\"},"
+"        {\"id\": \"OpenNew\", \"label\": \"Open New\"},"
+"        null,"
+"        {\"id\": \"ZoomIn\", \"label\": \"Zoom In\"},"
+"        {\"id\": \"ZoomOut\", \"label\": \"Zoom Out\"},"
+"        {\"id\": \"OriginalView\", \"label\": \"Original View\"},"
+"        null,"
+"        {\"id\": \"Quality\", \"another_null\": null},"
+"        {\"id\": \"Pause\"},"
+"        {\"id\": \"Mute\"},"
+"        null,"
+"        {\"id\": \"Find\", \"label\": \"Find...\"},"
+"        {\"id\": \"FindAgain\", \"label\": \"Find Again\"},"
+"        {\"id\": \"Copy\"},"
+"        {\"id\": \"CopyAgain\", \"label\": \"Copy Again\"},"
+"        {\"id\": \"CopySVG\", \"label\": \"Copy SVG\"},"
+"        {\"id\": \"ViewSVG\", \"label\": \"View SVG\"},"
+"        {\"id\": \"ViewSource\", \"label\": \"View Source\"},"
+"        {\"id\": \"SaveAs\", \"label\": \"Save As\"},"
+"        null,"
+"        {\"id\": \"Help\"},"
+"        {\"id\": \"About\", \"label\": \"About Adobe CVG Viewer...\"}"
+"    ]"
+"}}";
+
+static const char *json_str3 =
+"{\"menu\": {"
+"  \"id\": \"file\","
+"  \"value\": \"File\","
+"  \"popup\": {"
+"    \"menuitem\": ["
+"      {\"value\": \"New\", \"onclick\": \"CreateNewDoc()\"},"
+"      {\"value\": \"Open\", \"onclick\": \"OpenDoc()\"},"
+"      {\"value\": \"Close\", \"onclick\": \"CloseDoc()\"}"
+"    ]"
+"  }"
+"}}";
+
+json_object_to_json_string_fn my_custom_serializer;
+int my_custom_serializer(struct json_object *jso, struct printbuf *pb, int level, int flags)
+{
+       sprintbuf(pb, "OTHER");
+       return 0;
+}
+
+json_c_shallow_copy_fn my_shallow_copy;
+int my_shallow_copy(json_object *src, json_object *parent, const char *key, size_t index, json_object **dst)
+{
+       int rc;
+       rc = json_c_shallow_copy_default(src, parent, key, index, dst);
+       if (rc < 0)
+               return rc;
+       if (key != NULL && strcmp(key, "with_serializer") == 0)
+       {
+               printf("CALLED: my_shallow_copy on with_serializer object\n");
+               void *userdata = json_object_get_userdata(src);
+               json_object_set_serializer(*dst, my_custom_serializer, userdata, NULL);
+               return 2;
+       }
+       return rc;
+}
+
+
+int main(int argc, char **argv)
+{
+       struct json_object *src1, *src2, *src3;
+       struct json_object *dst1 = NULL, *dst2 = NULL, *dst3 = NULL;
+       int benchmark = 0;
+
+       if (argc > 1 && strcmp(argv[1], "--benchmark") == 0)
+       {
+               benchmark = 1;
+       }
+
+       src1 = json_tokener_parse(json_str1);
+       src2 = json_tokener_parse(json_str2);
+       src3 = json_tokener_parse(json_str3);
+
+       assert(src1 != NULL);
+       assert(src1 != NULL);
+       assert(src3 != NULL);
+
+       printf("PASSED - loaded input data\n");
+
+       /* do this 3 times to make sure overwriting it works */
+       assert(0 == json_object_deep_copy(src1, &dst1, NULL));
+       assert(0 == json_object_deep_copy(src2, &dst2, NULL));
+       assert(0 == json_object_deep_copy(src3, &dst3, NULL));
+
+       printf("PASSED - all json_object_deep_copy() returned succesful\n");
+
+       assert(-1 == json_object_deep_copy(src1, &dst1, NULL));
+       assert(errno == EINVAL);
+       assert(-1 == json_object_deep_copy(src2, &dst2, NULL));
+       assert(errno == EINVAL);
+       assert(-1 == json_object_deep_copy(src3, &dst3, NULL));
+       assert(errno == EINVAL);
+
+       printf("PASSED - all json_object_deep_copy() returned EINVAL for non-null pointer\n");
+
+       assert(1 == json_object_equal(src1, dst1));
+       assert(1 == json_object_equal(src2, dst2));
+       assert(1 == json_object_equal(src3, dst3));
+
+       printf("PASSED - all json_object_equal() tests returned succesful\n");
+
+       assert(0 == strcmp(json_object_to_json_string_ext(src1, JSON_C_TO_STRING_PRETTY),
+                          json_object_to_json_string_ext(dst1, JSON_C_TO_STRING_PRETTY)));
+       assert(0 == strcmp(json_object_to_json_string_ext(src2, JSON_C_TO_STRING_PRETTY),
+                          json_object_to_json_string_ext(dst2, JSON_C_TO_STRING_PRETTY)));
+       assert(0 == strcmp(json_object_to_json_string_ext(src3, JSON_C_TO_STRING_PRETTY),
+                          json_object_to_json_string_ext(dst3, JSON_C_TO_STRING_PRETTY)));
+
+       printf("PASSED - comparison of string output\n");
+
+       json_object_get(dst1);
+       assert(-1 == json_object_deep_copy(src1, &dst1, NULL));
+       assert(errno == EINVAL);
+       json_object_put(dst1);
+
+       printf("PASSED - trying to overrwrite an object that has refcount > 1");
+
+       printf("\nPrinting JSON objects for visual inspection\n");
+       printf("------------------------------------------------\n");
+       printf(" JSON1\n");
+       printf("%s\n", json_object_to_json_string_ext(dst1, JSON_C_TO_STRING_PRETTY));
+       printf("------------------------------------------------\n");
+
+       printf("------------------------------------------------\n");
+       printf(" JSON2\n");
+       printf("%s\n", json_object_to_json_string_ext(dst2, JSON_C_TO_STRING_PRETTY));
+       printf("------------------------------------------------\n");
+
+       printf("------------------------------------------------\n");
+       printf(" JSON3\n");
+       printf("------------------------------------------------\n");
+       printf("%s\n", json_object_to_json_string_ext(dst3, JSON_C_TO_STRING_PRETTY));
+       printf("------------------------------------------------\n");
+
+       json_object_put(dst1);
+       json_object_put(dst2);
+       json_object_put(dst3);
+
+       printf("\nTesting deep_copy with a custom serializer set\n");
+       json_object *with_serializer = json_object_new_string("notemitted");
+
+       json_object_set_serializer(with_serializer, my_custom_serializer, "dummy userdata", NULL);
+       json_object_object_add(src1, "with_serializer", with_serializer);
+       dst1 = NULL;
+       /* With a custom serializer in use, a custom shallow_copy function must also be used */
+       assert(-1 == json_object_deep_copy(src1, &dst1, NULL));
+       assert(0 == json_object_deep_copy(src1, &dst1, my_shallow_copy));
+
+       json_object *dest_with_serializer = json_object_object_get(dst1, "with_serializer");
+       assert(dest_with_serializer != NULL);
+       char *dst_userdata = json_object_get_userdata(dest_with_serializer);
+       assert(strcmp(dst_userdata, "dummy userdata") == 0);
+
+       const char *special_output = json_object_to_json_string(dest_with_serializer);
+       assert(strcmp(special_output, "OTHER") == 0);
+       printf("\ndeep_copy with custom serializer worked OK.\n");
+       json_object_put(dst1);
+
+       if (benchmark)
+       {
+               do_benchmark(src2);
+       }
+
+       json_object_put(src1);
+       json_object_put(src2);
+       json_object_put(src3);
+
+       return 0;
+}
+
+static void do_benchmark(json_object *src2)
+{
+       json_object *dst2 = NULL;
+
+       int ii;
+       /**
+        * The numbers that I got are:
+        * BENCHMARK - 1000000 iterations of 'dst2 = json_tokener_parse(json_object_get_string(src2))' took 71 seconds
+        * BENCHMARK - 1000000 iterations of 'json_object_deep_copy(src2, &dst2, NULL)' took 29 seconds
+        */
+
+       int iterations = 1000000;
+       time_t start = time(NULL);
+
+       start = time(NULL);
+       for (ii = 0; ii < iterations; ii++) {
+               dst2 = json_tokener_parse(json_object_get_string(src2));
+               json_object_put(dst2);
+       }
+       printf("BENCHMARK - %d iterations of 'dst2 = json_tokener_parse(json_object_get_string(src2))' took %d seconds\n", iterations, (int)(time(NULL) - start));
+
+       start = time(NULL);
+       dst2 = NULL;
+       for (ii = 0; ii < iterations; ii++) {
+               json_object_deep_copy(src2, &dst2, NULL);
+               json_object_put(dst2);
+               dst2 = NULL;
+       }
+       printf("BENCHMARK - %d iterations of 'json_object_deep_copy(src2, &dst2, NULL)' took %d seconds\n", iterations, (int)(time(NULL) - start));
+}
+
diff --git a/tests/test_deep_copy.expected b/tests/test_deep_copy.expected
new file mode 100644 (file)
index 0000000..d009e94
--- /dev/null
@@ -0,0 +1,148 @@
+PASSED - loaded input data
+PASSED - all json_object_deep_copy() returned succesful
+PASSED - all json_object_deep_copy() returned EINVAL for non-null pointer
+PASSED - all json_object_equal() tests returned succesful
+PASSED - comparison of string output
+PASSED - trying to overrwrite an object that has refcount > 1
+Printing JSON objects for visual inspection
+------------------------------------------------
+ JSON1
+{
+  "glossary":{
+    "title":"example glossary",
+    "GlossDiv":{
+      "title":"S",
+      "null_obj":null,
+      "GlossList":{
+        "GlossEntry":{
+          "ID":"SGML",
+          "SortAs":"SGML",
+          "GlossTerm":"Standard Generalized Markup Language",
+          "Acronym":"SGML",
+          "Abbrev":"ISO 8879:1986",
+          "GlossDef":{
+            "para":"A meta-markup language, used to create markup languages such as DocBook.",
+            "GlossSeeAlso":[
+              "GML",
+              "XML"
+            ]
+          },
+          "GlossSee":"markup"
+        }
+      }
+    }
+  }
+}
+------------------------------------------------
+------------------------------------------------
+ JSON2
+{
+  "menu":{
+    "header":"SVG Viewer",
+    "items":[
+      {
+        "id":"Open"
+      },
+      {
+        "id":"OpenNew",
+        "label":"Open New"
+      },
+      null,
+      {
+        "id":"ZoomIn",
+        "label":"Zoom In"
+      },
+      {
+        "id":"ZoomOut",
+        "label":"Zoom Out"
+      },
+      {
+        "id":"OriginalView",
+        "label":"Original View"
+      },
+      null,
+      {
+        "id":"Quality",
+        "another_null":null
+      },
+      {
+        "id":"Pause"
+      },
+      {
+        "id":"Mute"
+      },
+      null,
+      {
+        "id":"Find",
+        "label":"Find..."
+      },
+      {
+        "id":"FindAgain",
+        "label":"Find Again"
+      },
+      {
+        "id":"Copy"
+      },
+      {
+        "id":"CopyAgain",
+        "label":"Copy Again"
+      },
+      {
+        "id":"CopySVG",
+        "label":"Copy SVG"
+      },
+      {
+        "id":"ViewSVG",
+        "label":"View SVG"
+      },
+      {
+        "id":"ViewSource",
+        "label":"View Source"
+      },
+      {
+        "id":"SaveAs",
+        "label":"Save As"
+      },
+      null,
+      {
+        "id":"Help"
+      },
+      {
+        "id":"About",
+        "label":"About Adobe CVG Viewer..."
+      }
+    ]
+  }
+}
+------------------------------------------------
+------------------------------------------------
+ JSON3
+------------------------------------------------
+{
+  "menu":{
+    "id":"file",
+    "value":"File",
+    "popup":{
+      "menuitem":[
+        {
+          "value":"New",
+          "onclick":"CreateNewDoc()"
+        },
+        {
+          "value":"Open",
+          "onclick":"OpenDoc()"
+        },
+        {
+          "value":"Close",
+          "onclick":"CloseDoc()"
+        }
+      ]
+    }
+  }
+}
+------------------------------------------------
+
+Testing deep_copy with a custom serializer set
+CALLED: my_shallow_copy on with_serializer object
+
+deep_copy with custom serializer worked OK.
diff --git a/tests/test_deep_copy.test b/tests/test_deep_copy.test
new file mode 120000 (symlink)
index 0000000..58a13f4
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
diff --git a/tests/test_double_serializer.c b/tests/test_double_serializer.c
new file mode 100644 (file)
index 0000000..c7b229e
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+* Tests if the format string for double serialization is handled correctly
+*/
+
+#include <stdio.h>
+#include "config.h"
+
+#include "json_object.h"
+#include "json_object_private.h"
+
+int main()
+{
+       struct json_object *obj = json_object_new_double(0.5);
+
+       printf("Test default serializer:\n");
+       printf("obj.to_string(standard)=%s\n", json_object_to_json_string(obj));
+
+       printf("Test default serializer with custom userdata:\n");
+       obj->_userdata = "test";
+       printf("obj.to_string(userdata)=%s\n", json_object_to_json_string(obj));
+
+       printf("Test explicit serializer with custom userdata:\n");
+       json_object_set_serializer(obj, json_object_double_to_json_string, "test", NULL);
+       printf("obj.to_string(custom)=%s\n", json_object_to_json_string(obj));
+
+       printf("Test reset serializer:\n");
+       json_object_set_serializer(obj, NULL, NULL, NULL);
+       printf("obj.to_string(reset)=%s\n", json_object_to_json_string(obj));
+
+       json_object_put(obj);
+       obj = json_object_new_double(0.52381);
+
+       printf("obj.to_string(default format)=%s\n", json_object_to_json_string(obj));
+       if (json_c_set_serialization_double_format("x%0.3fy", JSON_C_OPTION_GLOBAL) < 0)
+               printf("ERROR: json_c_set_serialization_double_format() failed");
+       printf("obj.to_string(with global format)=%s\n", json_object_to_json_string(obj));
+#ifdef HAVE___THREAD
+       if (json_c_set_serialization_double_format("T%0.2fX", JSON_C_OPTION_THREAD) < 0)
+               printf("ERROR: json_c_set_serialization_double_format() failed");
+       printf("obj.to_string(with thread format)=%s\n", json_object_to_json_string(obj));
+       if (json_c_set_serialization_double_format("Ttttttttttttt%0.2fxxxxxxxxxxxxxxxxxxX", JSON_C_OPTION_THREAD) < 0)
+               printf("ERROR: json_c_set_serialization_double_format() failed");
+       printf("obj.to_string(long thread format)=%s\n", json_object_to_json_string(obj));
+       if (json_c_set_serialization_double_format(NULL, JSON_C_OPTION_THREAD) < 0)
+               printf("ERROR: json_c_set_serialization_double_format() failed");
+       printf("obj.to_string(back to global format)=%s\n", json_object_to_json_string(obj));
+#else
+       // Just fake it up, so the output matches.
+       printf("obj.to_string(with thread format)=%s\n", "T0.52X");
+       printf("obj.to_string(back to global format)=%s\n", "x0.524y");
+#endif
+       if (json_c_set_serialization_double_format(NULL, JSON_C_OPTION_GLOBAL) < 0)
+               printf("ERROR: json_c_set_serialization_double_format() failed");
+       printf("obj.to_string(back to default format)=%s\n", json_object_to_json_string(obj));
+
+       json_object_put(obj);
+}
diff --git a/tests/test_double_serializer.expected b/tests/test_double_serializer.expected
new file mode 100644 (file)
index 0000000..cd5f02b
--- /dev/null
@@ -0,0 +1,14 @@
+Test default serializer:
+obj.to_string(standard)=0.5
+Test default serializer with custom userdata:
+obj.to_string(userdata)=0.5
+Test explicit serializer with custom userdata:
+obj.to_string(custom)=test
+Test reset serializer:
+obj.to_string(reset)=0.5
+obj.to_string(default format)=0.52381
+obj.to_string(with global format)=x0.524y
+obj.to_string(with thread format)=T0.52X
+obj.to_string(long thread format)=Ttttttttttttt0.52xxxxxxxxxxxxxxxxxxX
+obj.to_string(back to global format)=x0.524y
+obj.to_string(back to default format)=0.52381
diff --git a/tests/test_double_serializer.test b/tests/test_double_serializer.test
new file mode 120000 (symlink)
index 0000000..58a13f4
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
diff --git a/tests/test_float.c b/tests/test_float.c
new file mode 100644 (file)
index 0000000..a790cd4
--- /dev/null
@@ -0,0 +1,24 @@
+/* Copyright (C) 2016 by Rainer Gerhards 
+ * Released under ASL 2.0 */
+#include "config.h"
+#include <stdio.h>
+#include "../json_object.h"
+#include "../json_tokener.h"
+int main(void)
+{
+  json_object *json;
+
+  json = json_object_new_double(1.0);
+  printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY));
+  json_object_put(json);
+  json = json_object_new_double(1.23);
+  printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY));
+  json_object_put(json);
+  json = json_object_new_double(123456789.0);
+  printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY));
+  json_object_put(json);
+  json = json_object_new_double(123456789.123);
+  printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY));
+  json_object_put(json);
+  return 0;
+}
diff --git a/tests/test_float.expected b/tests/test_float.expected
new file mode 100644 (file)
index 0000000..970c654
--- /dev/null
@@ -0,0 +1,4 @@
+json = 1.0
+json = 1.23
+json = 123456789.0
+json = 123456789.123
diff --git a/tests/test_float.test b/tests/test_float.test
new file mode 120000 (symlink)
index 0000000..58a13f4
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
diff --git a/tests/test_int_add.c b/tests/test_int_add.c
new file mode 100644 (file)
index 0000000..08a8802
--- /dev/null
@@ -0,0 +1,47 @@
+#include <assert.h>
+#include <stdio.h>
+
+#include "json.h"
+
+int main(int argc, char **argv)
+{
+       json_object *tmp = json_object_new_int(123);
+       json_object_int_inc(tmp, 123);
+       assert(json_object_get_int(tmp) == 246);
+       json_object_put(tmp);
+       printf("INT ADD PASSED\n");
+       tmp = json_object_new_int(INT32_MAX);
+       json_object_int_inc(tmp, 100);
+       assert(json_object_get_int(tmp) == INT32_MAX);
+       assert(json_object_get_int64(tmp) == (int64_t)INT32_MAX + 100L);
+       json_object_put(tmp);
+       printf("INT ADD OVERFLOW PASSED\n");
+       tmp = json_object_new_int(INT32_MIN);
+       json_object_int_inc(tmp, -100);
+       assert(json_object_get_int(tmp) == INT32_MIN);
+       assert(json_object_get_int64(tmp) == (int64_t)INT32_MIN - 100L);
+       json_object_put(tmp);
+       printf("INT ADD UNDERFLOW PASSED\n");
+       tmp = json_object_new_int64(321321321);
+       json_object_int_inc(tmp, 321321321);
+       assert(json_object_get_int(tmp) == 642642642);
+       json_object_put(tmp);
+       printf("INT64 ADD PASSED\n");
+       tmp = json_object_new_int64(INT64_MAX);
+       json_object_int_inc(tmp, 100);
+       assert(json_object_get_int64(tmp) == INT64_MAX);
+       json_object_int_inc(tmp, -100);
+       assert(json_object_get_int64(tmp) != INT64_MAX);
+       json_object_put(tmp);
+       printf("INT64 ADD OVERFLOW PASSED\n");
+       tmp = json_object_new_int64(INT64_MIN);
+       json_object_int_inc(tmp, -100);
+       assert(json_object_get_int64(tmp) == INT64_MIN);
+       json_object_int_inc(tmp, 100);
+       assert(json_object_get_int64(tmp) != INT64_MIN);
+       json_object_put(tmp);
+       printf("INT64 ADD UNDERFLOW PASSED\n");
+
+       printf("PASSED\n");
+       return 0;
+}
diff --git a/tests/test_int_add.expected b/tests/test_int_add.expected
new file mode 100644 (file)
index 0000000..61c205c
--- /dev/null
@@ -0,0 +1,7 @@
+INT ADD PASSED
+INT ADD OVERFLOW PASSED
+INT ADD UNDERFLOW PASSED
+INT64 ADD PASSED
+INT64 ADD OVERFLOW PASSED
+INT64 ADD UNDERFLOW PASSED
+PASSED
diff --git a/tests/test_int_add.test b/tests/test_int_add.test
new file mode 120000 (symlink)
index 0000000..58a13f4
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
diff --git a/tests/test_json_pointer.c b/tests/test_json_pointer.c
new file mode 100644 (file)
index 0000000..97566e2
--- /dev/null
@@ -0,0 +1,292 @@
+#include "strerror_override.h"
+#include "strerror_override_private.h"
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "json.h"
+
+static void test_example_int(struct json_object *jo1, const char *json_pointer, int expected_int)
+{
+       struct json_object *jo2 = NULL;
+       assert(0 == json_pointer_get(jo1, json_pointer, NULL));
+       assert(0 == json_pointer_get(jo1, json_pointer, &jo2));
+       assert(json_object_is_type(jo2, json_type_int));
+       assert(expected_int == json_object_get_int(jo2));
+       printf("PASSED - GET -  %s == %d\n", json_pointer, expected_int);
+}
+
+static const char *input_json_str = "{ "
+       "'foo': ['bar', 'baz'], "
+       "'': 0, "
+       "'a/b': 1, "
+       "'c\%d': 2, "
+       "'e^f': 3, "
+       "'g|h': 4, "
+       "'i\\\\j': 5, "
+       "'k\\\"l': 6, "
+       "' ': 7, "
+       "'m~n': 8 "
+"}";
+
+
+static const char *rec_input_json_str = "{"
+       "'arr' : ["
+               "{"
+                       "'obj': ["
+                               "{},{},"
+                               "{"
+                                       "'obj1': 0,"
+                                       "'obj2': \"1\""
+                               "}"
+                       "]"
+               "}"
+       "],"
+       "'obj' : {"
+               "'obj': {"
+                       "'obj': ["
+                               "{"
+                                       "'obj1': 0,"
+                                       "'obj2': \"1\""
+                               "}"
+                       "]"
+               "}"
+       "}"
+"}";
+
+/* Example from RFC */
+static void test_example_get()
+{
+       int i;
+       struct json_object *jo1, *jo2, *jo3;
+       struct json_pointer_map_s_i {
+               const char *s;
+               int i;
+       };
+       /* Create a map to iterate over for the ints */
+       struct json_pointer_map_s_i json_pointers[] = {
+               { "/", 0 },
+               { "/a~1b", 1 },
+               {"/c%d", 2 },
+               {"/e^f", 3 },
+               { "/g|h", 4 },
+               { "/i\\j", 5 },
+               { "/k\"l", 6 },
+               { "/ ", 7 },
+               { "/m~0n", 8 },
+               { NULL, 0}
+       };
+
+       jo1 = json_tokener_parse(input_json_str);
+       assert(NULL != jo1);
+       printf("PASSED - GET - LOADED TEST JSON\n");
+       printf("%s\n", json_object_get_string(jo1));
+
+       /* Test empty string returns entire object */
+       jo2 = NULL;
+       /* For each test, we're trying to see that NULL **value works (does no segfault) */
+       assert(0 == json_pointer_get(jo1, "", NULL));
+       assert(0 == json_pointer_get(jo1, "", &jo2));
+       assert(json_object_equal(jo2, jo1));
+       printf("PASSED - GET - ENTIRE OBJECT WORKED\n");
+
+       /* Test /foo == ['bar', 'baz']  */
+       jo3 = json_object_new_array();
+       json_object_array_add(jo3, json_object_new_string("bar"));
+       json_object_array_add(jo3, json_object_new_string("baz"));
+
+       jo2 = NULL;
+       assert(0 == json_pointer_get(jo1, "/foo", NULL));
+       assert(0 == json_pointer_get(jo1, "/foo", &jo2));
+       assert(NULL != jo2);
+       assert(json_object_equal(jo2, jo3));
+       json_object_put(jo3);
+       printf("PASSED - GET - /foo == ['bar', 'baz']\n");
+
+       /* Test /foo/0 == 'bar' */
+       jo2 = NULL;
+       assert(0 == json_pointer_get(jo1, "/foo/0", NULL));
+       assert(0 == json_pointer_get(jo1, "/foo/0", &jo2));
+       assert(NULL != jo2);
+       assert(0 == strcmp("bar", json_object_get_string(jo2)));
+       printf("PASSED - GET - /foo/0 == 'bar'\n");
+
+       for (i = 0 ; json_pointers[i].s; i++)
+               test_example_int(jo1, json_pointers[i].s, json_pointers[i].i);
+
+       json_object_put(jo1);
+}
+
+/* I'm not too happy with the RFC example to test the recusion of the json_pointer_get() function */
+static void test_recursion_get()
+{
+       struct json_object *jo2, *jo1 = json_tokener_parse(rec_input_json_str);
+
+       jo2 = NULL;
+       assert(jo1 != NULL);
+       printf("%s\n", json_object_get_string(jo1));
+       assert(0 == json_pointer_get(jo1, "/arr/0/obj/2/obj1", &jo2));
+       assert(json_object_is_type(jo2, json_type_int));
+       assert(0 == json_object_get_int(jo2));
+
+       assert(0 == json_pointer_get(jo1, "/arr/0/obj/2/obj2", &jo2));
+       assert(json_object_is_type(jo2, json_type_string));
+       assert(0 == strcmp("1", json_object_get_string(jo2)));
+
+       assert(0 == json_pointer_getf(jo1, &jo2, "/%s/%d/%s/%d/%s", "arr", 0, "obj", 2, "obj2"));
+       assert(json_object_is_type(jo2, json_type_string));
+       assert(0 == strcmp("1", json_object_get_string(jo2)));
+
+       assert(jo1 != NULL);
+       assert(0 == json_pointer_get(jo1, "/obj/obj/obj/0/obj1", &jo2));
+       assert(json_object_is_type(jo2, json_type_int));
+       assert(0 == json_object_get_int(jo2));
+
+       assert(0 == json_pointer_get(jo1, "/obj/obj/obj/0/obj2", &jo2));
+       assert(json_object_is_type(jo2, json_type_string));
+       assert(0 == strcmp("1", json_object_get_string(jo2)));
+
+       printf("PASSED - GET - RECURSION TEST\n");
+
+       json_object_put(jo1);
+}
+
+static void test_wrong_inputs_get()
+{
+       struct json_object *jo2, *jo1 = json_tokener_parse(input_json_str);
+
+       assert(NULL != jo1);
+       printf("PASSED - GET - LOADED TEST JSON\n");
+       printf("%s\n", json_object_get_string(jo1));
+
+       /* Test leading '/' missing */
+       jo2 = NULL;
+       errno = 0;
+       assert(0 != json_pointer_get(jo1, "foo/bar", NULL));
+       assert(0 != json_pointer_get(jo1, "foo/bar", &jo2));
+       assert(errno == EINVAL);
+       assert(jo2 == NULL);
+       printf("PASSED - GET - MISSING /\n");
+
+       /* Test combinations of NULL params for input json & path */
+       errno = 0;
+       assert(0 != json_pointer_get(NULL, "foo/bar", NULL));
+       assert(errno == EINVAL);
+       errno = 0;
+       assert(0 != json_pointer_get(NULL, NULL, NULL));
+       assert(errno == EINVAL);
+       errno = 0;
+       assert(0 != json_pointer_get(jo1, NULL, NULL));
+       assert(errno == EINVAL);
+       printf("PASSED - GET - NULL INPUTS\n");
+
+       /* Test invalid indexes for array */
+       errno = 0;
+       assert(0 != json_pointer_get(jo1, "/foo/a", NULL));
+       assert(errno == EINVAL);
+       errno = 0;
+       assert(0 != json_pointer_getf(jo1, NULL, "/%s/a", "foo"));
+       assert(errno == EINVAL);
+       errno = 0;
+       assert(0 != json_pointer_get(jo1, "/foo/-", NULL));
+       assert(errno == EINVAL);
+       errno = 0;
+       /* Test optimized array path */
+       assert(0 != json_pointer_get(jo1, "/foo/4", NULL));
+       assert(errno == ENOENT);
+       errno = 0;
+       /* Test non-optimized array path */
+       assert(0 != json_pointer_getf(jo1, NULL, "%s", "/foo/22"));
+       assert(errno == ENOENT);
+       errno = 0;
+       assert(0 != json_pointer_getf(jo1, NULL, "/%s/%d", "foo", 22));
+       assert(errno == ENOENT);
+       errno = 0;
+       assert(0 != json_pointer_get(jo1, "/foo/-1", NULL));
+       assert(errno == EINVAL);
+       errno = 0;
+       assert(0 != json_pointer_get(jo1, "/foo/10", NULL));
+       assert(errno == ENOENT);
+       printf("PASSED - GET - INVALID INDEXES\n");
+
+       json_object_put(jo1);
+}
+
+static void test_example_set()
+{
+       struct json_object *jo2, *jo1 = json_tokener_parse(input_json_str);
+
+       assert(jo1 != NULL);
+       printf("PASSED - SET - LOADED TEST JSON\n");
+       printf("%s\n", json_object_get_string(jo1));
+
+       assert(0 == json_pointer_set(&jo1, "/foo/1", json_object_new_string("cod")));
+       assert(0 == strcmp("cod", json_object_get_string(json_object_array_get_idx(json_object_object_get(jo1, "foo"), 1))));
+       printf("PASSED - SET - 'cod' in /foo/1\n");
+       assert(0 != json_pointer_set(&jo1, "/fud/gaw", (jo2 = json_tokener_parse("[1,2,3]"))));
+       assert(errno == ENOENT);
+       printf("PASSED - SET - non-existing /fud/gaw\n");
+       assert(0 == json_pointer_set(&jo1, "/fud", json_object_new_object()));
+       printf("PASSED - SET - /fud == {}\n");
+       assert(0 == json_pointer_set(&jo1, "/fud/gaw", jo2)); /* re-using jo2 from above */
+       printf("PASSED - SET - /fug/gaw == [1,2,3]\n");
+       assert(0 == json_pointer_set(&jo1, "/fud/gaw/0", json_object_new_int(0)));
+       assert(0 == json_pointer_setf(&jo1, json_object_new_int(0), "%s%s/%d", "/fud", "/gaw", 0));
+       printf("PASSED - SET - /fug/gaw == [0,2,3]\n");
+       assert(0 == json_pointer_set(&jo1, "/fud/gaw/-", json_object_new_int(4)));
+       printf("PASSED - SET - /fug/gaw == [0,2,3,4]\n");
+       assert(0 == json_pointer_set(&jo1, "/", json_object_new_int(9)));
+       printf("PASSED - SET - / == 9\n");
+
+       jo2 = json_tokener_parse("{ 'foo': [ 'bar', 'cod' ], '': 9, 'a/b': 1, 'c\%d': 2, 'e^f': 3, 'g|h': 4, 'i\\\\j': 5, 'k\\\"l': 6, ' ': 7, 'm~n': 8, 'fud': { 'gaw': [ 0, 2, 3, 4 ] } }");
+       assert(json_object_equal(jo2, jo1));
+       printf("PASSED - SET - Final JSON is: %s\n", json_object_get_string(jo1));
+       json_object_put(jo2);
+
+       assert(0 == json_pointer_set(&jo1, "", json_object_new_int(10)));
+       assert(10 == json_object_get_int(jo1));
+       printf("%s\n", json_object_get_string(jo1));
+
+       json_object_put(jo1);
+}
+
+static void test_wrong_inputs_set()
+{
+       struct json_object *jo2, *jo1 = json_tokener_parse(input_json_str);
+
+       assert(jo1 != NULL);
+       printf("PASSED - SET - LOADED TEST JSON\n");
+       printf("%s\n", json_object_get_string(jo1));
+
+       assert(0 != json_pointer_set(&jo1, "foo/bar", (jo2 = json_object_new_string("cod"))));
+       printf("PASSED - SET - failed 'cod' with path 'foo/bar'\n");
+       json_object_put(jo2);
+
+       jo2 = json_object_new_string("whatever");
+       assert(0 != json_pointer_set(&jo1, "/fud/gaw", jo2));
+       assert(0 == json_pointer_set(&jo1, "/fud", json_object_new_object()));
+       assert(0 == json_pointer_set(&jo1, "/fud/gaw", jo2)); /* re-using jo2 from above */
+       // ownership of jo2 transferred into jo1
+
+       jo2 = json_object_new_int(0);
+       assert(0 != json_pointer_set(&jo1, "/fud/gaw/0", jo2));
+       json_object_put(jo2);
+       jo2 = json_object_new_int(0);
+       assert(0 != json_pointer_set(&jo1, "/fud/gaw/", jo2));
+       json_object_put(jo2);
+       printf("PASSED - SET - failed to set index to non-array\n");
+
+       json_object_put(jo1);
+}
+
+int main(int argc, char **argv)
+{
+       _json_c_strerror_enable = 1;
+
+       test_example_get();
+       test_recursion_get();
+       test_wrong_inputs_get();
+       test_example_set();
+       test_wrong_inputs_set();
+       return 0;
+}
diff --git a/tests/test_json_pointer.expected b/tests/test_json_pointer.expected
new file mode 100644 (file)
index 0000000..e77e542
--- /dev/null
@@ -0,0 +1,36 @@
+PASSED - GET - LOADED TEST JSON
+{ "foo": [ "bar", "baz" ], "": 0, "a\/b": 1, "c%d": 2, "e^f": 3, "g|h": 4, "i\\j": 5, "k\"l": 6, " ": 7, "m~n": 8 }
+PASSED - GET - ENTIRE OBJECT WORKED
+PASSED - GET - /foo == ['bar', 'baz']
+PASSED - GET - /foo/0 == 'bar'
+PASSED - GET -  / == 0
+PASSED - GET -  /a~1b == 1
+PASSED - GET -  /c%d == 2
+PASSED - GET -  /e^f == 3
+PASSED - GET -  /g|h == 4
+PASSED - GET -  /i\j == 5
+PASSED - GET -  /k"l == 6
+PASSED - GET -  /  == 7
+PASSED - GET -  /m~0n == 8
+{ "arr": [ { "obj": [ { }, { }, { "obj1": 0, "obj2": "1" } ] } ], "obj": { "obj": { "obj": [ { "obj1": 0, "obj2": "1" } ] } } }
+PASSED - GET - RECURSION TEST
+PASSED - GET - LOADED TEST JSON
+{ "foo": [ "bar", "baz" ], "": 0, "a\/b": 1, "c%d": 2, "e^f": 3, "g|h": 4, "i\\j": 5, "k\"l": 6, " ": 7, "m~n": 8 }
+PASSED - GET - MISSING /
+PASSED - GET - NULL INPUTS
+PASSED - GET - INVALID INDEXES
+PASSED - SET - LOADED TEST JSON
+{ "foo": [ "bar", "baz" ], "": 0, "a\/b": 1, "c%d": 2, "e^f": 3, "g|h": 4, "i\\j": 5, "k\"l": 6, " ": 7, "m~n": 8 }
+PASSED - SET - 'cod' in /foo/1
+PASSED - SET - non-existing /fud/gaw
+PASSED - SET - /fud == {}
+PASSED - SET - /fug/gaw == [1,2,3]
+PASSED - SET - /fug/gaw == [0,2,3]
+PASSED - SET - /fug/gaw == [0,2,3,4]
+PASSED - SET - / == 9
+PASSED - SET - Final JSON is: { "foo": [ "bar", "cod" ], "": 9, "a\/b": 1, "c%d": 2, "e^f": 3, "g|h": 4, "i\\j": 5, "k\"l": 6, " ": 7, "m~n": 8, "fud": { "gaw": [ 0, 2, 3, 4 ] } }
+10
+PASSED - SET - LOADED TEST JSON
+{ "foo": [ "bar", "baz" ], "": 0, "a\/b": 1, "c%d": 2, "e^f": 3, "g|h": 4, "i\\j": 5, "k\"l": 6, " ": 7, "m~n": 8 }
+PASSED - SET - failed 'cod' with path 'foo/bar'
+PASSED - SET - failed to set index to non-array
diff --git a/tests/test_json_pointer.test b/tests/test_json_pointer.test
new file mode 120000 (symlink)
index 0000000..58a13f4
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
index da070cf..7d6541a 100644 (file)
@@ -7,10 +7,14 @@
 #include "config.h"
 #include "json.h"
 #include "json_tokener.h"
+#include "snprintf_compat.h"
 
 #ifdef HAVE_LOCALE_H
 #include <locale.h>
 #endif /* HAVE_LOCALE_H */
+#ifdef HAVE_XLOCALE_H
+#include <xlocale.h>
+#endif
 
 int main(int argc, char **argv)
 {
@@ -21,10 +25,37 @@ int main(int argc, char **argv)
        printf("No locale\n");
 #endif
 
+       char buf1[10], buf2[10];
+       // Should result in "0,1", if the locale is installed.
+       // Regardless of what it generates, we check that it's
+       // consistent below.
+       (void)snprintf(buf1, sizeof(buf1), "%f", 0.1);
+
        MC_SET_DEBUG(1);
 
        new_obj = json_tokener_parse("[1.2,3.4,123456.78,5.0,2.3e10]");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
+
+       (void)snprintf(buf2, sizeof(buf2), "%f", 0.1);
+       if (strcmp(buf1, buf2) != 0)
+               printf("ERROR: Original locale not restored \"%s\" != \"%s\"",
+                      buf1, buf2);
+
+#ifdef HAVE_SETLOCALE
+       setlocale(LC_NUMERIC, "C");
+#endif
+
+       // Explicitly print each value, to avoid having the "special"
+       // serialization done for parsed doubles simply re-emit the original
+       // string that was parsed.  (see json_object_new_double_s())
+       printf("new_obj.to_string()=[");
+       unsigned int ii;
+       for (ii = 0 ; ii < json_object_array_length(new_obj); ii++)
+       {
+               json_object *val = json_object_array_get_idx(new_obj, ii);
+               printf("%s%.2lf", (ii > 0) ? "," : "", json_object_get_double(val));
+       }
+       printf("]\n");
+
        printf("new_obj.to_string()=%s\n", json_object_to_json_string_ext(new_obj,JSON_C_TO_STRING_NOZERO));
        json_object_put(new_obj);
 }
index 0068be4..3579ef1 100644 (file)
@@ -1,2 +1,2 @@
-new_obj.to_string()=[ 1.2, 3.4, 123456.78, 5.0, 2.3e10 ]
+new_obj.to_string()=[1.20,3.40,123456.78,5.00,23000000000.00]
 new_obj.to_string()=[1.2,3.4,123456.78,5.0,2.3e10]
deleted file mode 100755 (executable)
index e4b6c6dcc610edb60f7f254e6593970627ae1dc1..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Common definitions
-if test -z "$srcdir"; then
-    srcdir="${0%/*}"
-    test "$srcdir" = "$0" && srcdir=.
-    test -z "$srcdir" && srcdir=.
-fi
-. "$srcdir/test-defs.sh"
-
-run_output_test test_locale
-exit $?
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..58a13f4f327a79766a57c37dc53c4dbbcec6927e
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
index 1f07910..6ef0a96 100644 (file)
@@ -1,6 +1,6 @@
 /*
-* Tests if binary strings are supported.
-*/
+ * Tests if binary strings are supported.
+ */
 
 #include <stdio.h>
 #include <string.h>
@@ -10,9 +10,9 @@
 #include "json_object.h"
 #include "json_tokener.h"
 
-int main()
+int main(void)
 {
-       // this test has a space after the null character. check that it's still included
+       /* this test has a space after the null character. check that it's still included */
        const char *input = " \0 ";
        const char *expected = "\" \\u0000 \"";
        struct json_object *string = json_object_new_string_len(input, 3);
@@ -23,14 +23,14 @@ int main()
        if (strings_match)
        {
                printf("JSON write result is correct: %s\n", json);
-               printf("PASS\n");
+               puts("PASS");
        } else {
-               printf("JSON write result doesn't match expected string\n");
+               puts("JSON write result doesn't match expected string");
                printf("expected string: ");
-               printf("%s\n", expected);
+               puts(expected);
                printf("parsed string:   ");
-               printf("%s\n", json);
-               printf("FAIL\n");
+               puts(json);
+               puts("FAIL");
                retval=1;
        }
        json_object_put(string);
@@ -46,12 +46,12 @@ int main()
                {
                        printf("%s%d", (ii ? ", " : ""), (int)parsed_cstr[ii]);
                }
-               printf("]\n");
+               puts("]");
                json_object_put(parsed_str);
        }
        else
        {
-               printf("ERROR: failed to parse\n");
+               puts("ERROR: failed to parse");
        }
        return retval;
 }
deleted file mode 100755 (executable)
index 469ec64a7e1b6eb7492f33c90dded4e17308b767..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Common definitions
-if test -z "$srcdir"; then
-    srcdir="${0%/*}"
-    test "$srcdir" = "$0" && srcdir=.
-    test -z "$srcdir" && srcdir=.
-fi
-. "$srcdir/test-defs.sh"
-
-run_output_test test_null
-exit $?
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..58a13f4f327a79766a57c37dc53c4dbbcec6927e
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
index 8808d0f..ee1f838 100644 (file)
 
 #include "json.h"
 #include "json_tokener.h"
+#include "json_visit.h"
 
 static void test_basic_parse(void);
 static void test_verbose_parse(void);
 static void test_incremental_parse(void);
 
-int main(int argc, char **argv)
+int main(void)
 {
        MC_SET_DEBUG(1);
 
+       static const char separator[] = "==================================";
        test_basic_parse();
-       printf("==================================\n");
+       puts(separator);
        test_verbose_parse();
-       printf("==================================\n");
+       puts(separator);
        test_incremental_parse();
-       printf("==================================\n");
+       puts(separator);
 }
 
-static void test_basic_parse()
+static json_c_visit_userfunc clear_serializer;
+static void do_clear_serializer(json_object *jso);
+
+static void single_basic_parse(const char *test_string, int clear_serializer)
 {
        json_object *new_obj;
 
-       new_obj = json_tokener_parse("\"\003\"");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("/* hello */\"foo\"");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("// hello\n\"foo\"");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("\"\\u0041\\u0042\\u0043\"");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("null");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("NaN");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("-NaN"); /* non-sensical, returns null */
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("Inf"); /* must use full string, returns null */
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("inf"); /* must use full string, returns null */
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("Infinity");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("infinity");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("-Infinity");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("-infinity");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("True");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("12");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("12.3");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("[\"\\n\"]");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("[\"\\nabc\\n\"]");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("[null]");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("[]");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("[false]");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("[\"abc\",null,\"def\",12]");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("{}");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("{ \"foo\": \"bar\" }");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
-
-       new_obj = json_tokener_parse("{ \"foo\": \"bar\", \"baz\": null, \"bool0\": true }");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
+       new_obj = json_tokener_parse(test_string);
+       if (clear_serializer)
+               do_clear_serializer(new_obj);
+       printf("new_obj.to_string(%s)=%s\n", test_string, json_object_to_json_string(new_obj));
        json_object_put(new_obj);
+}
+static void test_basic_parse()
+{
+       single_basic_parse("\"\003\"", 0);
+       single_basic_parse("/* hello */\"foo\"", 0);
+       single_basic_parse("// hello\n\"foo\"", 0);
+       single_basic_parse("\"foo\"blue", 0);
+       single_basic_parse("\"\\u0041\\u0042\\u0043\"", 0);
+       // Test with a "short" high surrogate
+       single_basic_parse("[9,'\\uDAD", 0);
+       single_basic_parse("null", 0);
+       single_basic_parse("NaN", 0);
+       single_basic_parse("-NaN", 0); /* non-sensical, returns null */
+
+       single_basic_parse("Inf", 0); /* must use full string, returns null */
+       single_basic_parse("inf", 0); /* must use full string, returns null */
+       single_basic_parse("Infinity", 0);
+       single_basic_parse("infinity", 0);
+       single_basic_parse("-Infinity", 0);
+       single_basic_parse("-infinity", 0);
+       single_basic_parse("{ \"min\": Infinity, \"max\": -Infinity}", 0);
+
+       single_basic_parse("Infinity!", 0);
+       single_basic_parse("Infinitynull", 0);
+       single_basic_parse("InfinityXXXX", 0);
+       single_basic_parse("-Infinitynull", 0);
+       single_basic_parse("-InfinityXXXX", 0);
+       single_basic_parse("Infinoodle", 0);
+       single_basic_parse("InfinAAA", 0);
+       single_basic_parse("-Infinoodle", 0);
+       single_basic_parse("-InfinAAA", 0);
+
+       single_basic_parse("True", 0);
+       single_basic_parse("False", 0);
+
+       single_basic_parse("12", 0);
+       single_basic_parse("12.3", 0);
+       single_basic_parse("12.3.4", 0); /* non-sensical, returns null */
+       /* was returning (int)2015 before patch, should return null */
+       single_basic_parse("2015-01-15", 0);
+
+       /* ...but this works.  It's rather inconsistent, and a future major release
+        * should change the behavior so it either always returns null when extra
+        * bytes are present (preferred), or always return object created from as much
+        * as was able to be parsed.
+        */
+       single_basic_parse("12.3xxx", 0);
+
+       single_basic_parse("{\"FoO\"  :   -12.3E512}", 0);
+       single_basic_parse("{\"FoO\"  :   -12.3E51.2}", 0); /* non-sensical, returns null */
+       single_basic_parse("[\"\\n\"]", 0);
+       single_basic_parse("[\"\\nabc\\n\"]", 0);
+       single_basic_parse("[null]", 0);
+       single_basic_parse("[]", 0);
+       single_basic_parse("[false]", 0);
+       single_basic_parse("[\"abc\",null,\"def\",12]", 0);
+       single_basic_parse("{}", 0);
+       single_basic_parse("{ \"foo\": \"bar\" }", 0);
+       single_basic_parse("{ \"foo\": \"bar\", \"baz\": null, \"bool0\": true }", 0);
+       single_basic_parse("{ \"foo\": [null, \"foo\"] }", 0);
+       single_basic_parse("{ \"abc\": 12, \"foo\": \"bar\", \"bool0\": false, \"bool1\": true, \"arr\": [ 1, 2, 3, null, 5 ] }", 0);
+       single_basic_parse("{ \"abc\": \"blue\nred\\ngreen\" }", 0);
+
+       // Clear serializer for these tests so we see the actual parsed value.
+       single_basic_parse("[0e]", 1);
+       single_basic_parse("[0e+]", 1);
+       single_basic_parse("[0e+-1]", 1);
+       single_basic_parse("[18446744073709551616]", 1);
+}
 
-       new_obj = json_tokener_parse("{ \"foo\": [null, \"foo\"] }");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
+// Clear the re-serialization information that the tokener
+// saves to ensure that the output reflects the actual
+// values we parsed, rather than just the original input.
+static void do_clear_serializer(json_object *jso)
+{
+       json_c_visit(jso, 0, clear_serializer, NULL);
+}
 
-       new_obj = json_tokener_parse("{ \"abc\": 12, \"foo\": \"bar\", \"bool0\": false, \"bool1\": true, \"arr\": [ 1, 2, 3, null, 5 ] }");
-       printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-       json_object_put(new_obj);
+static int clear_serializer(json_object *jso, int flags,
+                     json_object *parent_jso,
+                     const char *jso_key,
+                     size_t *jso_index, void *userarg)
+{
+       if (jso)
+               json_object_set_serializer(jso, NULL, NULL, NULL);
+       return JSON_C_VISIT_RETURN_CONTINUE;
 }
 
 static void test_verbose_parse()
@@ -156,7 +145,7 @@ static void test_verbose_parse()
        /* b/c the string starts with 'f' parsing return a boolean error */
        assert (error == json_tokener_error_parse_boolean);
 
-       printf("json_tokener_parse_versbose() OK\n");
+       puts("json_tokener_parse_versbose() OK");
 }
 
 struct incremental_step {
@@ -193,7 +182,86 @@ struct incremental_step {
 
        /* To stop parsing a number we need to reach a non-digit, e.g. a \0 */
        { "1",                 1, 1, json_tokener_continue, 0 },
+       /* This should parse as the number 12, since it continues the "1" */
        { "2",                 2, 1, json_tokener_success, 0 },
+       { "12{",               3, 2, json_tokener_success, 1 },
+
+       /* Similar tests for other kinds of objects: */
+       /* These could all return success immediately, since regardless of
+          what follows the false/true/null token we *will* return a json object,
+       but it currently doesn't work that way.  hmm... */
+       { "false",             5, 5, json_tokener_continue, 1 },
+       { "false",             6, 5, json_tokener_success, 1 },
+       { "true",              4, 4, json_tokener_continue, 1 },
+       { "true",              5, 4, json_tokener_success, 1 },
+       { "null",              4, 4, json_tokener_continue, 1 },
+       { "null",              5, 4, json_tokener_success, 1 },
+
+       { "Infinity",          9, 8, json_tokener_success, 1 },
+       { "infinity",          9, 8, json_tokener_success, 1 },
+       { "-infinity",        10, 9, json_tokener_success, 1 },
+       { "infinity",          9, 0, json_tokener_error_parse_unexpected, 3 },
+       { "-infinity",        10, 1, json_tokener_error_parse_unexpected, 3 },
+
+       { "inf",               3, 3, json_tokener_continue, 0 },
+       { "inity",             6, 5, json_tokener_success, 1 },
+       { "-inf",              4, 4, json_tokener_continue, 0 },
+       { "inity",             6, 5, json_tokener_success, 1 },
+
+       { "i",                 1, 1, json_tokener_continue, 0 },
+       { "n",                 1, 1, json_tokener_continue, 0 },
+       { "f",                 1, 1, json_tokener_continue, 0 },
+       { "i",                 1, 1, json_tokener_continue, 0 },
+       { "n",                 1, 1, json_tokener_continue, 0 },
+       { "i",                 1, 1, json_tokener_continue, 0 },
+       { "t",                 1, 1, json_tokener_continue, 0 },
+       { "y",                 1, 1, json_tokener_continue, 0 },
+       { "",                  1, 0, json_tokener_success, 1 },
+
+       { "-",                 1, 1, json_tokener_continue, 0 },
+       { "inf",               3, 3, json_tokener_continue, 0 },
+       { "ini",               3, 3, json_tokener_continue, 0 },
+       { "ty",                3, 2, json_tokener_success, 1 },
+
+       { "-",                 1, 1, json_tokener_continue, 0 },
+       { "i",                 1, 1, json_tokener_continue, 0 },
+       { "nfini",             5, 5, json_tokener_continue, 0 },
+       { "ty",                3, 2, json_tokener_success, 1 },
+
+       { "-i",                2, 2, json_tokener_continue, 0 },
+       { "nfinity",           8, 7, json_tokener_success, 1 },
+
+       { "InfinityX",        10, 8, json_tokener_success, 0 },
+       { "X",                 1, 0, json_tokener_error_parse_unexpected, 1 },
+
+       { "Infinity1234",     13, 8, json_tokener_success, 0 },
+       { "1234",              5, 4, json_tokener_success, 1 },
+
+       { "Infinity9999",      8, 8, json_tokener_continue, 0 },
+       /* returns the Infinity loaded up by the previous call: */
+       { "1234",              5, 0, json_tokener_success, 0 },
+       { "1234",              5, 4, json_tokener_success, 1 },
+
+       /* offset=1 because "n" is the start of "null".  hmm... */
+       { "noodle",            7, 1, json_tokener_error_parse_null, 1 },
+       /* offset=2 because "na" is the start of "nan".  hmm... */
+       { "naodle",            7, 2, json_tokener_error_parse_null, 1 },
+       /* offset=2 because "tr" is the start of "true".  hmm... */
+       { "track",             6, 2, json_tokener_error_parse_boolean, 1 },
+
+       /* Although they may initially look like they should fail,
+          the next few tests check that parsing multiple sequential
+       json objects in the input works as expected */
+       { "null123",           9, 4, json_tokener_success, 0 },
+       { "null123" + 4,       4, 3, json_tokener_success, 1 },
+       { "nullx",             5, 4, json_tokener_success, 0 },
+       { "nullx" + 4,         2, 0, json_tokener_error_parse_unexpected, 1 },
+       { "{\"a\":1}{\"b\":2}",15, 7, json_tokener_success, 0 },
+       { "{\"a\":1}{\"b\":2}" + 7,
+                              8, 7, json_tokener_success, 1 },
+
+       /* Some bad formatting. Check we get the correct error status */
+       { "2015-01-15",       10, 4, json_tokener_error_parse_number, 1 },
 
        /* Strings have a well defined end point, so we can stop at the quote */
        { "\"blue\"",         -1, -1, json_tokener_success, 0 },
@@ -206,6 +274,9 @@ struct incremental_step {
        { "\"\\n\"",         -1, -1, json_tokener_success, 0 },
        { "\"\\r\"",         -1, -1, json_tokener_success, 0 },
        { "\"\\t\"",         -1, -1, json_tokener_success, 0 },
+       { "\"\\/\"",         -1, -1, json_tokener_success, 0 },
+       // Escaping a forward slash is optional
+       { "\"/\"",           -1, -1, json_tokener_success, 0 },
 
        { "[1,2,3]",          -1, -1, json_tokener_success, 0 },
 
@@ -225,7 +296,7 @@ static void test_incremental_parse()
 {
        json_object *new_obj;
        enum json_tokener_error jerr;
-       json_tokener *tok;
+       struct json_tokener *tok;
        const char *string_to_parse;
        int ii;
        int num_ok, num_error;
@@ -240,7 +311,7 @@ static void test_incremental_parse()
        string_to_parse = "{ \"foo"; /* } */
        printf("json_tokener_parse(%s) ... ", string_to_parse);
        new_obj = json_tokener_parse(string_to_parse);
-       if (new_obj == NULL) printf("got error as expected\n");
+       if (new_obj == NULL) puts("got error as expected");
 
        /* test incremental parsing in various forms */
        tok = json_tokener_new();
@@ -270,29 +341,32 @@ static void test_incremental_parse()
                {
                        if (new_obj != NULL)
                                printf("ERROR: invalid object returned: %s\n",
-                                       json_object_to_json_string(new_obj));
+                                      json_object_to_json_string(new_obj));
                        else if (jerr != step->expected_error)
                                printf("ERROR: got wrong error: %s\n",
-                                       json_tokener_error_desc(jerr));
+                                      json_tokener_error_desc(jerr));
                        else if (tok->char_offset != expected_char_offset)
                                printf("ERROR: wrong char_offset %d != expected %d\n",
-                                       tok->char_offset,
-                                       expected_char_offset);
+                                      tok->char_offset,
+                                      expected_char_offset);
                        else
                        {
-                               printf("OK: got correct error: %s\n", json_tokener_error_desc(jerr));
+                               printf("OK: got correct error: %s\n",
+                                      json_tokener_error_desc(jerr));
                                this_step_ok = 1;
                        }
                }
                else
                {
-                       if (new_obj == NULL)
+                       if (new_obj == NULL &&
+                           !(step->length >= 4 &&
+                             strncmp(step->string_to_parse, "null", 4) == 0))
                                printf("ERROR: expected valid object, instead: %s\n",
-                                       json_tokener_error_desc(jerr));
+                                      json_tokener_error_desc(jerr));
                        else if (tok->char_offset != expected_char_offset)
                                printf("ERROR: wrong char_offset %d != expected %d\n",
-                                       tok->char_offset,
-                                       expected_char_offset);
+                                      tok->char_offset,
+                                      expected_char_offset);
                        else
                        {
                                printf("OK: got object of type [%s]: %s\n",
@@ -317,6 +391,4 @@ static void test_incremental_parse()
        json_tokener_free(tok);
 
        printf("End Incremental Tests OK=%d ERROR=%d\n", num_ok, num_error);
-
-       return;
 }
index d49cbbb..ada6141 100644 (file)
@@ -1,30 +1,55 @@
-new_obj.to_string()="\u0003"
-new_obj.to_string()="foo"
-new_obj.to_string()="foo"
-new_obj.to_string()="ABC"
-new_obj.to_string()=null
-new_obj.to_string()=NaN
-new_obj.to_string()=null
-new_obj.to_string()=null
-new_obj.to_string()=null
-new_obj.to_string()=Infinity
-new_obj.to_string()=Infinity
-new_obj.to_string()=-Infinity
-new_obj.to_string()=-Infinity
-new_obj.to_string()=true
-new_obj.to_string()=12
-new_obj.to_string()=12.3
-new_obj.to_string()=[ "\n" ]
-new_obj.to_string()=[ "\nabc\n" ]
-new_obj.to_string()=[ null ]
-new_obj.to_string()=[ ]
-new_obj.to_string()=[ false ]
-new_obj.to_string()=[ "abc", null, "def", 12 ]
-new_obj.to_string()={ }
-new_obj.to_string()={ "foo": "bar" }
-new_obj.to_string()={ "foo": "bar", "baz": null, "bool0": true }
-new_obj.to_string()={ "foo": [ null, "foo" ] }
-new_obj.to_string()={ "abc": 12, "foo": "bar", "bool0": false, "bool1": true, "arr": [ 1, 2, 3, null, 5 ] }
+new_obj.to_string("\ 3")="\u0003"
+new_obj.to_string(/* hello */"foo")="foo"
+new_obj.to_string(// hello
+"foo")="foo"
+new_obj.to_string("foo"blue)="foo"
+new_obj.to_string("\u0041\u0042\u0043")="ABC"
+new_obj.to_string([9,'\uDAD)=null
+new_obj.to_string(null)=null
+new_obj.to_string(NaN)=NaN
+new_obj.to_string(-NaN)=null
+new_obj.to_string(Inf)=null
+new_obj.to_string(inf)=null
+new_obj.to_string(Infinity)=Infinity
+new_obj.to_string(infinity)=Infinity
+new_obj.to_string(-Infinity)=-Infinity
+new_obj.to_string(-infinity)=-Infinity
+new_obj.to_string({ "min": Infinity, "max": -Infinity})={ "min": Infinity, "max": -Infinity }
+new_obj.to_string(Infinity!)=Infinity
+new_obj.to_string(Infinitynull)=Infinity
+new_obj.to_string(InfinityXXXX)=Infinity
+new_obj.to_string(-Infinitynull)=-Infinity
+new_obj.to_string(-InfinityXXXX)=-Infinity
+new_obj.to_string(Infinoodle)=null
+new_obj.to_string(InfinAAA)=null
+new_obj.to_string(-Infinoodle)=null
+new_obj.to_string(-InfinAAA)=null
+new_obj.to_string(True)=true
+new_obj.to_string(False)=false
+new_obj.to_string(12)=12
+new_obj.to_string(12.3)=12.3
+new_obj.to_string(12.3.4)=null
+new_obj.to_string(2015-01-15)=null
+new_obj.to_string(12.3xxx)=12.3
+new_obj.to_string({"FoO"  :   -12.3E512})={ "FoO": -12.3E512 }
+new_obj.to_string({"FoO"  :   -12.3E51.2})=null
+new_obj.to_string(["\n"])=[ "\n" ]
+new_obj.to_string(["\nabc\n"])=[ "\nabc\n" ]
+new_obj.to_string([null])=[ null ]
+new_obj.to_string([])=[ ]
+new_obj.to_string([false])=[ false ]
+new_obj.to_string(["abc",null,"def",12])=[ "abc", null, "def", 12 ]
+new_obj.to_string({})={ }
+new_obj.to_string({ "foo": "bar" })={ "foo": "bar" }
+new_obj.to_string({ "foo": "bar", "baz": null, "bool0": true })={ "foo": "bar", "baz": null, "bool0": true }
+new_obj.to_string({ "foo": [null, "foo"] })={ "foo": [ null, "foo" ] }
+new_obj.to_string({ "abc": 12, "foo": "bar", "bool0": false, "bool1": true, "arr": [ 1, 2, 3, null, 5 ] })={ "abc": 12, "foo": "bar", "bool0": false, "bool1": true, "arr": [ 1, 2, 3, null, 5 ] }
+new_obj.to_string({ "abc": "blue
+red\ngreen" })={ "abc": "blue\nred\ngreen" }
+new_obj.to_string([0e])=[ 0.0 ]
+new_obj.to_string([0e+])=[ 0.0 ]
+new_obj.to_string([0e+-1])=null
+new_obj.to_string([18446744073709551616])=[ 9223372036854775807 ]
 ==================================
 json_tokener_parse_versbose() OK
 ==================================
@@ -48,6 +73,58 @@ json_tokener_parse_ex(tok, {"x": 123 }"X",  14) ... OK: got object of type [obje
 json_tokener_parse_ex(tok, "Y"         ,   3) ... OK: got object of type [string]: "Y"
 json_tokener_parse_ex(tok, 1           ,   1) ... OK: got correct error: continue
 json_tokener_parse_ex(tok, 2           ,   2) ... OK: got object of type [int]: 12
+json_tokener_parse_ex(tok, 12{         ,   3) ... OK: got object of type [int]: 12
+json_tokener_parse_ex(tok, false       ,   5) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, false       ,   6) ... OK: got object of type [boolean]: false
+json_tokener_parse_ex(tok, true        ,   4) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, true        ,   5) ... OK: got object of type [boolean]: true
+json_tokener_parse_ex(tok, null        ,   4) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, null        ,   5) ... OK: got object of type [null]: null
+json_tokener_parse_ex(tok, Infinity    ,   9) ... OK: got object of type [double]: Infinity
+json_tokener_parse_ex(tok, infinity    ,   9) ... OK: got object of type [double]: Infinity
+json_tokener_parse_ex(tok, -infinity   ,  10) ... OK: got object of type [double]: -Infinity
+json_tokener_parse_ex(tok, infinity    ,   9) ... OK: got correct error: unexpected character
+json_tokener_parse_ex(tok, -infinity   ,  10) ... OK: got correct error: unexpected character
+json_tokener_parse_ex(tok, inf         ,   3) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, inity       ,   6) ... OK: got object of type [double]: Infinity
+json_tokener_parse_ex(tok, -inf        ,   4) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, inity       ,   6) ... OK: got object of type [double]: -Infinity
+json_tokener_parse_ex(tok, i           ,   1) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, n           ,   1) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, f           ,   1) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, i           ,   1) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, n           ,   1) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, i           ,   1) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, t           ,   1) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, y           ,   1) ... OK: got correct error: continue
+json_tokener_parse_ex(tok,             ,   1) ... OK: got object of type [double]: Infinity
+json_tokener_parse_ex(tok, -           ,   1) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, inf         ,   3) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, ini         ,   3) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, ty          ,   3) ... OK: got object of type [double]: -Infinity
+json_tokener_parse_ex(tok, -           ,   1) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, i           ,   1) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, nfini       ,   5) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, ty          ,   3) ... OK: got object of type [double]: -Infinity
+json_tokener_parse_ex(tok, -i          ,   2) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, nfinity     ,   8) ... OK: got object of type [double]: -Infinity
+json_tokener_parse_ex(tok, InfinityX   ,  10) ... OK: got object of type [double]: Infinity
+json_tokener_parse_ex(tok, X           ,   1) ... OK: got correct error: unexpected character
+json_tokener_parse_ex(tok, Infinity1234,  13) ... OK: got object of type [double]: Infinity
+json_tokener_parse_ex(tok, 1234        ,   5) ... OK: got object of type [int]: 1234
+json_tokener_parse_ex(tok, Infinity9999,   8) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, 1234        ,   5) ... OK: got object of type [double]: Infinity
+json_tokener_parse_ex(tok, 1234        ,   5) ... OK: got object of type [int]: 1234
+json_tokener_parse_ex(tok, noodle      ,   7) ... OK: got correct error: null expected
+json_tokener_parse_ex(tok, naodle      ,   7) ... OK: got correct error: null expected
+json_tokener_parse_ex(tok, track       ,   6) ... OK: got correct error: boolean expected
+json_tokener_parse_ex(tok, null123     ,   9) ... OK: got object of type [null]: null
+json_tokener_parse_ex(tok, 123         ,   4) ... OK: got object of type [int]: 123
+json_tokener_parse_ex(tok, nullx       ,   5) ... OK: got object of type [null]: null
+json_tokener_parse_ex(tok, x           ,   2) ... OK: got correct error: unexpected character
+json_tokener_parse_ex(tok, {"a":1}{"b":2},  15) ... OK: got object of type [object]: { "a": 1 }
+json_tokener_parse_ex(tok, {"b":2}     ,   8) ... OK: got object of type [object]: { "b": 2 }
+json_tokener_parse_ex(tok, 2015-01-15  ,  10) ... OK: got correct error: number expected
 json_tokener_parse_ex(tok, "blue"      ,   6) ... OK: got object of type [string]: "blue"
 json_tokener_parse_ex(tok, "\""        ,   4) ... OK: got object of type [string]: "\""
 json_tokener_parse_ex(tok, "\\"        ,   4) ... OK: got object of type [string]: "\\"
@@ -56,10 +133,12 @@ json_tokener_parse_ex(tok, "\f"        ,   4) ... OK: got object of type [string
 json_tokener_parse_ex(tok, "\n"        ,   4) ... OK: got object of type [string]: "\n"
 json_tokener_parse_ex(tok, "\r"        ,   4) ... OK: got object of type [string]: "\r"
 json_tokener_parse_ex(tok, "\t"        ,   4) ... OK: got object of type [string]: "\t"
+json_tokener_parse_ex(tok, "\/"        ,   4) ... OK: got object of type [string]: "\/"
+json_tokener_parse_ex(tok, "/"         ,   3) ... OK: got object of type [string]: "\/"
 json_tokener_parse_ex(tok, [1,2,3]     ,   7) ... OK: got object of type [array]: [ 1, 2, 3 ]
 json_tokener_parse_ex(tok, [1,2,3,]    ,   8) ... OK: got object of type [array]: [ 1, 2, 3 ]
 json_tokener_parse_ex(tok, [1,2,,3,]   ,   9) ... OK: got correct error: unexpected character
 json_tokener_parse_ex(tok, [1,2,3,]    ,   8) ... OK: got correct error: unexpected character
 json_tokener_parse_ex(tok, {"a":1,}    ,   8) ... OK: got correct error: unexpected character
-End Incremental Tests OK=29 ERROR=0
+End Incremental Tests OK=83 ERROR=0
 ==================================
deleted file mode 100755 (executable)
index 70d1c82e4ab1b27335a28fef34a205771da7e794..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Common definitions
-if test -z "$srcdir"; then
-    srcdir="${0%/*}"
-    test "$srcdir" = "$0" && srcdir=.
-    test -z "$srcdir" && srcdir=.
-fi
-. "$srcdir/test-defs.sh"
-
-run_output_test test_parse
-exit $?
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..58a13f4f327a79766a57c37dc53c4dbbcec6927e
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
deleted file mode 100755 (executable)
index 2b7fbfb6f5957f5d540b34a39217090670ee822c..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Common definitions
-if test -z "$srcdir"; then
-    srcdir="${0%/*}"
-    test "$srcdir" = "$0" && srcdir=.
-    test -z "$srcdir" && srcdir=.
-fi
-. "$srcdir/test-defs.sh"
-
-run_output_test test_parse_int64
-exit $?
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..58a13f4f327a79766a57c37dc53c4dbbcec6927e
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
index c8b8ad0..0dd2dc9 100644 (file)
@@ -106,8 +106,15 @@ static void test_printbuf_memappend(int *before_resize)
        printf("Append to just after resize: %d, [%s]\n", printbuf_length(pb), pb->buf);
 
        free(data);
+       printbuf_free(pb);
 
+#define SA_TEST_STR "XXXXXXXXXXXXXXXX"
+       pb = printbuf_new();
+       printbuf_strappend(pb, SA_TEST_STR);
+       printf("Buffer size after printbuf_strappend(): %d, [%s]\n", printbuf_length(pb), pb->buf);
        printbuf_free(pb);
+#undef  SA_TEST_STR
+
        printf("%s: end test\n", __func__);
 }
 
index 142db0b..6464412 100644 (file)
@@ -18,6 +18,7 @@ Partial append: 3, [blu]
 With embedded \0 character: 4, [ab]
 Append to just before resize: 31, [XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
 Append to just after resize: 32, [XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
+Buffer size after printbuf_strappend(): 16, [XXXXXXXXXXXXXXXX]
 test_printbuf_memappend: end test
 ========================================
 test_sprintbuf: starting test
deleted file mode 100755 (executable)
index 09d27c23af7da8320ed0bfda8196e42d7471f28d..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Common definitions
-if test -z "$srcdir"; then
-    srcdir="${0%/*}"
-    test "$srcdir" = "$0" && srcdir=.
-    test -z "$srcdir" && srcdir=.
-fi
-. "$srcdir/test-defs.sh"
-
-run_output_test test_printbuf
-exit $?
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..58a13f4f327a79766a57c37dc53c4dbbcec6927e
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
deleted file mode 100755 (executable)
index 728dfedf16a985727971abd4916e97745613a89e..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Common definitions
-if test -z "$srcdir"; then
-    srcdir="${0%/*}"
-    test "$srcdir" = "$0" && srcdir=.
-    test -z "$srcdir" && srcdir=.
-fi
-. "$srcdir/test-defs.sh"
-
-run_output_test test_set_serializer
-exit $?
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..58a13f4f327a79766a57c37dc53c4dbbcec6927e
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
diff --git a/tests/test_set_value.c b/tests/test_set_value.c
new file mode 100644 (file)
index 0000000..4c0a54a
--- /dev/null
@@ -0,0 +1,52 @@
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "json.h"
+
+int main(int argc, char **argv)
+{
+       json_object *tmp=json_object_new_int(123);
+       assert (json_object_get_int(tmp)==123);
+       json_object_set_int(tmp,321);
+       assert (json_object_get_int(tmp)==321); 
+       printf("INT PASSED\n");
+       json_object_set_int64(tmp,(int64_t)321321321);
+       assert (json_object_get_int64(tmp)==321321321); 
+       json_object_put(tmp);
+       printf("INT64 PASSED\n");
+       tmp=json_object_new_boolean(TRUE);
+       assert (json_object_get_boolean(tmp)==TRUE); 
+       json_object_set_boolean(tmp,FALSE);
+       assert (json_object_get_boolean(tmp)==FALSE); 
+       json_object_set_boolean(tmp,TRUE);
+       assert (json_object_get_boolean(tmp)==TRUE); 
+       json_object_put(tmp);
+       printf("BOOL PASSED\n");
+       tmp=json_object_new_double(12.34);
+       assert (json_object_get_double(tmp)==12.34); 
+       json_object_set_double(tmp,34.56);
+       assert (json_object_get_double(tmp)==34.56); 
+       json_object_set_double(tmp,6435.34);
+       assert (json_object_get_double(tmp)==6435.34); 
+       json_object_put(tmp);
+       printf("DOUBLE PASSED\n");
+       #define SHORT "SHORT"
+       #define MID   "A MID STRING"
+       //             12345678901234567890123456789012....
+       #define HUGE  "A string longer than 32 chars as to check non local buf codepath"
+       tmp=json_object_new_string(SHORT);
+       assert (strcmp(json_object_get_string(tmp),SHORT)==0); 
+       json_object_set_string(tmp,MID);
+       assert (strcmp(json_object_get_string(tmp),MID)==0); 
+       json_object_set_string(tmp,HUGE);
+       assert (strcmp(json_object_get_string(tmp),HUGE)==0); 
+       json_object_set_string(tmp,SHORT);
+       assert (strcmp(json_object_get_string(tmp),SHORT)==0); 
+       json_object_put(tmp);
+       printf("STRING PASSED\n");
+       
+       
+       printf("PASSED\n");
+       return 0;
+}
diff --git a/tests/test_set_value.expected b/tests/test_set_value.expected
new file mode 100644 (file)
index 0000000..6a900f9
--- /dev/null
@@ -0,0 +1,6 @@
+INT PASSED
+INT64 PASSED
+BOOL PASSED
+DOUBLE PASSED
+STRING PASSED
+PASSED
diff --git a/tests/test_set_value.test b/tests/test_set_value.test
new file mode 120000 (symlink)
index 0000000..58a13f4
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
diff --git a/tests/test_util_file.c b/tests/test_util_file.c
new file mode 100644 (file)
index 0000000..5a8a8a0
--- /dev/null
@@ -0,0 +1,214 @@
+#include "strerror_override.h"
+#include "strerror_override_private.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "json.h"
+#include "json_util.h"
+
+static void test_read_valid_with_fd(const char *testdir);
+static void test_read_nonexistant();
+static void test_read_closed(void);
+
+static void test_write_to_file();
+static void stat_and_cat(const char *file);
+
+static void test_write_to_file()
+{
+       json_object *jso;
+
+       jso = json_tokener_parse("{"
+               "\"foo\":1234,"
+               "\"foo1\":\"abcdefghijklmnopqrstuvwxyz\","
+               "\"foo2\":\"abcdefghijklmnopqrstuvwxyz\","
+               "\"foo3\":\"abcdefghijklmnopqrstuvwxyz\","
+               "\"foo4\":\"abcdefghijklmnopqrstuvwxyz\","
+               "\"foo5\":\"abcdefghijklmnopqrstuvwxyz\","
+               "\"foo6\":\"abcdefghijklmnopqrstuvwxyz\","
+               "\"foo7\":\"abcdefghijklmnopqrstuvwxyz\","
+               "\"foo8\":\"abcdefghijklmnopqrstuvwxyz\","
+               "\"foo9\":\"abcdefghijklmnopqrstuvwxyz\""
+               "}");
+       const char *outfile = "json.out";
+       int rv = json_object_to_file(outfile, jso);
+       printf("%s: json_object_to_file(%s, jso)=%d\n",
+               (rv == 0) ? "OK" : "FAIL", outfile, rv);
+       if (rv == 0)
+               stat_and_cat(outfile);
+
+       putchar('\n');
+
+       const char *outfile2 = "json2.out";
+       rv = json_object_to_file_ext(outfile2, jso, JSON_C_TO_STRING_PRETTY);
+       printf("%s: json_object_to_file_ext(%s, jso, JSON_C_TO_STRING_PRETTY)=%d\n",
+              (rv == 0) ? "OK" : "FAIL", outfile2, rv);
+       if (rv == 0)
+               stat_and_cat(outfile2);
+
+       const char *outfile3 = "json3.out";
+       int d = open(outfile3, O_WRONLY|O_CREAT, 0600);
+       if (d < 0)
+       {
+               printf("FAIL: unable to open %s %s\n", outfile3, strerror(errno));
+               return;
+       }
+       rv = json_object_to_fd(d, jso, JSON_C_TO_STRING_PRETTY);
+       printf("%s: json_object_to_fd(%s, jso, JSON_C_TO_STRING_PRETTY)=%d\n",
+              (rv == 0) ? "OK" : "FAIL", outfile3, rv);
+       // Write the same object twice
+       rv = json_object_to_fd(d, jso, JSON_C_TO_STRING_PLAIN);
+       printf("%s: json_object_to_fd(%s, jso, JSON_C_TO_STRING_PLAIN)=%d\n",
+              (rv == 0) ? "OK" : "FAIL", outfile3, rv);
+       close(d);
+       if (rv == 0)
+               stat_and_cat(outfile3);
+
+       json_object_put(jso);
+}
+
+static void stat_and_cat(const char *file)
+{
+       struct stat sb;
+       int d = open(file, O_RDONLY, 0600);
+       if (d < 0)
+       {
+               printf("FAIL: unable to open %s: %s\n",
+                      file, strerror(errno));
+               return;
+       }
+       if (fstat(d, &sb) < 0)
+       {
+               printf("FAIL: unable to stat %s: %s\n",
+                      file, strerror(errno));
+               close(d);
+               return;
+       }
+       char *buf = malloc(sb.st_size + 1);
+       if(!buf)
+       {
+               printf("FAIL: unable to allocate memory\n");
+               close(d);
+               return;
+       }
+       if (read(d, buf, sb.st_size) < sb.st_size)
+       {
+               printf("FAIL: unable to read all of %s: %s\n",
+                      file, strerror(errno));
+               free(buf);
+               close(d);
+               return;
+       }
+       buf[sb.st_size] = '\0';
+       printf("file[%s], size=%d, contents=%s\n", file, (int)sb.st_size, buf);
+       free(buf);
+       close(d);
+}
+
+int main(int argc, char **argv)
+{
+//     json_object_to_file(file, obj);
+//     json_object_to_file_ext(file, obj, flags);
+
+       _json_c_strerror_enable = 1;
+
+       const char *testdir;
+       if (argc < 2)
+       {
+               fprintf(stderr,
+                       "Usage: %s <testdir>\n"
+                       "  <testdir> is the location of input files\n",
+                       argv[0]);
+               return EXIT_FAILURE;
+       }
+       testdir = argv[1];
+
+       test_read_valid_with_fd(testdir);
+       test_read_nonexistant();
+       test_read_closed();
+       test_write_to_file();
+       return EXIT_SUCCESS;
+}
+
+static void test_read_valid_with_fd(const char *testdir)
+{
+       const char *filename = "./valid.json";
+
+       int d = open(filename, O_RDONLY, 0);
+       if (d < 0)
+       {
+               fprintf(stderr,
+                       "FAIL: unable to open %s: %s\n",
+                       filename, strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       json_object *jso = json_object_from_fd(d);
+       if (jso != NULL)
+       {
+               printf("OK: json_object_from_fd(%s)=%s\n",
+                      filename, json_object_to_json_string(jso));
+               json_object_put(jso);
+       }
+       else
+       {
+               fprintf(stderr,
+                       "FAIL: unable to parse contents of %s: %s\n",
+                       filename, json_util_get_last_err());
+       }
+       close(d);
+}
+
+static void test_read_nonexistant()
+{
+       const char *filename = "./not_present.json";
+
+       json_object *jso = json_object_from_file(filename);
+       if (jso != NULL)
+       {
+               printf("FAIL: json_object_from_file(%s) returned %p when NULL expected\n",
+                      filename, (void *)jso);
+               json_object_put(jso);
+       }
+       else
+       {
+               printf("OK: json_object_from_file(%s) correctly returned NULL: %s\n",
+                      filename, json_util_get_last_err());
+       }
+}
+
+static void test_read_closed()
+{
+       // Test reading from a closed fd
+       int d = open("/dev/null", O_RDONLY, 0);
+       if(d < 0)
+       {
+               puts("FAIL: unable to open");
+       }
+       // Copy over to a fixed fd number so test output is consistent.
+       int fixed_d = 10;
+       if (dup2(d, fixed_d) < 0)
+       {
+               printf("FAIL: unable to dup to fd %d", fixed_d);
+       }
+       close(d);
+       close(fixed_d);
+
+       json_object *jso = json_object_from_fd(fixed_d);
+       if (jso != NULL)
+       {
+               printf("FAIL: read from closed fd returning non-NULL: %p\n",
+                      (void *)jso);
+               fflush(stdout);
+               printf("  jso=%s\n", json_object_to_json_string(jso));
+               json_object_put(jso);
+               return;
+       }
+       printf("OK: json_object_from_fd(closed_fd), "
+              "expecting NULL, EBADF, got:NULL, %s\n",
+              json_util_get_last_err());
+}
diff --git a/tests/test_util_file.expected b/tests/test_util_file.expected
new file mode 100644 (file)
index 0000000..f64a5a5
--- /dev/null
@@ -0,0 +1,35 @@
+OK: json_object_from_fd(./valid.json)={ "foo": 123 }
+OK: json_object_from_file(./not_present.json) correctly returned NULL: json_object_from_file: error opening file ./not_present.json: ERRNO=ENOENT
+
+OK: json_object_from_fd(closed_fd), expecting NULL, EBADF, got:NULL, json_object_from_fd: error reading fd 10: ERRNO=EBADF
+
+OK: json_object_to_file(json.out, jso)=0
+file[json.out], size=336, contents={"foo":1234,"foo1":"abcdefghijklmnopqrstuvwxyz","foo2":"abcdefghijklmnopqrstuvwxyz","foo3":"abcdefghijklmnopqrstuvwxyz","foo4":"abcdefghijklmnopqrstuvwxyz","foo5":"abcdefghijklmnopqrstuvwxyz","foo6":"abcdefghijklmnopqrstuvwxyz","foo7":"abcdefghijklmnopqrstuvwxyz","foo8":"abcdefghijklmnopqrstuvwxyz","foo9":"abcdefghijklmnopqrstuvwxyz"}
+
+OK: json_object_to_file_ext(json2.out, jso, JSON_C_TO_STRING_PRETTY)=0
+file[json2.out], size=367, contents={
+  "foo":1234,
+  "foo1":"abcdefghijklmnopqrstuvwxyz",
+  "foo2":"abcdefghijklmnopqrstuvwxyz",
+  "foo3":"abcdefghijklmnopqrstuvwxyz",
+  "foo4":"abcdefghijklmnopqrstuvwxyz",
+  "foo5":"abcdefghijklmnopqrstuvwxyz",
+  "foo6":"abcdefghijklmnopqrstuvwxyz",
+  "foo7":"abcdefghijklmnopqrstuvwxyz",
+  "foo8":"abcdefghijklmnopqrstuvwxyz",
+  "foo9":"abcdefghijklmnopqrstuvwxyz"
+}
+OK: json_object_to_fd(json3.out, jso, JSON_C_TO_STRING_PRETTY)=0
+OK: json_object_to_fd(json3.out, jso, JSON_C_TO_STRING_PLAIN)=0
+file[json3.out], size=703, contents={
+  "foo":1234,
+  "foo1":"abcdefghijklmnopqrstuvwxyz",
+  "foo2":"abcdefghijklmnopqrstuvwxyz",
+  "foo3":"abcdefghijklmnopqrstuvwxyz",
+  "foo4":"abcdefghijklmnopqrstuvwxyz",
+  "foo5":"abcdefghijklmnopqrstuvwxyz",
+  "foo6":"abcdefghijklmnopqrstuvwxyz",
+  "foo7":"abcdefghijklmnopqrstuvwxyz",
+  "foo8":"abcdefghijklmnopqrstuvwxyz",
+  "foo9":"abcdefghijklmnopqrstuvwxyz"
+}{"foo":1234,"foo1":"abcdefghijklmnopqrstuvwxyz","foo2":"abcdefghijklmnopqrstuvwxyz","foo3":"abcdefghijklmnopqrstuvwxyz","foo4":"abcdefghijklmnopqrstuvwxyz","foo5":"abcdefghijklmnopqrstuvwxyz","foo6":"abcdefghijklmnopqrstuvwxyz","foo7":"abcdefghijklmnopqrstuvwxyz","foo8":"abcdefghijklmnopqrstuvwxyz","foo9":"abcdefghijklmnopqrstuvwxyz"}
diff --git a/tests/test_util_file.test b/tests/test_util_file.test
new file mode 120000 (symlink)
index 0000000..58a13f4
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
diff --git a/tests/test_visit.c b/tests/test_visit.c
new file mode 100644 (file)
index 0000000..f2ffe8c
--- /dev/null
@@ -0,0 +1,111 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <assert.h>
+
+#include "json.h"
+#include "json_tokener.h"
+#include "json_visit.h"
+
+static json_c_visit_userfunc emit_object;
+static json_c_visit_userfunc skip_arrays;
+static json_c_visit_userfunc pop_and_stop;
+static json_c_visit_userfunc err_on_subobj2;
+
+int main(void)
+{
+       MC_SET_DEBUG(1);
+
+       const char *input = "{\
+               \"obj1\": 123,\
+               \"obj2\": {\
+                       \"subobj1\": \"aaa\",\
+                       \"subobj2\": \"bbb\",\
+                       \"subobj3\": [ \"elem1\", \"elem2\", true ],\
+               },\
+               \"obj3\": 1.234,\
+               \"obj4\": [ true, false, null ]\
+       }";
+
+       json_object *jso = json_tokener_parse(input);
+       printf("jso.to_string()=%s\n", json_object_to_json_string(jso));
+
+       int rv;
+       rv = json_c_visit(jso, 0, emit_object, NULL);
+       printf("json_c_visit(emit_object)=%d\n", rv);
+       printf("================================\n\n");
+
+       rv = json_c_visit(jso, 0, skip_arrays, NULL);
+       printf("json_c_visit(skip_arrays)=%d\n", rv);
+       printf("================================\n\n");
+
+       rv = json_c_visit(jso, 0, pop_and_stop, NULL);
+       printf("json_c_visit(pop_and_stop)=%d\n", rv);
+       printf("================================\n\n");
+
+       rv = json_c_visit(jso, 0, err_on_subobj2, NULL);
+       printf("json_c_visit(err_on_subobj2)=%d\n", rv);
+       printf("================================\n\n");
+
+       json_object_put(jso);
+}
+
+
+static int emit_object(json_object *jso, int flags,
+                     json_object *parent_jso,
+                     const char *jso_key,
+                     size_t *jso_index, void *userarg)
+{
+       printf("flags: 0x%x, key: %s, index: %ld, value: %s\n",
+              flags,
+              (jso_key ? jso_key : "(null)"),
+              (jso_index ? (long)*jso_index : -1L),
+              json_object_to_json_string(jso));
+       return JSON_C_VISIT_RETURN_CONTINUE;
+}
+
+static int skip_arrays(json_object *jso, int flags,
+                     json_object *parent_jso,
+                     const char *jso_key,
+                     size_t *jso_index, void *userarg)
+{
+       (void)emit_object(jso, flags, parent_jso, jso_key, jso_index, userarg);
+       if (json_object_get_type(jso) == json_type_array)
+               return JSON_C_VISIT_RETURN_SKIP;
+       return JSON_C_VISIT_RETURN_CONTINUE;
+}
+
+static int pop_and_stop(json_object *jso, int flags,
+                     json_object *parent_jso,
+                     const char *jso_key,
+                     size_t *jso_index, void *userarg)
+{
+       (void)emit_object(jso, flags, parent_jso, jso_key, jso_index, userarg);
+       if (jso_key != NULL && strcmp(jso_key, "subobj1") == 0)
+       {
+               printf("POP after handling subobj1\n");
+               return JSON_C_VISIT_RETURN_POP;
+       }
+       if (jso_key != NULL && strcmp(jso_key, "obj3") == 0)
+       {
+               printf("STOP after handling obj3\n");
+               return JSON_C_VISIT_RETURN_STOP;
+       }
+       return JSON_C_VISIT_RETURN_CONTINUE;
+}
+
+static int err_on_subobj2(json_object *jso, int flags,
+                     json_object *parent_jso,
+                     const char *jso_key,
+                     size_t *jso_index, void *userarg)
+{
+       (void)emit_object(jso, flags, parent_jso, jso_key, jso_index, userarg);
+       if (jso_key != NULL && strcmp(jso_key, "subobj2") == 0)
+       {
+               printf("ERROR after handling subobj1\n");
+               return JSON_C_VISIT_RETURN_ERROR;
+       }
+       return JSON_C_VISIT_RETURN_CONTINUE;
+}
+
diff --git a/tests/test_visit.expected b/tests/test_visit.expected
new file mode 100644 (file)
index 0000000..2f05622
--- /dev/null
@@ -0,0 +1,55 @@
+jso.to_string()={ "obj1": 123, "obj2": { "subobj1": "aaa", "subobj2": "bbb", "subobj3": [ "elem1", "elem2", true ] }, "obj3": 1.234, "obj4": [ true, false, null ] }
+flags: 0x0, key: (null), index: -1, value: { "obj1": 123, "obj2": { "subobj1": "aaa", "subobj2": "bbb", "subobj3": [ "elem1", "elem2", true ] }, "obj3": 1.234, "obj4": [ true, false, null ] }
+flags: 0x0, key: obj1, index: -1, value: 123
+flags: 0x0, key: obj2, index: -1, value: { "subobj1": "aaa", "subobj2": "bbb", "subobj3": [ "elem1", "elem2", true ] }
+flags: 0x0, key: subobj1, index: -1, value: "aaa"
+flags: 0x0, key: subobj2, index: -1, value: "bbb"
+flags: 0x0, key: subobj3, index: -1, value: [ "elem1", "elem2", true ]
+flags: 0x0, key: (null), index: 0, value: "elem1"
+flags: 0x0, key: (null), index: 1, value: "elem2"
+flags: 0x0, key: (null), index: 2, value: true
+flags: 0x2, key: subobj3, index: -1, value: [ "elem1", "elem2", true ]
+flags: 0x2, key: obj2, index: -1, value: { "subobj1": "aaa", "subobj2": "bbb", "subobj3": [ "elem1", "elem2", true ] }
+flags: 0x0, key: obj3, index: -1, value: 1.234
+flags: 0x0, key: obj4, index: -1, value: [ true, false, null ]
+flags: 0x0, key: (null), index: 0, value: true
+flags: 0x0, key: (null), index: 1, value: false
+flags: 0x0, key: (null), index: 2, value: null
+flags: 0x2, key: obj4, index: -1, value: [ true, false, null ]
+flags: 0x2, key: (null), index: -1, value: { "obj1": 123, "obj2": { "subobj1": "aaa", "subobj2": "bbb", "subobj3": [ "elem1", "elem2", true ] }, "obj3": 1.234, "obj4": [ true, false, null ] }
+json_c_visit(emit_object)=0
+================================
+
+flags: 0x0, key: (null), index: -1, value: { "obj1": 123, "obj2": { "subobj1": "aaa", "subobj2": "bbb", "subobj3": [ "elem1", "elem2", true ] }, "obj3": 1.234, "obj4": [ true, false, null ] }
+flags: 0x0, key: obj1, index: -1, value: 123
+flags: 0x0, key: obj2, index: -1, value: { "subobj1": "aaa", "subobj2": "bbb", "subobj3": [ "elem1", "elem2", true ] }
+flags: 0x0, key: subobj1, index: -1, value: "aaa"
+flags: 0x0, key: subobj2, index: -1, value: "bbb"
+flags: 0x0, key: subobj3, index: -1, value: [ "elem1", "elem2", true ]
+flags: 0x2, key: obj2, index: -1, value: { "subobj1": "aaa", "subobj2": "bbb", "subobj3": [ "elem1", "elem2", true ] }
+flags: 0x0, key: obj3, index: -1, value: 1.234
+flags: 0x0, key: obj4, index: -1, value: [ true, false, null ]
+flags: 0x2, key: (null), index: -1, value: { "obj1": 123, "obj2": { "subobj1": "aaa", "subobj2": "bbb", "subobj3": [ "elem1", "elem2", true ] }, "obj3": 1.234, "obj4": [ true, false, null ] }
+json_c_visit(skip_arrays)=0
+================================
+
+flags: 0x0, key: (null), index: -1, value: { "obj1": 123, "obj2": { "subobj1": "aaa", "subobj2": "bbb", "subobj3": [ "elem1", "elem2", true ] }, "obj3": 1.234, "obj4": [ true, false, null ] }
+flags: 0x0, key: obj1, index: -1, value: 123
+flags: 0x0, key: obj2, index: -1, value: { "subobj1": "aaa", "subobj2": "bbb", "subobj3": [ "elem1", "elem2", true ] }
+flags: 0x0, key: subobj1, index: -1, value: "aaa"
+POP after handling subobj1
+flags: 0x2, key: obj2, index: -1, value: { "subobj1": "aaa", "subobj2": "bbb", "subobj3": [ "elem1", "elem2", true ] }
+flags: 0x0, key: obj3, index: -1, value: 1.234
+STOP after handling obj3
+json_c_visit(pop_and_stop)=0
+================================
+
+flags: 0x0, key: (null), index: -1, value: { "obj1": 123, "obj2": { "subobj1": "aaa", "subobj2": "bbb", "subobj3": [ "elem1", "elem2", true ] }, "obj3": 1.234, "obj4": [ true, false, null ] }
+flags: 0x0, key: obj1, index: -1, value: 123
+flags: 0x0, key: obj2, index: -1, value: { "subobj1": "aaa", "subobj2": "bbb", "subobj3": [ "elem1", "elem2", true ] }
+flags: 0x0, key: subobj1, index: -1, value: "aaa"
+flags: 0x0, key: subobj2, index: -1, value: "bbb"
+ERROR after handling subobj1
+json_c_visit(err_on_subobj2)=-1
+================================
+
diff --git a/tests/test_visit.test b/tests/test_visit.test
new file mode 120000 (symlink)
index 0000000..58a13f4
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file
diff --git a/tests/valid.json b/tests/valid.json
new file mode 100644 (file)
index 0000000..bde58e7
--- /dev/null
@@ -0,0 +1 @@
+{"foo":123}
diff --git a/vasprintf_compat.h b/vasprintf_compat.h
new file mode 100644 (file)
index 0000000..43dbf89
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef __vasprintf_compat_h
+#define __vasprintf_compat_h
+
+/**
+ * @file
+ * @brief Do not use, json-c internal, may be changed or removed at any time.
+ */
+
+#include "snprintf_compat.h"
+
+#if !defined(HAVE_VASPRINTF)
+/* CAW: compliant version of vasprintf */
+static int vasprintf(char **buf, const char *fmt, va_list ap)
+{
+#ifndef WIN32
+       static char _T_emptybuffer = '\0';
+#endif /* !defined(WIN32) */
+       int chars;
+       char *b;
+
+       if(!buf) { return -1; }
+
+#ifdef WIN32
+       chars = _vscprintf(fmt, ap)+1;
+#else /* !defined(WIN32) */
+       /* CAW: RAWR! We have to hope to god here that vsnprintf doesn't overwrite
+          our buffer like on some 64bit sun systems.... but hey, its time to move on */
+       chars = vsnprintf(&_T_emptybuffer, 0, fmt, ap)+1;
+       if(chars < 0) { chars *= -1; } /* CAW: old glibc versions have this problem */
+#endif /* defined(WIN32) */
+
+       b = (char*)malloc(sizeof(char)*chars);
+       if(!b) { return -1; }
+
+       if((chars = vsprintf(b, fmt, ap)) < 0)
+       {
+               free(b);
+       } else {
+               *buf = b;
+       }
+
+       return chars;
+}
+#endif /* !HAVE_VASPRINTF */
+
+#endif /* __vasprintf_compat_h */