Branch for 2.0 and bump to 0.10 ver accepted/2.0/20130318.204526 submit/2.0/20130318.211401
authorGraydon, Tracy <tracy.graydon@intel.com>
Mon, 18 Mar 2013 21:13:21 +0000 (14:13 -0700)
committerGraydon, Tracy <tracy.graydon@intel.com>
Mon, 18 Mar 2013 21:13:21 +0000 (14:13 -0700)
115 files changed:
.gitignore [new file with mode: 0644]
AUTHORS
ChangeLog
Doxyfile
Makefile.am
Makefile.am.inc [new file with mode: 0644]
NEWS
README
README-WIN32.html
README.html
RELEASE_CHECKLIST.txt [new file with mode: 0644]
arraylist.c
arraylist.h
autogen.sh [changed mode: 0644->0755]
bits.h
config.h.in
config.h.win32
configure.in
debug.h
doc/html/annotated.html [new file with mode: 0644]
doc/html/arraylist_8h.html [new file with mode: 0644]
doc/html/bits_8h.html [new file with mode: 0644]
doc/html/classes.html [new file with mode: 0644]
doc/html/debug_8h.html [new file with mode: 0644]
doc/html/deprecated.html [new file with mode: 0644]
doc/html/doxygen.css [new file with mode: 0644]
doc/html/doxygen.png [new file with mode: 0644]
doc/html/files.html [new file with mode: 0644]
doc/html/functions.html [new file with mode: 0644]
doc/html/functions_vars.html [new file with mode: 0644]
doc/html/globals.html [new file with mode: 0644]
doc/html/globals_defs.html [new file with mode: 0644]
doc/html/globals_enum.html [new file with mode: 0644]
doc/html/globals_eval.html [new file with mode: 0644]
doc/html/globals_func.html [new file with mode: 0644]
doc/html/globals_type.html [new file with mode: 0644]
doc/html/globals_vars.html [new file with mode: 0644]
doc/html/index.html [new file with mode: 0644]
doc/html/json_8h.html [new file with mode: 0644]
doc/html/json__inttypes_8h.html [new file with mode: 0644]
doc/html/json__object_8h.html [new file with mode: 0644]
doc/html/json__object__iterator_8h.html [new file with mode: 0644]
doc/html/json__object__private_8h.html [new file with mode: 0644]
doc/html/json__tokener_8h.html [new file with mode: 0644]
doc/html/json__util_8h.html [new file with mode: 0644]
doc/html/linkhash_8h.html [new file with mode: 0644]
doc/html/pages.html [new file with mode: 0644]
doc/html/printbuf_8h.html [new file with mode: 0644]
doc/html/structarray__list.html [new file with mode: 0644]
doc/html/structjson__object.html [new file with mode: 0644]
doc/html/structjson__object__iter.html [new file with mode: 0644]
doc/html/structjson__object__iterator.html [new file with mode: 0644]
doc/html/structjson__tokener.html [new file with mode: 0644]
doc/html/structjson__tokener__srec.html [new file with mode: 0644]
doc/html/structlh__entry.html [new file with mode: 0644]
doc/html/structlh__table.html [new file with mode: 0644]
doc/html/structprintbuf.html [new file with mode: 0644]
doc/html/tab_b.gif [new file with mode: 0644]
doc/html/tab_l.gif [new file with mode: 0644]
doc/html/tab_r.gif [new file with mode: 0644]
doc/html/tabs.css [new file with mode: 0644]
doc/html/unionjson__object_1_1data.html [new file with mode: 0644]
json.h
json_config.h.in [new file with mode: 0644]
json_inttypes.h [new file with mode: 0644]
json_object.c
json_object.h
json_object_iterator.c [new file with mode: 0644]
json_object_iterator.h [new file with mode: 0644]
json_object_private.h
json_tokener.c
json_tokener.h
json_util.c
json_util.h
linkhash.c
linkhash.h
packaging/json-c.changes
packaging/json-c.spec
printbuf.c
printbuf.h
test1.c [deleted file]
tests/Makefile.am [new file with mode: 0644]
tests/parse_flags.c [new file with mode: 0644]
tests/parse_flags.h [new file with mode: 0644]
tests/parse_int64.test [new file with mode: 0755]
tests/test-defs.sh [new file with mode: 0755]
tests/test1.c [new file with mode: 0644]
tests/test1.expected [new file with mode: 0644]
tests/test1.test [new file with mode: 0755]
tests/test1Formatted_plain.expected [new file with mode: 0644]
tests/test1Formatted_pretty.expected [new file with mode: 0644]
tests/test1Formatted_spaced.expected [new file with mode: 0644]
tests/test2.c [moved from test2.c with 73% similarity]
tests/test2.expected [new file with mode: 0644]
tests/test2.test [new file with mode: 0755]
tests/test2Formatted_plain.expected [new file with mode: 0644]
tests/test2Formatted_pretty.expected [new file with mode: 0644]
tests/test2Formatted_spaced.expected [new file with mode: 0644]
tests/test4.c [new file with mode: 0644]
tests/test4.expected [new file with mode: 0644]
tests/test4.test [new file with mode: 0755]
tests/test_cast.c [new file with mode: 0644]
tests/test_cast.expected [new file with mode: 0644]
tests/test_cast.test [new file with mode: 0755]
tests/test_null.c [new file with mode: 0644]
tests/test_null.expected [new file with mode: 0644]
tests/test_null.test [new file with mode: 0755]
tests/test_parse.c [new file with mode: 0644]
tests/test_parse.expected [new file with mode: 0644]
tests/test_parse.test [new file with mode: 0755]
tests/test_parse_int64.c [new file with mode: 0644]
tests/test_parse_int64.expected [new file with mode: 0644]
tests/test_printbuf.c [new file with mode: 0644]
tests/test_printbuf.expected [new file with mode: 0644]
tests/test_printbuf.test [new file with mode: 0755]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..6dfd3fd
--- /dev/null
@@ -0,0 +1,39 @@
+.deps/
+.libs/
+/aclocal.m4
+/autom4te.cache
+/config.guess
+/json_config.h
+/config.h
+/config.log
+/config.status
+/config.sub
+/configure
+/depcomp
+/install-sh
+/json.pc
+/libtool
+/ltmain.sh
+/Makefile
+/Makefile.in
+/missing
+/stamp-h1
+/stamp-h2
+/tests/Makefile
+/tests/Makefile.in
+/tests/test1
+/tests/test1Formatted
+/tests/test2
+/tests/test2Formatted
+/tests/test4
+/tests/testSubDir
+/tests/test_parse_int64
+/tests/test_parse
+/tests/test_cast
+/tests/test_null
+/tests/test_printbuf
+/Debug
+/Release
+*.lo
+*.o
+/libjson.la
diff --git a/AUTHORS b/AUTHORS
index 38f2ce0..b389989 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,2 +1,5 @@
 Michael Clark <michael@metaparadigm.com>
+Jehiah Czebotar <jehiah@gmail.com>
+Eric Haszlakiewicz <hawicz+json-c@gmail.com>
 C. Watford (christopher.watford@gmail.com)
+
index 7d2c823..e0fd4a3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,54 @@
+0.10
+
+  * Add a json_object_to_json_string_ext() function to allow output to be
+     formatted in a more human readable form.
+  * Add json_object_object_get_ex(), a NULL-safe get object method, to be able
+     to distinguish between a key not present and the value being NULL.
+  * Add an alternative iterator implementation, see json_object_iterator.h
+  * Make json_object_iter public to enable external use of the
+     json_object_object_foreachC macro.
+  * Add a printbuf_memset() function to provide an effecient way to set and
+     append things like whitespace indentation.
+  * Adjust json_object_is_type and json_object_get_type so they return
+      json_type_null for NULL objects and handle NULL passed to
+      json_objct_object_get().
+  * Rename boolean type to json_bool.
+  * Fix various compile issues for Visual Studio and MinGW.
+  * Allow json_tokener_parse_ex() to be re-used to parse multiple object.
+     Also, fix some parsing issues with capitalized hexadecimal numbers and
+     number in E notation.
+  * Add json_tokener_get_error() and json_tokener_error_desc() to better 
+     encapsulate the process of retrieving errors while parsing.
+  * Various improvements to the documentation of many functions.
+  * Add new json_object_array_sort() function.
+  * Fix a bug in json_object_get_int(), which would incorrectly return 0
+    when called on a string type object.
+    Eric Haszlakiewicz
+  * Add a json_type_to_name() function.
+    Eric Haszlakiewicz
+  * Add a json_tokener_parse_verbose() function.
+    Jehiah Czebotar
+  * Improve support for null bytes within JSON strings.
+    Jehiah Czebotar
+  * Fix file descriptor leak if memory allocation fails in json_util
+    Zachary Blair, zack_blair at hotmail dot com
+  * Add int64 support. Two new functions json_object_net_int64 and
+    json_object_get_int64. Binary compatibility preserved.
+    Eric Haszlakiewicz, EHASZLA at transunion com
+    Rui Miguel Silva Seabra, rms at 1407 dot org
+  * Fix subtle bug in linkhash where lookup could hang after all slots
+    were filled then successively freed.
+    Spotted by Jean-Marc Naud, j dash m at newtraxtech dot com
+  * Make json_object_from_file take const char *filename
+    Spotted by Vikram Raj V, vsagar at attinteractive dot com
+  * Add handling of surrogate pairs (json_tokener.c, test4.c, Makefile.am)
+    Brent Miller, bdmiller at yahoo dash inc dot com
+  * Correction to comment describing printbuf_memappend in printbuf.h
+    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
     Eric Haszlakiewicz, EHASZLA at transunion dot com
   * Rename min and max so we can never clash with C or C++ std library
index 7e5f306..3ff27eb 100644 (file)
--- a/Doxyfile
+++ b/Doxyfile
@@ -23,7 +23,7 @@ PROJECT_NAME           = json-c
 # This could be handy for archiving the generated documentation or 
 # if some version control system is used.
 
-PROJECT_NUMBER         = 0.2
+PROJECT_NUMBER         = 0.10
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
 # base path where the generated documentation will be put. 
index bf5d7ce..d4a7bbb 100644 (file)
@@ -1,6 +1,7 @@
-AM_CFLAGS = -Wall -Wwrite-strings -Werror -std=gnu99 -D_GNU_SOURCE -D_REENTRANT
+include Makefile.am.inc
 
-EXTRA_DIST = doc
+EXTRA_DIST = README.html README-WIN32.html config.h.win32 doc json-c.vcproj
+SUBDIRS = . tests
 
 lib_LTLIBRARIES = libjson.la
 
@@ -9,18 +10,25 @@ pkgconfig_DATA = json.pc
 
 libjsonincludedir = $(includedir)/json
 libjsoninclude_HEADERS = \
-        json.h \
+       arraylist.h \
        bits.h \
        debug.h \
-       linkhash.h \
-       arraylist.h \
-        printbuf.h \
-       json_util.h \
+       json.h \
+       json_config.h \
+       json_inttypes.h \
        json_object.h \
-        json_object_private.h \
-       json_tokener.h
+       json_object_private.h \
+       json_tokener.h \
+       json_util.h \
+       linkhash.h \
+       printbuf.h
 
-libjson_la_LDFLAGS = -version-info 0:1:0
+#libjsonx_includedir = $(libdir)/json-c-@VERSION@
+#
+#libjsonx_include_HEADERS = \
+#      json_config.h
+
+libjson_la_LDFLAGS = -version-info 1:0:1 -no-undefined
 
 libjson_la_SOURCES = \
        arraylist.c \
@@ -31,13 +39,8 @@ libjson_la_SOURCES = \
        linkhash.c \
        printbuf.c
 
-check_PROGRAMS = test1 test2 test3
-
-test1_SOURCES = test1.c
-test1_LDADD = $(lib_LTLIBRARIES)
 
-test2_SOURCES = test2.c
-test2_LDADD = $(lib_LTLIBRARIES)
+distclean-local:
+       -rm -rf $(testsubdir)
+       -rm -rf config.h.in~ Makefile.in aclocal.m4 autom4te.cache/ config.guess config.sub configure depcomp install-sh ltmain.sh missing
 
-test3_SOURCES = test3.c
-test3_LDADD = $(lib_LTLIBRARIES)
diff --git a/Makefile.am.inc b/Makefile.am.inc
new file mode 100644 (file)
index 0000000..b1ebce8
--- /dev/null
@@ -0,0 +1,2 @@
+AM_CFLAGS = -Wall -Wwrite-strings -Werror -std=gnu99 -D_GNU_SOURCE -D_REENTRANT
+
diff --git a/NEWS b/NEWS
index 41e843b..e69de29 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1 +0,0 @@
-News
diff --git a/README b/README
index beeba53..05ec274 100644 (file)
--- a/README
+++ b/README
@@ -1,16 +1,24 @@
-Building on Unix with gcc and autotools
+Building on Unix with git, gcc and autotools
 
-If checking out from CVS:
+Home page for json-c:
+  http://oss.metaparadigm.com/json-c/
 
-       sh autogen.sh
+Github repo for json-c:
+  https://github.com/json-c/json-c
 
-Then configure, make, make install
+    $ git clone https://github.com/json-c/json-c.git
+    $ cd json-c
+    $ sh autogen.sh
 
+Then 
 
-Test programs
+    $ ./configure
+    $ make
+    $ make install
 
-To build the test programs run 'make check'
+To build and run the test programs run 
 
+    $ make check
 
 Linking to libjson
 
index 678fc9d..28fc7d8 100644 (file)
@@ -1,6 +1,4 @@
-<!DOCTYPE html \r
-     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\r
-     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<!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
                                Added cast and mask to suffice <tt>size_t</tt> v. <tt>unsigned int</tt>\r
                                conversion correctness</dd>\r
                </dl>\r
-                <h3>Anonymous Subversion</h3>
-                <p><code># <b>svn co http://svn.metaparadigm.com/svn/json-c/trunk json-c</b></code></p>
-               <p>Copyright Metaparadigm Pte. Ltd. 2004, 2005. <a href="mailto:michael@metaparadigm.com">Michael \r
-                               Clark </a>\r
-               </p>\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
index c5cba3a..dc696af 100644 (file)
@@ -1,32 +1,34 @@
-<!DOCTYPE html \r
-     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\r
-     "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</title>\r
-               <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">\r
-       </head>\r
-       <body>\r
-               <h2>JSON-C - A JSON implementation in C</h2>\r
-               <p>Latest release: <a href="json-c-0.9.tar.gz">json-c-0.9.tar.gz</a></p>\r
-               <p>JSON-C implements a reference counting object model that allows you to easily \r
-                       construct JSON objects in C, output them as JSON formatted strings and parse \r
-                       JSON formatted strings back into the C representation of JSON objects.</p>\r
-               <p>Minimal documentation exists <a href="doc/html/json__object_8h.html">here</a>, \r
-                       Although you are probably better reading the example code in test1.c.</p>\r
-               <p>To setup JSON-C to build on your system please run <tt>configure</tt> before \r
-                       compiling. If you are on Win32 and are not using the VS project file, be sure \r
-                       to rename <tt>config.h.win32</tt> to <tt>config.h</tt> before building.</p>\r
-               <P>Win32 specific notes can be found <a href="README-WIN32.html">here</a>.</P>\r
-               <p>Please send bug reports to <a href="mailto:michael@metaparadigm.com">michael@metaparadigm.com</a></p>\r
-               <p>Please send Win32 bug reports to <a href="mailto:christopher.watford@gmail.com">christopher.watford@gmail.com</a></p>\r
-               <h3>Anonymous Subversion</h3>\r
-               <p><code># <b>svn co http://svn.metaparadigm.com/svn/json-c/trunk json-c</b></code></p>\r
-               <p>Copyright Metaparadigm Pte. Ltd. 2004, 2005. <a href="mailto:michael@metaparadigm.com">Michael \r
-                               Clark </a>\r
-               </p>\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
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+       <head>
+               <title>JSON-C - A JSON implementation in C</title>
+               <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+       </head>
+       <body>
+               <h2>JSON-C - A JSON implementation in C</h2>
+
+               <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>
+
+               <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>
+
+               <h3>Documentation</h3>
+               <P>Doxygen generated documentation exists <a href="doc/html/json__object_8h.html">here</a>
+               and Win32 specific notes can be found <a href="README-WIN32.html">here</a>.</P>
+
+               <h3><a href="https://github.com/json-c/json-c">GIT Reposository</a></h3>
+               <p><strong><code>git clone https://github.com/json-c/json-c.git</code></strong></p>
+
+               <h3><a href="http://groups.google.com/group/json-c">Mailing List</a></h3>
+                <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>
+               <hr/>
+       </body>
+</html>
diff --git a/RELEASE_CHECKLIST.txt b/RELEASE_CHECKLIST.txt
new file mode 100644 (file)
index 0000000..28f5b89
--- /dev/null
@@ -0,0 +1,57 @@
+
+Release checklist:
+
+release=0.10
+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
+Check ChangeLog to see if anything should be added.
+
+  git branch json-c-${release}
+  git checkout json-c-${release}
+
+Generate the configure script and other files:
+  sh autogen.sh
+  git add -f Makefile.in aclocal.m4 config.guess \
+       config.sub configure depcomp install-sh \
+       ltmain.sh missing tests/Makefile.in
+
+  # check for anything else to be added:
+  git status --ignored
+  git commit
+
+Generate the doxygen documentation:
+  doxygen
+  git add doc
+  git commit doc
+
+cd ..
+echo .git > excludes
+echo autom4te.cache >> excludes
+tar -czf json-c-${release}.tar.gz -X excludes json-c-${release}
+
+echo doc >> excludes
+tar -czf json-c-${release}-doc.tar.gz -X excludes json-c-${release}
+
+Tag the branch:
+cd json-c-${release}
+git tag json-c-${release}-$(date +%Y%m%d)
+
+Go to https://github.com/json-c/json-c/downloads
+Upload the two tarballs.
+
+
+===================================
+
+Post-release checklist:
+
+git branch master
+Add new section to CHANGES
+Update the version in Doxyfile
+Update the version in configure.in
+Update the libjson_la_LDFLAGS line in Makefile.am to the new version.
+       http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
+
index cd04eea..9a673d6 100644 (file)
@@ -87,6 +87,13 @@ array_list_add(struct array_list *arr, void *data)
   return array_list_put_idx(arr, arr->length, 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);
+}
+
 int
 array_list_length(struct array_list *arr)
 {
index bc85c80..4f3113c 100644 (file)
@@ -46,6 +46,9 @@ array_list_add(struct array_list *al, void *data);
 extern int
 array_list_length(struct array_list *al);
 
+extern void
+array_list_sort(struct array_list *arr, int(*compar)(const void *, const void *));
+
 #ifdef __cplusplus
 }
 #endif
old mode 100644 (file)
new mode 100755 (executable)
diff --git a/bits.h b/bits.h
index f308da3..c8cbbc8 100644 (file)
--- a/bits.h
+++ b/bits.h
@@ -22,6 +22,7 @@
 
 #define hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x) & 7) + 9)
 #define error_ptr(error) ((void*)error)
-#define is_error(ptr) ((unsigned long)ptr > (unsigned long)-4000L)
+#define error_description(error)  (json_tokener_errors[error])
+#define is_error(ptr) (ptr == NULL)
 
 #endif
index 5139ae8..04f5dc5 100644 (file)
@@ -80,6 +80,9 @@
 /* Define to 1 if you have the `vsyslog' function. */
 #undef HAVE_VSYSLOG
 
+/* Public define for json_inttypes.h */
+#undef JSON_C_HAVE_INTTYPES_H
+
 /* Define to the sub-directory in which libtool stores uninstalled libraries.
    */
 #undef LT_OBJDIR
 /* Define to the one symbol short name of this package. */
 #undef PACKAGE_TARNAME
 
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
index 7f7e6ae..ec3a84a 100644 (file)
@@ -12,7 +12,7 @@
 /* config.h.win32  Generated by configure.  */
 
 #define PACKAGE_STRING "JSON C Library 0.2"
-#define PACKAGE_BUGREPORT "michael@metaparadigm.com"
+#define PACKAGE_BUGREPORT "json-c@googlegroups.com"
 #define PACKAGE_NAME "JSON C Library"
 #define PACKAGE_TARNAME "json-c"
 #define PACKAGE_VERSION "0.2"
index 8f0fff3..b2c3cbe 100644 (file)
@@ -1,18 +1,22 @@
 AC_PREREQ(2.52)
 
 # Process this file with autoconf to produce a configure script.
-AC_INIT([json-c], 0.9, [michael@metaparadigm.com])
+AC_INIT([json-c], 0.10, [json-c@googlegroups.com])
 
 AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
 
+AC_PROG_MAKE_SET
+
 # Checks for programs.
 
 # Checks for libraries.
 
 # Checks for header files.
 AM_CONFIG_HEADER(config.h)
+AM_CONFIG_HEADER(json_config.h)
 AC_HEADER_STDC
 AC_CHECK_HEADERS(fcntl.h limits.h strings.h syslog.h unistd.h [sys/param.h] stdarg.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
@@ -27,7 +31,11 @@ AC_CHECK_FUNCS(strndup strerror vsnprintf vasprintf open vsyslog strncasecmp)
 
 AM_PROG_LIBTOOL
 
-AC_OUTPUT([
+AC_CONFIG_FILES([
 Makefile
 json.pc
+tests/Makefile
 ])
+
+AC_OUTPUT
+
diff --git a/debug.h b/debug.h
index 59a4dfc..1e09701 100644 (file)
--- a/debug.h
+++ b/debug.h
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
  * Michael Clark <michael@metaparadigm.com>
+ * Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
  *
  * This library is free software; you can redistribute it and/or modify
  * it under the terms of the MIT license. See COPYING for details.
@@ -12,6 +13,8 @@
 #ifndef _DEBUG_H_
 #define _DEBUG_H_
 
+#include <stdlib.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -25,21 +28,40 @@ extern void mc_debug(const char *msg, ...);
 extern void mc_error(const char *msg, ...);
 extern void mc_info(const char *msg, ...);
 
+#ifndef __STRING
+#define __STRING(x) #x
+#endif
+
+#ifndef PARSER_BROKEN_FIXED
+
+#define JASSERT(cond) do {} while(0)
+
+#else
+
+#define JASSERT(cond) do { \
+               if (!(cond)) { \
+                       mc_error("cjson assert failure %s:%d : cond \"" __STRING(cond) "failed\n", __FILE__, __LINE__); \
+                       *(int *)0 = 1;\
+                       abort(); \
+               }\
+       } while(0)
+
+#endif
+
+#define MC_ABORT(x, ...) mc_abort(x, ##__VA_ARGS__)
+#define MC_ERROR(x, ...) mc_error(x, ##__VA_ARGS__)
+
 #ifdef MC_MAINTAINER_MODE
 #define MC_SET_DEBUG(x) mc_set_debug(x)
 #define MC_GET_DEBUG() mc_get_debug()
 #define MC_SET_SYSLOG(x) mc_set_syslog(x)
-#define MC_ABORT(x, ...) mc_abort(x, ##__VA_ARGS__)
 #define MC_DEBUG(x, ...) mc_debug(x, ##__VA_ARGS__)
-#define MC_ERROR(x, ...) mc_error(x, ##__VA_ARGS__)
 #define MC_INFO(x, ...) mc_info(x, ##__VA_ARGS__)
 #else
 #define MC_SET_DEBUG(x) if (0) mc_set_debug(x)
 #define MC_GET_DEBUG() (0)
 #define MC_SET_SYSLOG(x) if (0) mc_set_syslog(x)
-#define MC_ABORT(x, ...) if (0) mc_abort(x, ##__VA_ARGS__)
 #define MC_DEBUG(x, ...) if (0) mc_debug(x, ##__VA_ARGS__)
-#define MC_ERROR(x, ...) if (0) mc_error(x, ##__VA_ARGS__)
 #define MC_INFO(x, ...) if (0) mc_info(x, ##__VA_ARGS__)
 #endif
 
diff --git a/doc/html/annotated.html b/doc/html/annotated.html
new file mode 100644 (file)
index 0000000..4fc50f0
--- /dev/null
@@ -0,0 +1,45 @@
+<!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"/>
+<title>json-c: Data Structures</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>Data Structures</h1>Here are the data structures with brief descriptions:<table>
+  <tr><td class="indexkey"><a class="el" href="structarray__list.html">array_list</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="unionjson__object_1_1data.html">json_object::data</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structjson__object.html">json_object</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structjson__object__iter.html">json_object_iter</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structjson__object__iterator.html">json_object_iterator</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structjson__tokener.html">json_tokener</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structjson__tokener__srec.html">json_tokener_srec</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structlh__entry.html">lh_entry</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structlh__table.html">lh_table</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structprintbuf.html">printbuf</a></td><td class="indexvalue"></td></tr>
+</table>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/arraylist_8h.html b/doc/html/arraylist_8h.html
new file mode 100644 (file)
index 0000000..7c00cd0
--- /dev/null
@@ -0,0 +1,246 @@
+<!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"/>
+<title>json-c: arraylist.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>arraylist.h File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Structures</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structarray__list.html">array_list</a></td></tr>
+<tr><td colspan="2"><h2>Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#acd30d910b398421574eb1f59e78617f5">ARRAY_LIST_DEFAULT_SIZE</a>&nbsp;&nbsp;&nbsp;32</td></tr>
+<tr><td colspan="2"><h2>Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef void(&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="arraylist_8h.html#aad83e4ed3c8ea274e6f18459276d774b">array_list_free_fn</a> )(void *data)</td></tr>
+<tr><td colspan="2"><h2>Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structarray__list.html">array_list</a> *&nbsp;</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#aad83e4ed3c8ea274e6f18459276d774b">array_list_free_fn</a> *free_fn)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</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><td class="memItemLeft" align="right" valign="top">void *&nbsp;</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><td class="memItemLeft" align="right" valign="top">int&nbsp;</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><td class="memItemLeft" align="right" valign="top">int&nbsp;</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><td class="memItemLeft" align="right" valign="top">int&nbsp;</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><td class="memItemLeft" align="right" valign="top">void&nbsp;</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>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="acd30d910b398421574eb1f59e78617f5"></a><!-- doxytag: member="arraylist.h::ARRAY_LIST_DEFAULT_SIZE" ref="acd30d910b398421574eb1f59e78617f5" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ARRAY_LIST_DEFAULT_SIZE&nbsp;&nbsp;&nbsp;32</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Typedef Documentation</h2>
+<a class="anchor" id="aad83e4ed3c8ea274e6f18459276d774b"></a><!-- doxytag: member="arraylist.h::array_list_free_fn" ref="aad83e4ed3c8ea274e6f18459276d774b" args=")(void *data)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void( <a class="el" href="arraylist_8h.html#aad83e4ed3c8ea274e6f18459276d774b">array_list_free_fn</a>)(void *data)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="a6e995608aa464244ff3184fb43574dc8"></a><!-- doxytag: member="arraylist.h::array_list_add" ref="a6e995608aa464244ff3184fb43574dc8" args="(struct array_list *al, void *data)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int array_list_add </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structarray__list.html">array_list</a> *&nbsp;</td>
+          <td class="paramname"> <em>al</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&nbsp;</td>
+          <td class="paramname"> <em>data</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acd00fb70f7ca82f23b48b812c3498f67"></a><!-- doxytag: member="arraylist.h::array_list_free" ref="acd00fb70f7ca82f23b48b812c3498f67" args="(struct array_list *al)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void array_list_free </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structarray__list.html">array_list</a> *&nbsp;</td>
+          <td class="paramname"> <em>al</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa16207e545b6c1265299abcfa418dc2b"></a><!-- doxytag: member="arraylist.h::array_list_get_idx" ref="aa16207e545b6c1265299abcfa418dc2b" args="(struct array_list *al, int i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* array_list_get_idx </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structarray__list.html">array_list</a> *&nbsp;</td>
+          <td class="paramname"> <em>al</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>i</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa8393b4aa3dc447660371530439ab70f"></a><!-- doxytag: member="arraylist.h::array_list_length" ref="aa8393b4aa3dc447660371530439ab70f" args="(struct array_list *al)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int array_list_length </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structarray__list.html">array_list</a> *&nbsp;</td>
+          <td class="paramname"> <em>al</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0d4bfac055dfd98e17296142abf4d894"></a><!-- doxytag: member="arraylist.h::array_list_new" ref="a0d4bfac055dfd98e17296142abf4d894" args="(array_list_free_fn *free_fn)" -->
+<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#aad83e4ed3c8ea274e6f18459276d774b">array_list_free_fn</a> *&nbsp;</td>
+          <td class="paramname"> <em>free_fn</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a21b8e4c59e52fbc5a9a5a098e3f96e76"></a><!-- doxytag: member="arraylist.h::array_list_put_idx" ref="a21b8e4c59e52fbc5a9a5a098e3f96e76" args="(struct array_list *al, int i, void *data)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int array_list_put_idx </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structarray__list.html">array_list</a> *&nbsp;</td>
+          <td class="paramname"> <em>al</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>i</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&nbsp;</td>
+          <td class="paramname"> <em>data</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afb67cc8e2e5c9be41c3e644536079169"></a><!-- doxytag: member="arraylist.h::array_list_sort" ref="afb67cc8e2e5c9be41c3e644536079169" args="(struct array_list *arr, int(*compar)(const void *, const void *))" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void array_list_sort </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structarray__list.html">array_list</a> *&nbsp;</td>
+          <td class="paramname"> <em>arr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int(*)(const void *, const void *)&nbsp;</td>
+          <td class="paramname"> <em>compar</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:46 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/bits_8h.html b/doc/html/bits_8h.html
new file mode 100644 (file)
index 0000000..aa44692
--- /dev/null
@@ -0,0 +1,161 @@
+<!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"/>
+<title>json-c: bits.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>bits.h File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="bits_8h.html#a3dde282dc23d0eaa3c4840df8dc262d4">json_min</a>(a, b)&nbsp;&nbsp;&nbsp;((a) &lt; (b) ? (a) : (b))</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="bits_8h.html#a57d63d199d4b9ea40359253618951300">json_max</a>(a, b)&nbsp;&nbsp;&nbsp;((a) &gt; (b) ? (a) : (b))</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="bits_8h.html#a1cf38b22d3a118ad48d9282c32c048aa">hexdigit</a>(x)&nbsp;&nbsp;&nbsp;(((x) &lt;= '9') ? (x) - '0' : ((x) &amp; 7) + 9)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="bits_8h.html#a863a898e607f8c2ff87b7052e326740f">error_ptr</a>(error)&nbsp;&nbsp;&nbsp;((void*)error)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="bits_8h.html#a45afe86501cd57ee2beeef9d67a4d40c">error_description</a>(error)&nbsp;&nbsp;&nbsp;(<a class="el" href="json__tokener_8h.html#a6ede8ee7a4ec1fed68d10ea77294c966">json_tokener_errors</a>[error])</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="bits_8h.html#a4a887e5fb7cde221bcab9c6f39d93fc1">is_error</a>(ptr)&nbsp;&nbsp;&nbsp;(ptr == NULL)</td></tr>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="a45afe86501cd57ee2beeef9d67a4d40c"></a><!-- doxytag: member="bits.h::error_description" ref="a45afe86501cd57ee2beeef9d67a4d40c" args="(error)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define error_description</td>
+          <td>(</td>
+          <td class="paramtype">error&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;(<a class="el" href="json__tokener_8h.html#a6ede8ee7a4ec1fed68d10ea77294c966">json_tokener_errors</a>[error])</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a863a898e607f8c2ff87b7052e326740f"></a><!-- doxytag: member="bits.h::error_ptr" ref="a863a898e607f8c2ff87b7052e326740f" args="(error)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define error_ptr</td>
+          <td>(</td>
+          <td class="paramtype">error&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;((void*)error)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1cf38b22d3a118ad48d9282c32c048aa"></a><!-- doxytag: member="bits.h::hexdigit" ref="a1cf38b22d3a118ad48d9282c32c048aa" args="(x)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define hexdigit</td>
+          <td>(</td>
+          <td class="paramtype">x&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;(((x) &lt;= '9') ? (x) - '0' : ((x) &amp; 7) + 9)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4a887e5fb7cde221bcab9c6f39d93fc1"></a><!-- doxytag: member="bits.h::is_error" ref="a4a887e5fb7cde221bcab9c6f39d93fc1" args="(ptr)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define is_error</td>
+          <td>(</td>
+          <td class="paramtype">ptr&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;(ptr == NULL)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a57d63d199d4b9ea40359253618951300"></a><!-- doxytag: member="bits.h::json_max" ref="a57d63d199d4b9ea40359253618951300" args="(a, b)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define json_max</td>
+          <td>(</td>
+          <td class="paramtype">a, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">b&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;((a) &gt; (b) ? (a) : (b))</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3dde282dc23d0eaa3c4840df8dc262d4"></a><!-- doxytag: member="bits.h::json_min" ref="a3dde282dc23d0eaa3c4840df8dc262d4" args="(a, b)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define json_min</td>
+          <td>(</td>
+          <td class="paramtype">a, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">b&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;((a) &lt; (b) ? (a) : (b))</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:46 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/classes.html b/doc/html/classes.html
new file mode 100644 (file)
index 0000000..d3824e4
--- /dev/null
@@ -0,0 +1,41 @@
+<!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"/>
+<title>json-c: Alphabetical List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>Data Structure Index</h1><div class="qindex"><a class="qindex" href="#letter_A">A</a>&nbsp;|&nbsp;<a class="qindex" href="#letter_D">D</a>&nbsp;|&nbsp;<a class="qindex" href="#letter_J">J</a>&nbsp;|&nbsp;<a class="qindex" href="#letter_L">L</a>&nbsp;|&nbsp;<a class="qindex" href="#letter_P">P</a></div>
+<table align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
+<tr><td><a name="letter_A"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&nbsp;&nbsp;A&nbsp;&nbsp;</div></td></tr></table>
+</td><td><a class="el" href="unionjson__object_1_1data.html">json_object::data</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="structjson__object__iter.html">json_object_iter</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="structjson__tokener__srec.html">json_tokener_srec</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="structlh__table.html">lh_table</a>&nbsp;&nbsp;&nbsp;</td></tr><tr><td><a class="el" href="structarray__list.html">array_list</a>&nbsp;&nbsp;&nbsp;</td><td><a name="letter_J"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&nbsp;&nbsp;J&nbsp;&nbsp;</div></td></tr></table>
+</td><td><a class="el" href="structjson__object__iterator.html">json_object_iterator</a>&nbsp;&nbsp;&nbsp;</td><td><a name="letter_L"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&nbsp;&nbsp;L&nbsp;&nbsp;</div></td></tr></table>
+</td><td><a name="letter_P"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&nbsp;&nbsp;P&nbsp;&nbsp;</div></td></tr></table>
+</td></tr><tr><td><a name="letter_D"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&nbsp;&nbsp;D&nbsp;&nbsp;</div></td></tr></table>
+</td><td><a class="el" href="structjson__object.html">json_object</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="structjson__tokener.html">json_tokener</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="structlh__entry.html">lh_entry</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="structprintbuf.html">printbuf</a>&nbsp;&nbsp;&nbsp;</td></tr></table><div class="qindex"><a class="qindex" href="#letter_A">A</a>&nbsp;|&nbsp;<a class="qindex" href="#letter_D">D</a>&nbsp;|&nbsp;<a class="qindex" href="#letter_J">J</a>&nbsp;|&nbsp;<a class="qindex" href="#letter_L">L</a>&nbsp;|&nbsp;<a class="qindex" href="#letter_P">P</a></div>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/debug_8h.html b/doc/html/debug_8h.html
new file mode 100644 (file)
index 0000000..95f8b8c
--- /dev/null
@@ -0,0 +1,399 @@
+<!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"/>
+<title>json-c: debug.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>debug.h File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#a375c4dc9f0fb338999de81aab826f9d6">__STRING</a>(x)&nbsp;&nbsp;&nbsp;#x</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#a8ca29550d5b1b73948f4a7bce53f2385">JASSERT</a>(cond)&nbsp;&nbsp;&nbsp;do {} while(0)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#a25591d3d4754c0c6d1f2b5463fb4977e">MC_ABORT</a>(x,...)&nbsp;&nbsp;&nbsp;mc_abort(x, ##__VA_ARGS__)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#a11ba39cecbe449af5b86fa2f78e9da9d">MC_ERROR</a>(x,...)&nbsp;&nbsp;&nbsp;mc_error(x, ##__VA_ARGS__)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#a50f21a239fa040a10ad4cfdb4278b02b">MC_SET_DEBUG</a>(x)&nbsp;&nbsp;&nbsp;if (0) mc_set_debug(x)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#acb272a4b4444b69cd995236f167f90ba">MC_GET_DEBUG</a>()&nbsp;&nbsp;&nbsp;(0)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#acf1e895cb5eb7f334cbe51901e6bb918">MC_SET_SYSLOG</a>(x)&nbsp;&nbsp;&nbsp;if (0) mc_set_syslog(x)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#afda355b35d18bf2e6a2a22d5c8eef42c">MC_DEBUG</a>(x,...)&nbsp;&nbsp;&nbsp;if (0) mc_debug(x, ##__VA_ARGS__)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#a5ef640ce1e9e61c5f6632aefbbfa0041">MC_INFO</a>(x,...)&nbsp;&nbsp;&nbsp;if (0) mc_info(x, ##__VA_ARGS__)</td></tr>
+<tr><td colspan="2"><h2>Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#af65a73617b71476020a005b20bf02726">mc_set_debug</a> (int debug)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#a3b3ab3ae8b438384fb109a2e38646b6e">mc_get_debug</a> (void)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#aadb888da410116384e75a00db30da705">mc_set_syslog</a> (int syslog)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#a44913dbc4f1abf6614d42b22b941c092">mc_abort</a> (const char *msg,...)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#a600cf4cbbe19c0c15ca3710210e35aba">mc_debug</a> (const char *msg,...)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#abf22ea3a331c7ff21c23da91a07c7cb2">mc_error</a> (const char *msg,...)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="debug_8h.html#acbb92996a994e316ff65ed3a026e12a4">mc_info</a> (const char *msg,...)</td></tr>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="a375c4dc9f0fb338999de81aab826f9d6"></a><!-- doxytag: member="debug.h::__STRING" ref="a375c4dc9f0fb338999de81aab826f9d6" args="(x)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define __STRING</td>
+          <td>(</td>
+          <td class="paramtype">x&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;#x</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8ca29550d5b1b73948f4a7bce53f2385"></a><!-- doxytag: member="debug.h::JASSERT" ref="a8ca29550d5b1b73948f4a7bce53f2385" args="(cond)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JASSERT</td>
+          <td>(</td>
+          <td class="paramtype">cond&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;do {} while(0)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a25591d3d4754c0c6d1f2b5463fb4977e"></a><!-- doxytag: member="debug.h::MC_ABORT" ref="a25591d3d4754c0c6d1f2b5463fb4977e" args="(x,...)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MC_ABORT</td>
+          <td>(</td>
+          <td class="paramtype">x, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> <em>...</em>&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;mc_abort(x, ##__VA_ARGS__)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afda355b35d18bf2e6a2a22d5c8eef42c"></a><!-- doxytag: member="debug.h::MC_DEBUG" ref="afda355b35d18bf2e6a2a22d5c8eef42c" args="(x,...)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MC_DEBUG</td>
+          <td>(</td>
+          <td class="paramtype">x, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> <em>...</em>&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;if (0) mc_debug(x, ##__VA_ARGS__)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a11ba39cecbe449af5b86fa2f78e9da9d"></a><!-- doxytag: member="debug.h::MC_ERROR" ref="a11ba39cecbe449af5b86fa2f78e9da9d" args="(x,...)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MC_ERROR</td>
+          <td>(</td>
+          <td class="paramtype">x, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> <em>...</em>&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;mc_error(x, ##__VA_ARGS__)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acb272a4b4444b69cd995236f167f90ba"></a><!-- doxytag: member="debug.h::MC_GET_DEBUG" ref="acb272a4b4444b69cd995236f167f90ba" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MC_GET_DEBUG</td>
+          <td>(</td>
+&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;(0)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5ef640ce1e9e61c5f6632aefbbfa0041"></a><!-- doxytag: member="debug.h::MC_INFO" ref="a5ef640ce1e9e61c5f6632aefbbfa0041" args="(x,...)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MC_INFO</td>
+          <td>(</td>
+          <td class="paramtype">x, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> <em>...</em>&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;if (0) mc_info(x, ##__VA_ARGS__)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a50f21a239fa040a10ad4cfdb4278b02b"></a><!-- doxytag: member="debug.h::MC_SET_DEBUG" ref="a50f21a239fa040a10ad4cfdb4278b02b" args="(x)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MC_SET_DEBUG</td>
+          <td>(</td>
+          <td class="paramtype">x&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;if (0) mc_set_debug(x)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acf1e895cb5eb7f334cbe51901e6bb918"></a><!-- doxytag: member="debug.h::MC_SET_SYSLOG" ref="acf1e895cb5eb7f334cbe51901e6bb918" args="(x)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MC_SET_SYSLOG</td>
+          <td>(</td>
+          <td class="paramtype">x&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;if (0) mc_set_syslog(x)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="a44913dbc4f1abf6614d42b22b941c092"></a><!-- doxytag: member="debug.h::mc_abort" ref="a44913dbc4f1abf6614d42b22b941c092" args="(const char *msg,...)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mc_abort </td>
+          <td>(</td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>msg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&nbsp;</td>
+          <td class="paramname"> <em>...</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a600cf4cbbe19c0c15ca3710210e35aba"></a><!-- doxytag: member="debug.h::mc_debug" ref="a600cf4cbbe19c0c15ca3710210e35aba" args="(const char *msg,...)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mc_debug </td>
+          <td>(</td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>msg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&nbsp;</td>
+          <td class="paramname"> <em>...</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abf22ea3a331c7ff21c23da91a07c7cb2"></a><!-- doxytag: member="debug.h::mc_error" ref="abf22ea3a331c7ff21c23da91a07c7cb2" args="(const char *msg,...)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mc_error </td>
+          <td>(</td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>msg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&nbsp;</td>
+          <td class="paramname"> <em>...</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3b3ab3ae8b438384fb109a2e38646b6e"></a><!-- doxytag: member="debug.h::mc_get_debug" ref="a3b3ab3ae8b438384fb109a2e38646b6e" args="(void)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int mc_get_debug </td>
+          <td>(</td>
+          <td class="paramtype">void&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acbb92996a994e316ff65ed3a026e12a4"></a><!-- doxytag: member="debug.h::mc_info" ref="acbb92996a994e316ff65ed3a026e12a4" args="(const char *msg,...)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mc_info </td>
+          <td>(</td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>msg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&nbsp;</td>
+          <td class="paramname"> <em>...</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af65a73617b71476020a005b20bf02726"></a><!-- doxytag: member="debug.h::mc_set_debug" ref="af65a73617b71476020a005b20bf02726" args="(int debug)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mc_set_debug </td>
+          <td>(</td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>debug</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aadb888da410116384e75a00db30da705"></a><!-- doxytag: member="debug.h::mc_set_syslog" ref="aadb888da410116384e75a00db30da705" args="(int syslog)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mc_set_syslog </td>
+          <td>(</td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>syslog</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/deprecated.html b/doc/html/deprecated.html
new file mode 100644 (file)
index 0000000..77dc91f
--- /dev/null
@@ -0,0 +1,39 @@
+<!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"/>
+<title>json-c: Deprecated List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="deprecated">Deprecated List </a></h1><p><a class="anchor" id="_deprecated000001"></a> </p>
+<dl>
+<dt>Global <a class="el" href="json__object_8h.html#ac11730ad909d1f9eb077d1ce9ff8b153">json_object_object_get</a> (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>
+</dl>
+<p><a class="anchor" id="_deprecated000002"></a> </p>
+<dl>
+<dt>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 lh_table_lookup_ex instead. </dd>
+</dl>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/doxygen.css b/doc/html/doxygen.css
new file mode 100644 (file)
index 0000000..d6aaf28
--- /dev/null
@@ -0,0 +1,545 @@
+/* The standard CSS for doxygen */
+
+body, table, div, p, dl {
+       font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
+       font-size: 12px;
+}
+
+/* @group Heading Levels */
+
+h1 {
+       text-align: center;
+       font-size: 150%;
+}
+
+h2 {
+       font-size: 120%;
+}
+
+h3 {
+       font-size: 100%;
+}
+
+dt {
+       font-weight: bold;
+}
+
+div.multicol {
+       -moz-column-gap: 1em;
+       -webkit-column-gap: 1em;
+       -moz-column-count: 3;
+       -webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+       margin-top: 2px;
+}
+
+p.endli {
+       margin-bottom: 0px;
+}
+
+p.enddd {
+       margin-bottom: 4px;
+}
+
+p.endtd {
+       margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+       font-weight: bold;
+}
+
+span.legend {
+        font-size: 70%;
+        text-align: center;
+}
+
+h3.version {
+        font-size: 90%;
+        text-align: center;
+}
+
+div.qindex, div.navtab{
+       background-color: #e8eef2;
+       border: 1px solid #84b0c7;
+       text-align: center;
+       margin: 2px;
+       padding: 2px;
+}
+
+div.qindex, div.navpath {
+       width: 100%;
+       line-height: 140%;
+}
+
+div.navtab {
+       margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+       color: #153788;
+       font-weight: normal;
+       text-decoration: none;
+}
+
+.contents a:visited {
+       color: #1b77c5;
+}
+
+a:hover {
+       text-decoration: underline;
+}
+
+a.qindex {
+       font-weight: bold;
+}
+
+a.qindexHL {
+       font-weight: bold;
+       background-color: #6666cc;
+       color: #ffffff;
+       border: 1px double #9295C2;
+}
+
+.contents a.qindexHL:visited {
+        color: #ffffff;
+}
+
+a.el {
+       font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code {
+       color: #3030f0;
+}
+
+a.codeRef {
+       color: #3030f0;
+}
+
+/* @end */
+
+dl.el {
+       margin-left: -1cm;
+}
+
+.fragment {
+       font-family: monospace, fixed;
+       font-size: 105%;
+}
+
+pre.fragment {
+       border: 1px solid #CCCCCC;
+       background-color: #f5f5f5;
+       padding: 4px 6px;
+       margin: 4px 8px 4px 2px;
+       overflow: auto;
+       word-wrap: break-word;
+       font-size:  9pt;
+       line-height: 125%;
+}
+
+div.ah {
+       background-color: black;
+       font-weight: bold;
+       color: #ffffff;
+       margin-bottom: 3px;
+       margin-top: 3px
+}
+
+div.groupHeader {
+       margin-left: 16px;
+       margin-top: 12px;
+       margin-bottom: 6px;
+       font-weight: bold;
+}
+
+div.groupText {
+       margin-left: 16px;
+       font-style: italic;
+}
+
+body {
+       background: white;
+       color: black;
+       margin-right: 20px;
+       margin-left: 20px;
+}
+
+td.indexkey {
+       background-color: #e8eef2;
+       font-weight: bold;
+       border: 1px solid #CCCCCC;
+       margin: 2px 0px 2px 0;
+       padding: 2px 10px;
+}
+
+td.indexvalue {
+       background-color: #e8eef2;
+       border: 1px solid #CCCCCC;
+       padding: 2px 10px;
+       margin: 2px 0px;
+}
+
+tr.memlist {
+       background-color: #f0f0f0;
+}
+
+p.formulaDsp {
+       text-align: center;
+}
+
+img.formulaDsp {
+       
+}
+
+img.formulaInl {
+       vertical-align: middle;
+}
+
+div.center {
+       text-align: center;
+        margin-top: 0px;
+        margin-bottom: 0px;
+        padding: 0px;
+}
+
+div.center img {
+       border: 0px;
+}
+
+img.footer {
+       border: 0px;
+       vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+       color: #008000
+}
+
+span.keywordtype {
+       color: #604020
+}
+
+span.keywordflow {
+       color: #e08000
+}
+
+span.comment {
+       color: #800000
+}
+
+span.preprocessor {
+       color: #806020
+}
+
+span.stringliteral {
+       color: #002080
+}
+
+span.charliteral {
+       color: #008080
+}
+
+span.vhdldigit { 
+       color: #ff00ff 
+}
+
+span.vhdlchar { 
+       color: #000000 
+}
+
+span.vhdlkeyword { 
+       color: #700070 
+}
+
+span.vhdllogic { 
+       color: #ff0000 
+}
+
+/* @end */
+
+.search {
+       color: #003399;
+       font-weight: bold;
+}
+
+form.search {
+       margin-bottom: 0px;
+       margin-top: 0px;
+}
+
+input.search {
+       font-size: 75%;
+       color: #000080;
+       font-weight: normal;
+       background-color: #e8eef2;
+}
+
+td.tiny {
+       font-size: 75%;
+}
+
+.dirtab {
+       padding: 4px;
+       border-collapse: collapse;
+       border: 1px solid #84b0c7;
+}
+
+th.dirtab {
+       background: #e8eef2;
+       font-weight: bold;
+}
+
+hr {
+       height: 0px;
+       border: none;
+       border-top: 1px solid #666;
+}
+
+hr.footer {
+       height: 1px;
+}
+
+/* @group Member Descriptions */
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+       background-color: #FAFAFA;
+       border: none;
+       margin: 4px;
+       padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+       padding: 0px 8px 4px 8px;
+       color: #555;
+}
+
+.memItemLeft, .memItemRight, .memTemplParams {
+       border-top: 1px solid #ccc;
+}
+
+.memItemLeft, .memTemplItemLeft {
+        white-space: nowrap;
+}
+
+.memTemplParams {
+       color: #606060;
+        white-space: nowrap;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+       font-size: 80%;
+       color: #606060;
+       font-weight: normal;
+       margin-left: 3px;
+}
+
+.memnav {
+       background-color: #e8eef2;
+       border: 1px solid #84b0c7;
+       text-align: center;
+       margin: 2px;
+       margin-right: 15px;
+       padding: 2px;
+}
+
+.memitem {
+       padding: 0;
+       margin-bottom: 10px;
+}
+
+.memname {
+        white-space: nowrap;
+        font-weight: bold;
+        margin-left: 6px;
+}
+
+.memproto {
+        border-top: 1px solid #84b0c7;          
+        border-left: 1px solid #84b0c7;         
+        border-right: 1px solid #84b0c7; 
+        padding: 0;
+        background-color: #d5e1e8;
+        font-weight: bold;
+        /* firefox specific markup */
+        background-image: -moz-linear-gradient(rgba(228, 233, 245, 1.0) 0%, rgba(193, 205, 232, 1.0) 100%);
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        -moz-border-radius-topright: 8px;
+        -moz-border-radius-topleft: 8px;
+        /* webkit specific markup */
+        background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(228, 233, 245, 1.0)), to(rgba(193, 205, 232, 1.0)));
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        -webkit-border-top-right-radius: 8px;
+        -webkit-border-top-left-radius: 8px;
+
+}
+
+.memdoc {
+        border-bottom: 1px solid #84b0c7;      
+        border-left: 1px solid #84b0c7;      
+        border-right: 1px solid #84b0c7; 
+        padding: 2px 5px;
+        background-color: #eef3f5;
+        border-top-width: 0;
+        /* firefox specific markup */
+        -moz-border-radius-bottomleft: 8px;
+        -moz-border-radius-bottomright: 8px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        /* webkit specific markup */
+        -webkit-border-bottom-left-radius: 8px;
+        -webkit-border-bottom-right-radius: 8px;
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+.paramkey {
+       text-align: right;
+}
+
+.paramtype {
+       white-space: nowrap;
+}
+
+.paramname {
+       color: #602020;
+       white-space: nowrap;
+}
+.paramname em {
+       font-style: normal;
+}
+
+/* @end */
+
+/* @group Directory (tree) */
+
+/* for the tree view */
+
+.ftvtree {
+       font-family: sans-serif;
+       margin: 0.5em;
+}
+
+/* these are for tree view when used as main index */
+
+.directory {
+       font-size: 9pt;
+       font-weight: bold;
+}
+
+.directory h3 {
+       margin: 0px;
+       margin-top: 1em;
+       font-size: 11pt;
+}
+
+/*
+The following two styles can be used to replace the root node title
+with an image of your choice.  Simply uncomment the next two styles,
+specify the name of your image and be sure to set 'height' to the
+proper pixel height of your image.
+*/
+
+/*
+.directory h3.swap {
+       height: 61px;
+       background-repeat: no-repeat;
+       background-image: url("yourimage.gif");
+}
+.directory h3.swap span {
+       display: none;
+}
+*/
+
+.directory > h3 {
+       margin-top: 0;
+}
+
+.directory p {
+       margin: 0px;
+       white-space: nowrap;
+}
+
+.directory div {
+       display: none;
+       margin: 0px;
+}
+
+.directory img {
+       vertical-align: -30%;
+}
+
+/* these are for tree view when not used as main index */
+
+.directory-alt {
+       font-size: 100%;
+       font-weight: bold;
+}
+
+.directory-alt h3 {
+       margin: 0px;
+       margin-top: 1em;
+       font-size: 11pt;
+}
+
+.directory-alt > h3 {
+       margin-top: 0;
+}
+
+.directory-alt p {
+       margin: 0px;
+       white-space: nowrap;
+}
+
+.directory-alt div {
+       display: none;
+       margin: 0px;
+}
+
+.directory-alt img {
+       vertical-align: -30%;
+}
+
+/* @end */
+
+address {
+       font-style: normal;
+       color: #333;
+}
+
+table.doxtable {
+       border-collapse:collapse;
+}
+
+table.doxtable td, table.doxtable th {
+       border: 1px solid #153788;
+       padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+       background-color: #254798;
+       color: #FFFFFF;
+       font-size: 110%;
+       padding-bottom: 4px;
+       padding-top: 5px;
+       text-align:left;
+}
+
diff --git a/doc/html/doxygen.png b/doc/html/doxygen.png
new file mode 100644 (file)
index 0000000..f0a274b
Binary files /dev/null and b/doc/html/doxygen.png differ
diff --git a/doc/html/files.html b/doc/html/files.html
new file mode 100644 (file)
index 0000000..0eb2fee
--- /dev/null
@@ -0,0 +1,47 @@
+<!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"/>
+<title>json-c: File Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li class="current"><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>File List</h1>Here is a list of all files with brief descriptions:<table>
+  <tr><td class="indexkey"><a class="el" href="arraylist_8h.html">arraylist.h</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="bits_8h.html">bits.h</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="debug_8h.html">debug.h</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="json_8h.html">json.h</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="json__inttypes_8h.html">json_inttypes.h</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="json__object_8h.html">json_object.h</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="json__object__iterator_8h.html">json_object_iterator.h</a></td><td class="indexvalue">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><td class="indexkey"><a class="el" href="json__object__private_8h.html">json_object_private.h</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="json__tokener_8h.html">json_tokener.h</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="json__util_8h.html">json_util.h</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="linkhash_8h.html">linkhash.h</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="printbuf_8h.html">printbuf.h</a></td><td class="indexvalue"></td></tr>
+</table>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/functions.html b/doc/html/functions.html
new file mode 100644 (file)
index 0000000..1cb50a3
--- /dev/null
@@ -0,0 +1,306 @@
+<!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"/>
+<title>json-c: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <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 class="tabs">
+    <ul>
+      <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_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><a href="#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all struct and union fields with links to the structures/unions they belong to:
+
+<h3><a class="anchor" id="index__">- _ -</a></h3><ul>
+<li>_delete
+: <a class="el" href="structjson__object.html#aa3a238f4b671c21fa0578fc37a126c2e">json_object</a>
+</li>
+<li>_pb
+: <a class="el" href="structjson__object.html#afdcaa9e24bce7c86c33cb6f6ae65cb56">json_object</a>
+</li>
+<li>_ref_count
+: <a class="el" href="structjson__object.html#aca9b93573ba6bb8cf66d87c170a575b2">json_object</a>
+</li>
+<li>_to_json_string
+: <a class="el" href="structjson__object.html#a077a02daac4653f91584dd7f47c3d632">json_object</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" 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">- b -</a></h3><ul>
+<li>bpos
+: <a class="el" href="structprintbuf.html#aba980ad7406329e32f557dfa0eb7b1b2">printbuf</a>
+</li>
+<li>buf
+: <a class="el" href="structprintbuf.html#a5d7cf8ac260f1f7c50fecaf9bd7bc651">printbuf</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_c">- c -</a></h3><ul>
+<li>c_array
+: <a class="el" href="unionjson__object_1_1data.html#a4ad6bf2fd6d8718f55850509edfe2e45">json_object::data</a>
+</li>
+<li>c_boolean
+: <a class="el" href="unionjson__object_1_1data.html#a98a3964e5fb0b3a0e9d8786b8facde5c">json_object::data</a>
+</li>
+<li>c_double
+: <a class="el" href="unionjson__object_1_1data.html#a9cc4abdb21302913701ac0c8dc75e55a">json_object::data</a>
+</li>
+<li>c_int64
+: <a class="el" href="unionjson__object_1_1data.html#a7733181cdb631570913e3a2abfd6937c">json_object::data</a>
+</li>
+<li>c_object
+: <a class="el" href="unionjson__object_1_1data.html#a68089c942f154d4df590d8ecb476a69b">json_object::data</a>
+</li>
+<li>c_string
+: <a class="el" href="unionjson__object_1_1data.html#af9cd2e329ad7ab0a86b1b622290a663a">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>
+<li>current
+: <a class="el" href="structjson__tokener__srec.html#a466f192f920368a5a6375aeba1e2757f">json_tokener_srec</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_d">- d -</a></h3><ul>
+<li>deletes
+: <a class="el" href="structlh__table.html#a8348bdd7e61c8d72b402f6a152013fbf">lh_table</a>
+</li>
+<li>depth
+: <a class="el" href="structjson__tokener.html#ae0e5102b44cc1fc680be3e0fb5fff028">json_tokener</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_e">- e -</a></h3><ul>
+<li>entry
+: <a class="el" href="structjson__object__iter.html#a64e326f050826c644c02ed5bcd214faa">json_object_iter</a>
+</li>
+<li>equal_fn
+: <a class="el" href="structlh__table.html#aa646c287a6a46e09da6c7457c981a359">lh_table</a>
+</li>
+<li>err
+: <a class="el" href="structjson__tokener.html#adef37cdc2578d8f8920db14315728cbd">json_tokener</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_f">- f -</a></h3><ul>
+<li>free_fn
+: <a class="el" href="structarray__list.html#ab7989cdde357e5c7819c562c7680ab74">array_list</a>
+, <a class="el" href="structlh__table.html#a30ea5903f4f8126abd6aa489ffe14737">lh_table</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_h">- h -</a></h3><ul>
+<li>hash_fn
+: <a class="el" href="structlh__table.html#a1488d1a4a320b1a9bb2f441859544be1">lh_table</a>
+</li>
+<li>head
+: <a class="el" href="structlh__table.html#aa7d986a3b12a9fa47e349713794c30fb">lh_table</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_i">- i -</a></h3><ul>
+<li>inserts
+: <a class="el" href="structlh__table.html#afd64becd0d2cfbc91a4c9c9a117498b9">lh_table</a>
+</li>
+<li>is_double
+: <a class="el" href="structjson__tokener.html#ad3bf0aa728ea14549d5aa6ca8dcba070">json_tokener</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_k">- k -</a></h3><ul>
+<li>k
+: <a class="el" href="structlh__entry.html#a6b176b3582c9cf553af6431750f5c3b6">lh_entry</a>
+</li>
+<li>key
+: <a class="el" href="structjson__object__iter.html#a0b76228b3a039075e9d84f88fa72ff53">json_object_iter</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_l">- l -</a></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>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_n">- n -</a></h3><ul>
+<li>name
+: <a class="el" href="structlh__table.html#aebf4001cde3746ec8025c1d87d4e6279">lh_table</a>
+</li>
+<li>next
+: <a class="el" href="structlh__entry.html#a7c40c46e72d9a0ba071a8d49d535bc67">lh_entry</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_o">- o -</a></h3><ul>
+<li>o
+: <a class="el" href="structjson__object.html#a33aff83ffea02b934235c4821cca8cf0">json_object</a>
+</li>
+<li>o_type
+: <a class="el" href="structjson__object.html#a28307a4a3fe6cefe27e28fec56b76b3e">json_object</a>
+</li>
+<li>obj
+: <a class="el" href="structjson__tokener__srec.html#ad2bb71affec1da5ba1d9952c3bf2c12a">json_tokener_srec</a>
+</li>
+<li>obj_field_name
+: <a class="el" href="structjson__tokener__srec.html#a99551c172e97ac2e7a3849a50b4f51ca">json_tokener_srec</a>
+</li>
+<li>opaque_
+: <a class="el" href="structjson__object__iterator.html#a69c61c14f5a36b1dc2217e49cd987f47">json_object_iterator</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p">- p -</a></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>
+</ul>
+
+
+<h3><a class="anchor" id="index_q">- q -</a></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">- r -</a></h3><ul>
+<li>resizes
+: <a class="el" href="structlh__table.html#ab4cde49bd9ce7a07daaf99af34ddb67e">lh_table</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_s">- s -</a></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="structprintbuf.html#a12ce6440eaa06a55b96ebdc5a9778dd5">printbuf</a>
+, <a class="el" href="structlh__table.html#ae251575ec2935bcb0e0589ca8e243839">lh_table</a>
+</li>
+<li>st_pos
+: <a class="el" href="structjson__tokener.html#a8eed213c0a37d09c1df66c8567e44471">json_tokener</a>
+</li>
+<li>stack
+: <a class="el" href="structjson__tokener.html#a1499f97597246a18357b874e1805a678">json_tokener</a>
+</li>
+<li>str
+: <a class="el" href="structjson__tokener.html#a9772e2170322a19d8da6ce5d7dc46895">json_tokener</a>
+, <a class="el" href="unionjson__object_1_1data.html#a18a82441c3972195a3bf698bb286634b">json_object::data</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_t">- t -</a></h3><ul>
+<li>table
+: <a class="el" href="structlh__table.html#a4fd9c5aba38791b26ab0ec614a5caf8f">lh_table</a>
+</li>
+<li>tail
+: <a class="el" href="structlh__table.html#a479895e45db2bdf9bf5d173fa4b7e277">lh_table</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_u">- u -</a></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">- v -</a></h3><ul>
+<li>v
+: <a class="el" href="structlh__entry.html#a1b676732ab2ad3eeaedf6ec60a6a0835">lh_entry</a>
+</li>
+<li>val
+: <a class="el" href="structjson__object__iter.html#aaae14a8d17aacddacb0a57234e0a4491">json_object_iter</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html
new file mode 100644 (file)
index 0000000..4a9e620
--- /dev/null
@@ -0,0 +1,306 @@
+<!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"/>
+<title>json-c: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <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 class="tabs">
+    <ul>
+      <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_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><a href="#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index__">- _ -</a></h3><ul>
+<li>_delete
+: <a class="el" href="structjson__object.html#aa3a238f4b671c21fa0578fc37a126c2e">json_object</a>
+</li>
+<li>_pb
+: <a class="el" href="structjson__object.html#afdcaa9e24bce7c86c33cb6f6ae65cb56">json_object</a>
+</li>
+<li>_ref_count
+: <a class="el" href="structjson__object.html#aca9b93573ba6bb8cf66d87c170a575b2">json_object</a>
+</li>
+<li>_to_json_string
+: <a class="el" href="structjson__object.html#a077a02daac4653f91584dd7f47c3d632">json_object</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" 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">- b -</a></h3><ul>
+<li>bpos
+: <a class="el" href="structprintbuf.html#aba980ad7406329e32f557dfa0eb7b1b2">printbuf</a>
+</li>
+<li>buf
+: <a class="el" href="structprintbuf.html#a5d7cf8ac260f1f7c50fecaf9bd7bc651">printbuf</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_c">- c -</a></h3><ul>
+<li>c_array
+: <a class="el" href="unionjson__object_1_1data.html#a4ad6bf2fd6d8718f55850509edfe2e45">json_object::data</a>
+</li>
+<li>c_boolean
+: <a class="el" href="unionjson__object_1_1data.html#a98a3964e5fb0b3a0e9d8786b8facde5c">json_object::data</a>
+</li>
+<li>c_double
+: <a class="el" href="unionjson__object_1_1data.html#a9cc4abdb21302913701ac0c8dc75e55a">json_object::data</a>
+</li>
+<li>c_int64
+: <a class="el" href="unionjson__object_1_1data.html#a7733181cdb631570913e3a2abfd6937c">json_object::data</a>
+</li>
+<li>c_object
+: <a class="el" href="unionjson__object_1_1data.html#a68089c942f154d4df590d8ecb476a69b">json_object::data</a>
+</li>
+<li>c_string
+: <a class="el" href="unionjson__object_1_1data.html#af9cd2e329ad7ab0a86b1b622290a663a">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>
+<li>current
+: <a class="el" href="structjson__tokener__srec.html#a466f192f920368a5a6375aeba1e2757f">json_tokener_srec</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_d">- d -</a></h3><ul>
+<li>deletes
+: <a class="el" href="structlh__table.html#a8348bdd7e61c8d72b402f6a152013fbf">lh_table</a>
+</li>
+<li>depth
+: <a class="el" href="structjson__tokener.html#ae0e5102b44cc1fc680be3e0fb5fff028">json_tokener</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_e">- e -</a></h3><ul>
+<li>entry
+: <a class="el" href="structjson__object__iter.html#a64e326f050826c644c02ed5bcd214faa">json_object_iter</a>
+</li>
+<li>equal_fn
+: <a class="el" href="structlh__table.html#aa646c287a6a46e09da6c7457c981a359">lh_table</a>
+</li>
+<li>err
+: <a class="el" href="structjson__tokener.html#adef37cdc2578d8f8920db14315728cbd">json_tokener</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_f">- f -</a></h3><ul>
+<li>free_fn
+: <a class="el" href="structarray__list.html#ab7989cdde357e5c7819c562c7680ab74">array_list</a>
+, <a class="el" href="structlh__table.html#a30ea5903f4f8126abd6aa489ffe14737">lh_table</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_h">- h -</a></h3><ul>
+<li>hash_fn
+: <a class="el" href="structlh__table.html#a1488d1a4a320b1a9bb2f441859544be1">lh_table</a>
+</li>
+<li>head
+: <a class="el" href="structlh__table.html#aa7d986a3b12a9fa47e349713794c30fb">lh_table</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_i">- i -</a></h3><ul>
+<li>inserts
+: <a class="el" href="structlh__table.html#afd64becd0d2cfbc91a4c9c9a117498b9">lh_table</a>
+</li>
+<li>is_double
+: <a class="el" href="structjson__tokener.html#ad3bf0aa728ea14549d5aa6ca8dcba070">json_tokener</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_k">- k -</a></h3><ul>
+<li>k
+: <a class="el" href="structlh__entry.html#a6b176b3582c9cf553af6431750f5c3b6">lh_entry</a>
+</li>
+<li>key
+: <a class="el" href="structjson__object__iter.html#a0b76228b3a039075e9d84f88fa72ff53">json_object_iter</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_l">- l -</a></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>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_n">- n -</a></h3><ul>
+<li>name
+: <a class="el" href="structlh__table.html#aebf4001cde3746ec8025c1d87d4e6279">lh_table</a>
+</li>
+<li>next
+: <a class="el" href="structlh__entry.html#a7c40c46e72d9a0ba071a8d49d535bc67">lh_entry</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_o">- o -</a></h3><ul>
+<li>o
+: <a class="el" href="structjson__object.html#a33aff83ffea02b934235c4821cca8cf0">json_object</a>
+</li>
+<li>o_type
+: <a class="el" href="structjson__object.html#a28307a4a3fe6cefe27e28fec56b76b3e">json_object</a>
+</li>
+<li>obj
+: <a class="el" href="structjson__tokener__srec.html#ad2bb71affec1da5ba1d9952c3bf2c12a">json_tokener_srec</a>
+</li>
+<li>obj_field_name
+: <a class="el" href="structjson__tokener__srec.html#a99551c172e97ac2e7a3849a50b4f51ca">json_tokener_srec</a>
+</li>
+<li>opaque_
+: <a class="el" href="structjson__object__iterator.html#a69c61c14f5a36b1dc2217e49cd987f47">json_object_iterator</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p">- p -</a></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>
+</ul>
+
+
+<h3><a class="anchor" id="index_q">- q -</a></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">- r -</a></h3><ul>
+<li>resizes
+: <a class="el" href="structlh__table.html#ab4cde49bd9ce7a07daaf99af34ddb67e">lh_table</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_s">- s -</a></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="structprintbuf.html#a12ce6440eaa06a55b96ebdc5a9778dd5">printbuf</a>
+, <a class="el" href="structlh__table.html#ae251575ec2935bcb0e0589ca8e243839">lh_table</a>
+</li>
+<li>st_pos
+: <a class="el" href="structjson__tokener.html#a8eed213c0a37d09c1df66c8567e44471">json_tokener</a>
+</li>
+<li>stack
+: <a class="el" href="structjson__tokener.html#a1499f97597246a18357b874e1805a678">json_tokener</a>
+</li>
+<li>str
+: <a class="el" href="structjson__tokener.html#a9772e2170322a19d8da6ce5d7dc46895">json_tokener</a>
+, <a class="el" href="unionjson__object_1_1data.html#a18a82441c3972195a3bf698bb286634b">json_object::data</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_t">- t -</a></h3><ul>
+<li>table
+: <a class="el" href="structlh__table.html#a4fd9c5aba38791b26ab0ec614a5caf8f">lh_table</a>
+</li>
+<li>tail
+: <a class="el" href="structlh__table.html#a479895e45db2bdf9bf5d173fa4b7e277">lh_table</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_u">- u -</a></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">- v -</a></h3><ul>
+<li>v
+: <a class="el" href="structlh__entry.html#a1b676732ab2ad3eeaedf6ec60a6a0835">lh_entry</a>
+</li>
+<li>val
+: <a class="el" href="structjson__object__iter.html#aaae14a8d17aacddacb0a57234e0a4491">json_object_iter</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/globals.html b/doc/html/globals.html
new file mode 100644 (file)
index 0000000..6400b5e
--- /dev/null
@@ -0,0 +1,657 @@
+<!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"/>
+<title>json-c: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <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>Defines</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <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><a href="#index_s"><span>s</span></a></li>
+      <li><a href="#index_t"><span>t</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+
+<h3><a class="anchor" id="index__">- _ -</a></h3><ul>
+<li>__STRING
+: <a class="el" href="debug_8h.html#a375c4dc9f0fb338999de81aab826f9d6">debug.h</a>
+</li>
+</ul>
+
+
+<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>
+
+
+<h3><a class="anchor" id="index_e">- e -</a></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>
+
+
+<h3><a class="anchor" id="index_f">- f -</a></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">- h -</a></h3><ul>
+<li>hexdigit
+: <a class="el" href="bits_8h.html#a1cf38b22d3a118ad48d9282c32c048aa">bits.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_i">- i -</a></h3><ul>
+<li>is_error
+: <a class="el" href="bits_8h.html#a4a887e5fb7cde221bcab9c6f39d93fc1">bits.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_j">- j -</a></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_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_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__private_8h.html#ac96402e72ae5c12d690ec95ed441ec70">json_object_private.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_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()
+: <a class="el" href="json__object_8h.html#ac11730ad909d1f9eb077d1ce9ff8b153">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_put()
+: <a class="el" href="json__object_8h.html#accc34b38e15e46357d64a0beed3d0150">json_object.h</a>
+</li>
+<li>json_object_to_file()
+: <a class="el" href="json__util_8h.html#a00f5c43b3035faa4e4f3e55cf59707ee">json_util.h</a>
+</li>
+<li>json_object_to_file_ext()
+: <a class="el" href="json__util_8h.html#a1ddcf96dd176ed447ce4df383190cfa8">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__private_8h.html#a778fe57040398137cf9ccf9f2dd53282">json_object_private.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_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_errors
+: <a class="el" href="json__tokener_8h.html#a6ede8ee7a4ec1fed68d10ea77294c966">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_MAX_DEPTH
+: <a class="el" href="json__tokener_8h.html#ac4299cf4ed799b028e61cf7b2b0d5f1f">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_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_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_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_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_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_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#aba5eff84f8638d22f50403175f270c96">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>
+
+
+<h3><a class="anchor" id="index_l">- l -</a></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_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_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>
+
+
+<h3><a class="anchor" id="index_m">- m -</a></h3><ul>
+<li>MC_ABORT
+: <a class="el" href="debug_8h.html#a25591d3d4754c0c6d1f2b5463fb4977e">debug.h</a>
+</li>
+<li>mc_abort()
+: <a class="el" href="debug_8h.html#a44913dbc4f1abf6614d42b22b941c092">debug.h</a>
+</li>
+<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_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#af65a73617b71476020a005b20bf02726">debug.h</a>
+</li>
+<li>MC_SET_DEBUG
+: <a class="el" href="debug_8h.html#a50f21a239fa040a10ad4cfdb4278b02b">debug.h</a>
+</li>
+<li>mc_set_syslog()
+: <a class="el" href="debug_8h.html#aadb888da410116384e75a00db30da705">debug.h</a>
+</li>
+<li>MC_SET_SYSLOG
+: <a class="el" href="debug_8h.html#acf1e895cb5eb7f334cbe51901e6bb918">debug.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p">- p -</a></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>
+
+
+<h3><a class="anchor" id="index_s">- s -</a></h3><ul>
+<li>sprintbuf()
+: <a class="el" href="printbuf_8h.html#adf6214db6c8ce994c7f7f1180863c8a4">printbuf.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_t">- t -</a></h3><ul>
+<li>TRUE
+: <a class="el" href="json__object_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d">json_object.h</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/globals_defs.html b/doc/html/globals_defs.html
new file mode 100644 (file)
index 0000000..4855185
--- /dev/null
@@ -0,0 +1,205 @@
+<!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"/>
+<title>json-c: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <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>Defines</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <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><a href="#index_t"><span>t</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index__">- _ -</a></h3><ul>
+<li>__STRING
+: <a class="el" href="debug_8h.html#a375c4dc9f0fb338999de81aab826f9d6">debug.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" 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">- e -</a></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>
+
+
+<h3><a class="anchor" id="index_f">- f -</a></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">- h -</a></h3><ul>
+<li>hexdigit
+: <a class="el" href="bits_8h.html#a1cf38b22d3a118ad48d9282c32c048aa">bits.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_i">- i -</a></h3><ul>
+<li>is_error
+: <a class="el" href="bits_8h.html#a4a887e5fb7cde221bcab9c6f39d93fc1">bits.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_j">- j -</a></h3><ul>
+<li>JASSERT
+: <a class="el" href="debug_8h.html#a8ca29550d5b1b73948f4a7bce53f2385">debug.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_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>
+</li>
+<li>json_min
+: <a class="el" href="bits_8h.html#a3dde282dc23d0eaa3c4840df8dc262d4">bits.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_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_TOKENER_MAX_DEPTH
+: <a class="el" href="json__tokener_8h.html#ac4299cf4ed799b028e61cf7b2b0d5f1f">json_tokener.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_l">- l -</a></h3><ul>
+<li>LH_EMPTY
+: <a class="el" href="linkhash_8h.html#a93fad7f8ae44575dc89c9567859972d2">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_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>
+</ul>
+
+
+<h3><a class="anchor" id="index_m">- m -</a></h3><ul>
+<li>MC_ABORT
+: <a class="el" href="debug_8h.html#a25591d3d4754c0c6d1f2b5463fb4977e">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#acb272a4b4444b69cd995236f167f90ba">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_SYSLOG
+: <a class="el" href="debug_8h.html#acf1e895cb5eb7f334cbe51901e6bb918">debug.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p">- p -</a></h3><ul>
+<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>
+</ul>
+
+
+<h3><a class="anchor" id="index_t">- t -</a></h3><ul>
+<li>TRUE
+: <a class="el" href="json__object_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d">json_object.h</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/globals_enum.html b/doc/html/globals_enum.html
new file mode 100644 (file)
index 0000000..4adee68
--- /dev/null
@@ -0,0 +1,55 @@
+<!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"/>
+<title>json-c: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <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>Defines</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;<ul>
+<li>json_tokener_error
+: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">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_type
+: <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_object.h</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/globals_eval.html b/doc/html/globals_eval.html
new file mode 100644 (file)
index 0000000..4e90ad5
--- /dev/null
@@ -0,0 +1,182 @@
+<!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"/>
+<title>json-c: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <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>Defines</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="#index_j"><span>j</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_j">- j -</a></h3><ul>
+<li>json_tokener_continue
+: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a9b26e920ca765df91c84e999561d8fb0">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_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_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_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_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_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_success
+: <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59afe2fa9bde03155019b2df30f66a5fcd0">json_tokener.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>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/globals_func.html b/doc/html/globals_func.html
new file mode 100644 (file)
index 0000000..add6cd8
--- /dev/null
@@ -0,0 +1,339 @@
+<!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"/>
+<title>json-c: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <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>Defines</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <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>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" 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_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>
+</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>
+
+
+<h3><a class="anchor" id="index_j">- j -</a></h3><ul>
+<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_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_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_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_get()
+: <a class="el" href="json__object_8h.html#ac11730ad909d1f9eb077d1ce9ff8b153">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_put()
+: <a class="el" href="json__object_8h.html#accc34b38e15e46357d64a0beed3d0150">json_object.h</a>
+</li>
+<li>json_object_to_file()
+: <a class="el" href="json__util_8h.html#a00f5c43b3035faa4e4f3e55cf59707ee">json_util.h</a>
+</li>
+<li>json_object_to_file_ext()
+: <a class="el" href="json__util_8h.html#a1ddcf96dd176ed447ce4df383190cfa8">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_parse_int64()
+: <a class="el" href="json__util_8h.html#a9bb9882ef2859ca2c1ee17805679bc25">json_util.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>
+</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_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_type_to_name()
+: <a class="el" href="json__util_8h.html#a74031a1b948dc9fed3f367ea6ce78389">json_util.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_l">- l -</a></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>
+</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>
+</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_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_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>
+
+
+<h3><a class="anchor" id="index_m">- m -</a></h3><ul>
+<li>mc_abort()
+: <a class="el" href="debug_8h.html#a44913dbc4f1abf6614d42b22b941c092">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#abf22ea3a331c7ff21c23da91a07c7cb2">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_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#aadb888da410116384e75a00db30da705">debug.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p">- p -</a></h3><ul>
+<li>printbuf_free()
+: <a class="el" href="printbuf_8h.html#ab525221c767ac65c58ddeea8a655a4e8">printbuf.h</a>
+</li>
+<li>printbuf_memappend()
+: <a class="el" href="printbuf_8h.html#a22f09779a19db59a83e7cb8c2ce4c75f">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>
+
+
+<h3><a class="anchor" id="index_s">- s -</a></h3><ul>
+<li>sprintbuf()
+: <a class="el" href="printbuf_8h.html#adf6214db6c8ce994c7f7f1180863c8a4">printbuf.h</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/globals_type.html b/doc/html/globals_type.html
new file mode 100644 (file)
index 0000000..dc1aefc
--- /dev/null
@@ -0,0 +1,88 @@
+<!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"/>
+<title>json-c: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <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>Defines</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;<ul>
+<li>array_list
+: <a class="el" href="json__object_8h.html#a6d6d32d8b026ea2025df519b9e90f44a">json_object.h</a>
+</li>
+<li>array_list_free_fn
+: <a class="el" href="arraylist_8h.html#aad83e4ed3c8ea274e6f18459276d774b">arraylist.h</a>
+</li>
+<li>json_bool
+: <a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">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_delete_fn
+: <a class="el" href="json__object__private_8h.html#ac96402e72ae5c12d690ec95ed441ec70">json_object_private.h</a>
+</li>
+<li>json_object_iter
+: <a class="el" href="json__object_8h.html#af88126730e765f2068968f4b16fd074f">json_object.h</a>
+</li>
+<li>json_object_to_json_string_fn
+: <a class="el" href="json__object__private_8h.html#a778fe57040398137cf9ccf9f2dd53282">json_object_private.h</a>
+</li>
+<li>json_tokener
+: <a class="el" href="json__object_8h.html#a4dd5e5b65aee7f376f529f86b210ff49">json_object.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#a671553d0ee3c2a123190ba0f8ed2b635">linkhash.h</a>
+</li>
+<li>lh_equal_fn
+: <a class="el" href="linkhash_8h.html#a91fd85fc81b0c7c83c62f00e84729091">linkhash.h</a>
+</li>
+<li>lh_hash_fn
+: <a class="el" href="linkhash_8h.html#a38bae27995dcfb6ee3fb109a9be229b2">linkhash.h</a>
+</li>
+<li>lh_table
+: <a class="el" href="json__object_8h.html#a766e90057496fc6712d6be0da180a21f">json_object.h</a>
+</li>
+<li>printbuf
+: <a class="el" href="json__object_8h.html#ace274df280df67463ff417b1b3392395">json_object.h</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/globals_vars.html b/doc/html/globals_vars.html
new file mode 100644 (file)
index 0000000..f35f9c5
--- /dev/null
@@ -0,0 +1,55 @@
+<!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"/>
+<title>json-c: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li class="current"><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <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>Defines</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;<ul>
+<li>json_hex_chars
+: <a class="el" href="json__object_8h.html#a20dbe4913551cefa6b4b0a77fd4397c4">json_object.h</a>
+</li>
+<li>json_number_chars
+: <a class="el" href="json__object_8h.html#a27427f89f2fc995639e366635fbe58ac">json_object.h</a>
+</li>
+<li>json_tokener_errors
+: <a class="el" href="json__tokener_8h.html#a6ede8ee7a4ec1fed68d10ea77294c966">json_tokener.h</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/index.html b/doc/html/index.html
new file mode 100644 (file)
index 0000000..5baf1b7
--- /dev/null
@@ -0,0 +1,27 @@
+<!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"/>
+<title>json-c: Main Page</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li class="current"><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>json-c Documentation</h1><h3 class="version">0.10 </h3></div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:46 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/json_8h.html b/doc/html/json_8h.html
new file mode 100644 (file)
index 0000000..3b531d2
--- /dev/null
@@ -0,0 +1,35 @@
+<!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"/>
+<title>json-c: json.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>json.h File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
+</table>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/json__inttypes_8h.html b/doc/html/json__inttypes_8h.html
new file mode 100644 (file)
index 0000000..980a119
--- /dev/null
@@ -0,0 +1,35 @@
+<!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"/>
+<title>json-c: json_inttypes.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>json_inttypes.h File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
+</table>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/json__object_8h.html b/doc/html/json__object_8h.html
new file mode 100644 (file)
index 0000000..d417ba1
--- /dev/null
@@ -0,0 +1,1354 @@
+<!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"/>
+<title>json-c: json_object.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>json_object.h File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Structures</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object__iter.html">json_object_iter</a></td></tr>
+<tr><td colspan="2"><h2>Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a268a63dd1b2e6d81559e268a4529e9bf">JSON_OBJECT_DEF_HASH_ENTRIES</a>&nbsp;&nbsp;&nbsp;16</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a3294cb92765cdeb497cfd346644d1059">JSON_C_TO_STRING_PLAIN</a>&nbsp;&nbsp;&nbsp;0</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#aa821746c8668e6ad62bed90ec9e00103">JSON_C_TO_STRING_SPACED</a>&nbsp;&nbsp;&nbsp;(1&lt;&lt;0)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a2025bc677c35f130e117dfda5bf1ef73">JSON_C_TO_STRING_PRETTY</a>&nbsp;&nbsp;&nbsp;(1&lt;&lt;1)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#aa93f0eb578d23995850d61f7d61c55c1">FALSE</a>&nbsp;&nbsp;&nbsp;((<a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>)0)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>&nbsp;&nbsp;&nbsp;((<a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>)1)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</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><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a71f07006c12d78f7bbf4cb716a5af3a6">json_object_object_foreachC</a>(obj, iter)&nbsp;&nbsp;&nbsp;for(iter.entry = json_object_get_object(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><td colspan="2"><h2>Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structprintbuf.html">printbuf</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ace274df280df67463ff417b1b3392395">printbuf</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structlh__table.html">lh_table</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a766e90057496fc6712d6be0da180a21f">lh_table</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structarray__list.html">array_list</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a6d6d32d8b026ea2025df519b9e90f44a">array_list</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structjson__object.html">json_object</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#af27907ced0f5a43409ad96430fe0f914">json_object</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structjson__object__iter.html">json_object_iter</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#af88126730e765f2068968f4b16fd074f">json_object_iter</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structjson__tokener.html">json_tokener</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a4dd5e5b65aee7f376f529f86b210ff49">json_tokener</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#aba5eff84f8638d22f50403175f270c96">json_type</a></td></tr>
+<tr><td colspan="2"><h2>Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a> { <br/>
+&nbsp;&nbsp;<a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06ca127e62d156e13517471fcde3378979c1">json_type_null</a>, 
+<a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06ca5d15299e90dbb9935ff6d3e2c22a285c">json_type_boolean</a>, 
+<a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06cac6ac2d9a16577d00210fea64d16b47cd">json_type_double</a>, 
+<a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06ca7bf325c213b43c5f970ae2d4443ab956">json_type_int</a>, 
+<br/>
+&nbsp;&nbsp;<a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06cac966c8008f0b2c07da59ee8a60ad440f">json_type_object</a>, 
+<a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06cae536c8c9da4648e6b9348abddde6113c">json_type_array</a>, 
+<a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06cac9f56e57c09245522d764015a054faa6">json_type_string</a>
+<br/>
+ }</td></tr>
+<tr><td colspan="2"><h2>Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</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><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#accc34b38e15e46357d64a0beed3d0150">json_object_put</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</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><td class="memItemLeft" align="right" valign="top">enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a>&nbsp;</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><td class="memItemLeft" align="right" valign="top">const char *&nbsp;</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><td class="memItemLeft" align="right" valign="top">const char *&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#af0ed3555604f39ac74b5e28bc5b1f82c">json_object_new_object</a> (void)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__table.html">lh_table</a> *&nbsp;</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><td class="memItemLeft" align="right" valign="top">void&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#ac11730ad909d1f9eb077d1ce9ff8b153">json_object_object_get</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj, const char *key)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>&nbsp;</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><td class="memItemLeft" align="right" valign="top">void&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a9b5af06e9a99e16c6d9b6459a685ea3f">json_object_new_array</a> (void)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structarray__list.html">array_list</a> *&nbsp;</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><td class="memItemLeft" align="right" valign="top">int&nbsp;</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><td class="memItemLeft" align="right" valign="top">void&nbsp;</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><td class="memItemLeft" align="right" valign="top">int&nbsp;</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><td class="memItemLeft" align="right" valign="top">int&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</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><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</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><td class="memItemLeft" align="right" valign="top">int32_t&nbsp;</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><td class="memItemLeft" align="right" valign="top">int64_t&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</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><td class="memItemLeft" align="right" valign="top">double&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</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><td class="memItemLeft" align="right" valign="top">const char *&nbsp;</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><td class="memItemLeft" align="right" valign="top">int&nbsp;</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><td colspan="2"><h2>Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a27427f89f2fc995639e366635fbe58ac">json_number_chars</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object_8h.html#a20dbe4913551cefa6b4b0a77fd4397c4">json_hex_chars</a></td></tr>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="aa93f0eb578d23995850d61f7d61c55c1"></a><!-- doxytag: member="json_object.h::FALSE" ref="aa93f0eb578d23995850d61f7d61c55c1" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define FALSE&nbsp;&nbsp;&nbsp;((<a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>)0)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3294cb92765cdeb497cfd346644d1059"></a><!-- doxytag: member="json_object.h::JSON_C_TO_STRING_PLAIN" ref="a3294cb92765cdeb497cfd346644d1059" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_TO_STRING_PLAIN&nbsp;&nbsp;&nbsp;0</td>
+        </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#a1ddcf96dd176ed447ce4df383190cfa8">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><!-- doxytag: member="json_object.h::JSON_C_TO_STRING_PRETTY" ref="a2025bc677c35f130e117dfda5bf1ef73" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_TO_STRING_PRETTY&nbsp;&nbsp;&nbsp;(1&lt;&lt;1)</td>
+        </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#a1ddcf96dd176ed447ce4df383190cfa8">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><!-- doxytag: member="json_object.h::JSON_C_TO_STRING_SPACED" ref="aa821746c8668e6ad62bed90ec9e00103" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_C_TO_STRING_SPACED&nbsp;&nbsp;&nbsp;(1&lt;&lt;0)</td>
+        </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#a1ddcf96dd176ed447ce4df383190cfa8">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 class="anchor" id="a268a63dd1b2e6d81559e268a4529e9bf"></a><!-- doxytag: member="json_object.h::JSON_OBJECT_DEF_HASH_ENTRIES" ref="a268a63dd1b2e6d81559e268a4529e9bf" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_OBJECT_DEF_HASH_ENTRIES&nbsp;&nbsp;&nbsp;16</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acf5f514a9e0061c10fc08055762639ee"></a><!-- doxytag: member="json_object.h::json_object_object_foreach" ref="acf5f514a9e0061c10fc08055762639ee" args="(obj, key, val)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define json_object_object_foreach</td>
+          <td>(</td>
+          <td class="paramtype">obj, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">key, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">val&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<b>Value:</b><div class="fragment"><pre class="fragment"><span class="keywordtype">char</span> *key; <span class="keyword">struct </span><a class="code" href="structjson__object.html">json_object</a> *val; <span class="keyword">struct </span><a class="code" href="structlh__entry.html">lh_entry</a> *entry; \
+ <span class="keywordflow">for</span>(entry = <a class="code" href="json__object_8h.html#a9840421d6b45a7d00a42e13e379b54b5">json_object_get_object</a>(obj)-&gt;head; (entry ? (key = (<span class="keywordtype">char</span>*)entry-&gt;<a class="code" href="structlh__entry.html#a6b176b3582c9cf553af6431750f5c3b6">k</a>, val = (<span class="keyword">struct</span> <a class="code" href="structjson__object.html">json_object</a>*)entry-&gt;<a class="code" href="structlh__entry.html#a1b676732ab2ad3eeaedf6ec60a6a0835">v</a>, entry) : 0); entry = entry-&gt;<a class="code" href="structlh__entry.html#a7c40c46e72d9a0ba071a8d49d535bc67">next</a>)
+</pre></div><p>Iterate through all keys and values of an object </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>key</em>&nbsp;</td><td>the local name for the char* key variable defined in the body </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>val</em>&nbsp;</td><td>the local name for the json_object* object variable defined in the body </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a71f07006c12d78f7bbf4cb716a5af3a6"></a><!-- doxytag: member="json_object.h::json_object_object_foreachC" ref="a71f07006c12d78f7bbf4cb716a5af3a6" args="(obj, iter)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define json_object_object_foreachC</td>
+          <td>(</td>
+          <td class="paramtype">obj, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">iter&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;for(iter.entry = json_object_get_object(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>
+      </table>
+</div>
+<div class="memdoc">
+<p>Iterate through all keys and values of an object (ANSI C Safe) </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>iter</em>&nbsp;</td><td>the object iterator </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="aa8cecfc5c5c054d2875c03e77b7be15d"></a><!-- doxytag: member="json_object.h::TRUE" ref="aa8cecfc5c5c054d2875c03e77b7be15d" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define TRUE&nbsp;&nbsp;&nbsp;((<a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>)1)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Typedef Documentation</h2>
+<a class="anchor" id="a6d6d32d8b026ea2025df519b9e90f44a"></a><!-- doxytag: member="json_object.h::array_list" ref="a6d6d32d8b026ea2025df519b9e90f44a" args="" -->
+<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>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a81f02022906fafc71eb9197049f07f73"></a><!-- doxytag: member="json_object.h::json_bool" ref="a81f02022906fafc71eb9197049f07f73" args="" -->
+<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>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af27907ced0f5a43409ad96430fe0f914"></a><!-- doxytag: member="json_object.h::json_object" ref="af27907ced0f5a43409ad96430fe0f914" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structjson__object.html">json_object</a> <a class="el" href="structjson__object.html">json_object</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af88126730e765f2068968f4b16fd074f"></a><!-- doxytag: member="json_object.h::json_object_iter" ref="af88126730e765f2068968f4b16fd074f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structjson__object__iter.html">json_object_iter</a> <a class="el" href="structjson__object__iter.html">json_object_iter</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4dd5e5b65aee7f376f529f86b210ff49"></a><!-- doxytag: member="json_object.h::json_tokener" ref="a4dd5e5b65aee7f376f529f86b210ff49" args="" -->
+<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">
+
+</div>
+</div>
+<a class="anchor" id="aba5eff84f8638d22f50403175f270c96"></a><!-- doxytag: member="json_object.h::json_type" ref="aba5eff84f8638d22f50403175f270c96" args="" -->
+<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>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a766e90057496fc6712d6be0da180a21f"></a><!-- doxytag: member="json_object.h::lh_table" ref="a766e90057496fc6712d6be0da180a21f" args="" -->
+<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>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ace274df280df67463ff417b1b3392395"></a><!-- doxytag: member="json_object.h::printbuf" ref="ace274df280df67463ff417b1b3392395" args="" -->
+<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>
+<hr/><h2>Enumeration Type Documentation</h2>
+<a class="anchor" id="ac75c61993722a9b8aaa44704072ec06c"></a><!-- doxytag: member="json_object.h::json_type" ref="ac75c61993722a9b8aaa44704072ec06c" args="" -->
+<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>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="ac75c61993722a9b8aaa44704072ec06ca127e62d156e13517471fcde3378979c1"></a><!-- doxytag: member="json_type_null" ref="ac75c61993722a9b8aaa44704072ec06ca127e62d156e13517471fcde3378979c1" args="" -->json_type_null</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="ac75c61993722a9b8aaa44704072ec06ca5d15299e90dbb9935ff6d3e2c22a285c"></a><!-- doxytag: member="json_type_boolean" ref="ac75c61993722a9b8aaa44704072ec06ca5d15299e90dbb9935ff6d3e2c22a285c" args="" -->json_type_boolean</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="ac75c61993722a9b8aaa44704072ec06cac6ac2d9a16577d00210fea64d16b47cd"></a><!-- doxytag: member="json_type_double" ref="ac75c61993722a9b8aaa44704072ec06cac6ac2d9a16577d00210fea64d16b47cd" args="" -->json_type_double</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="ac75c61993722a9b8aaa44704072ec06ca7bf325c213b43c5f970ae2d4443ab956"></a><!-- doxytag: member="json_type_int" ref="ac75c61993722a9b8aaa44704072ec06ca7bf325c213b43c5f970ae2d4443ab956" args="" -->json_type_int</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="ac75c61993722a9b8aaa44704072ec06cac966c8008f0b2c07da59ee8a60ad440f"></a><!-- doxytag: member="json_type_object" ref="ac75c61993722a9b8aaa44704072ec06cac966c8008f0b2c07da59ee8a60ad440f" args="" -->json_type_object</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="ac75c61993722a9b8aaa44704072ec06cae536c8c9da4648e6b9348abddde6113c"></a><!-- doxytag: member="json_type_array" ref="ac75c61993722a9b8aaa44704072ec06cae536c8c9da4648e6b9348abddde6113c" args="" -->json_type_array</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="ac75c61993722a9b8aaa44704072ec06cac9f56e57c09245522d764015a054faa6"></a><!-- doxytag: member="json_type_string" ref="ac75c61993722a9b8aaa44704072ec06cac9f56e57c09245522d764015a054faa6" args="" -->json_type_string</em>&nbsp;</td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="acc89c0f58947d499e2868ac8b62bed49"></a><!-- doxytag: member="json_object.h::json_object_array_add" ref="acc89c0f58947d499e2868ac8b62bed49" args="(struct json_object *obj, struct json_object *val)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int json_object_array_add </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</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> *&nbsp;</td>
+          <td class="paramname"> <em>val</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <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 *not* be incremented. This is to make adding fields to objects in code more compact. If you want to retain a reference to an added object you must wrap the passed object with json_object_get</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>val</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> to be added </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a5c9120a6d644ea12a61e2ec8520130c6"></a><!-- doxytag: member="json_object.h::json_object_array_get_idx" ref="a5c9120a6d644ea12a61e2ec8520130c6" args="(struct json_object *obj, int idx)" -->
+<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>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>idx</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Get the element at specificed index of the array (a <a class="el" href="structjson__object.html">json_object</a> of type json_type_array) </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>idx</em>&nbsp;</td><td>the index to get the element at </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the <a class="el" href="structjson__object.html">json_object</a> at the specified index (or NULL) </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a2e62d4b19de8f297595f3b4aaa0ec453"></a><!-- doxytag: member="json_object.h::json_object_array_length" ref="a2e62d4b19de8f297595f3b4aaa0ec453" args="(struct json_object *obj)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int json_object_array_length </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Get the length of a <a class="el" href="structjson__object.html">json_object</a> of type json_type_array </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>an int </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a2d19d21b495e1e0d3f711093d97a5104"></a><!-- doxytag: member="json_object.h::json_object_array_put_idx" ref="a2d19d21b495e1e0d3f711093d97a5104" args="(struct json_object *obj, int idx, struct json_object *val)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int json_object_array_put_idx </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>idx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>val</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Insert or replace an element at 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 *not* be incremented. This is to make adding fields to objects in code more compact. If you want to retain a reference to an added object you must wrap the passed object with json_object_get</p>
+<p>The reference count of a replaced object will be decremented.</p>
+<p>The array size will be automatically be expanded to the size of the index if the index is larger than the current size.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>idx</em>&nbsp;</td><td>the index to insert the element at </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>val</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> to be added </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="aa1b05eeaa9c92f079facece87d6a0149"></a><!-- doxytag: member="json_object.h::json_object_array_sort" ref="aa1b05eeaa9c92f079facece87d6a0149" args="(struct json_object *jso, int(*sort_fn)(const void *, const void *))" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void json_object_array_sort </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>jso</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int(*)(const void *, const void *)&nbsp;</td>
+          <td class="paramname"> <em>sort_fn</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></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>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>sort_fn</em>&nbsp;</td><td>a sorting function </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="acc3628d97c6308dc967006e4268c4e7f"></a><!-- doxytag: member="json_object.h::json_object_get" ref="acc3628d97c6308dc967006e4268c4e7f" args="(struct json_object *obj)" -->
+<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>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></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><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="aba4e8df5e00bdc91a89bfb775e04ed70"></a><!-- doxytag: member="json_object.h::json_object_get_array" ref="aba4e8df5e00bdc91a89bfb775e04ed70" args="(struct json_object *obj)" -->
+<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>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></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><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>an arraylist </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a3be3153ae5158ed24a49d74fbf14149f"></a><!-- doxytag: member="json_object.h::json_object_get_boolean" ref="a3be3153ae5158ed24a49d74fbf14149f" args="(struct json_object *obj)" -->
+<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>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</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><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a json_bool </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a9cf586fba906a597a121423045cb2a45"></a><!-- doxytag: member="json_object.h::json_object_get_double" ref="a9cf586fba906a597a121423045cb2a45" args="(struct json_object *obj)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">double json_object_get_double </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Get the double floating point value of a <a class="el" href="structjson__object.html">json_object</a></p>
+<p>The type is coerced to a double if the passed object is not a double. integer objects will return their double conversion. Strings will be parsed as a double. If no conversion exists then 0.0 is returned and errno is set to EINVAL. null is equivalent to 0 (no error values set)</p>
+<p>If the value is too big to fit in a double, then the value is set to the closest infinity with errno set to ERANGE. If strings cannot be converted to their double value, then EINVAL is set &amp; NaN is returned.</p>
+<p>Arrays of length 0 are interpreted as 0 (with no error flags set). Arrays of length 1 are effectively cast to the equivalent object and converted using the above rules. All other arrays set the error to EINVAL &amp; return NaN.</p>
+<p>NOTE: Set errno to 0 directly before a call to this function to determine whether or not conversion was successful (it does not clear the value for you).</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a double floating point number </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="ae6cab7d4c7c707b9053035a6405d3891"></a><!-- doxytag: member="json_object.h::json_object_get_int" ref="ae6cab7d4c7c707b9053035a6405d3891" args="(struct json_object *obj)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int32_t json_object_get_int </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Get the int value of a <a class="el" href="structjson__object.html">json_object</a></p>
+<p>The type is coerced to a int if the passed object is not a int. double objects will return their integer conversion. Strings will be parsed as an integer. If no conversion exists then 0 is returned and errno is set to EINVAL. null is equivalent to 0 (no error values set)</p>
+<p>Note that integers are stored internally as 64-bit values. If the value of too big or too small to fit into 32-bit, INT32_MAX or INT32_MIN are returned, respectively.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>an int </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a3493894ebd226249118582e640af6944"></a><!-- doxytag: member="json_object.h::json_object_get_int64" ref="a3493894ebd226249118582e640af6944" args="(struct json_object *obj)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int64_t json_object_get_int64 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Get the int value of a <a class="el" href="structjson__object.html">json_object</a></p>
+<p>The type is coerced to a int64 if the passed object is not a int64. double objects will return their int64 conversion. Strings will be parsed as an int64. If no conversion exists then 0 is returned.</p>
+<p>NOTE: Set errno to 0 directly before a call to this function to determine whether or not conversion was successful (it does not clear the value for you).</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>an int64 </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a9840421d6b45a7d00a42e13e379b54b5"></a><!-- doxytag: member="json_object.h::json_object_get_object" ref="a9840421d6b45a7d00a42e13e379b54b5" args="(struct json_object *obj)" -->
+<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>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Get the hashtable of a <a class="el" href="structjson__object.html">json_object</a> of type json_type_object </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a linkhash </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="ad24f1c4c22b2a7d33e7b562c01f2ca65"></a><!-- doxytag: member="json_object.h::json_object_get_string" ref="ad24f1c4c22b2a7d33e7b562c01f2ca65" args="(struct json_object *obj)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* json_object_get_string </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></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>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><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a string </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="ad821384d0d8515d5ed4eec44d7101772"></a><!-- doxytag: member="json_object.h::json_object_get_string_len" ref="ad821384d0d8515d5ed4eec44d7101772" args="(struct json_object *obj)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int json_object_get_string_len </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Get the string length 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 zero will be returned.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>int </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="adc5e998b4897b6e450bd0975a58d2f72"></a><!-- doxytag: member="json_object.h::json_object_get_type" ref="adc5e998b4897b6e450bd0975a58d2f72" args="(struct json_object *obj)" -->
+<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>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Get the type of the <a class="el" href="structjson__object.html">json_object</a>. See also <a class="el" href="json__util_8h.html#a74031a1b948dc9fed3f367ea6ce78389">json_type_to_name()</a> to turn this into a string suitable, for instance, for logging.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></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><!-- doxytag: member="json_object.h::json_object_is_type" ref="ab6dc8b19f8da310e78f402f83d6ae6c5" args="(struct json_object *obj, enum json_type type)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int json_object_is_type </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</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>&nbsp;</td>
+          <td class="paramname"> <em>type</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Check if the <a class="el" href="structjson__object.html">json_object</a> is of a given type </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>type</em>&nbsp;</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><!-- doxytag: member="json_object.h::json_object_new_array" ref="a9b5af06e9a99e16c6d9b6459a685ea3f" args="(void)" -->
+<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>(</td>
+          <td class="paramtype">void&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </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_array </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a <a class="el" href="structjson__object.html">json_object</a> of type json_type_array </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a93cfacfdd1000c739ad19df0a080cb85"></a><!-- doxytag: member="json_object.h::json_object_new_boolean" ref="a93cfacfdd1000c739ad19df0a080cb85" args="(json_bool b)" -->
+<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>(</td>
+          <td class="paramtype"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>&nbsp;</td>
+          <td class="paramname"> <em>b</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </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_boolean </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>b</em>&nbsp;</td><td>a json_bool TRUE or FALSE (0 or 1) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a <a class="el" href="structjson__object.html">json_object</a> of type json_type_boolean </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a2e9c761833a4f5d0a0c60640377e3cec"></a><!-- doxytag: member="json_object.h::json_object_new_double" ref="a2e9c761833a4f5d0a0c60640377e3cec" args="(double d)" -->
+<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>(</td>
+          <td class="paramtype">double&nbsp;</td>
+          <td class="paramname"> <em>d</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </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><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>d</em>&nbsp;</td><td>the double </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a <a class="el" href="structjson__object.html">json_object</a> of type json_type_double </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="aa7db8ceb1afe1b93afc63c10b8c57560"></a><!-- doxytag: member="json_object.h::json_object_new_int" ref="aa7db8ceb1afe1b93afc63c10b8c57560" args="(int32_t i)" -->
+<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>(</td>
+          <td class="paramtype">int32_t&nbsp;</td>
+          <td class="paramname"> <em>i</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </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_int Note that values are stored as 64-bit values internally. To ensure the full range is maintained, use json_object_new_int64 instead. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>i</em>&nbsp;</td><td>the integer </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a <a class="el" href="structjson__object.html">json_object</a> of type json_type_int </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a54a27690a1927354966189166bba6ca3"></a><!-- doxytag: member="json_object.h::json_object_new_int64" ref="a54a27690a1927354966189166bba6ca3" args="(int64_t i)" -->
+<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>(</td>
+          <td class="paramtype">int64_t&nbsp;</td>
+          <td class="paramname"> <em>i</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </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_int </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>i</em>&nbsp;</td><td>the integer </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a <a class="el" href="structjson__object.html">json_object</a> of type json_type_int </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="af0ed3555604f39ac74b5e28bc5b1f82c"></a><!-- doxytag: member="json_object.h::json_object_new_object" ref="af0ed3555604f39ac74b5e28bc5b1f82c" args="(void)" -->
+<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>(</td>
+          <td class="paramtype">void&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Create a new empty object with a reference count of 1. The caller of this object initially has sole ownership. Remember, when using json_object_object_add or json_object_array_put_idx, ownership will transfer to the object/array. Call json_object_get if you want to maintain shared ownership or also add this object as a child of multiple objects or arrays. Any ownerships you acquired but did not transfer must be released through json_object_put.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a <a class="el" href="structjson__object.html">json_object</a> of type json_type_object </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a48eb92a8208e6718e55edf1130e8e4b8"></a><!-- doxytag: member="json_object.h::json_object_new_string" ref="a48eb92a8208e6718e55edf1130e8e4b8" args="(const char *s)" -->
+<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>(</td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>s</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </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_string</p>
+<p>A copy of the string is made and the memory is managed by the <a class="el" href="structjson__object.html">json_object</a></p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>s</em>&nbsp;</td><td>the string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a <a class="el" href="structjson__object.html">json_object</a> of type json_type_string </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a9d14fd03ed7520c4aa33ab53b4569414"></a><!-- doxytag: member="json_object.h::json_object_new_string_len" ref="a9d14fd03ed7520c4aa33ab53b4569414" args="(const char *s, int len)" -->
+<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>(</td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>s</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>len</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a04448b1c63173e1bfe49965835732075"></a><!-- doxytag: member="json_object.h::json_object_object_add" ref="a04448b1c63173e1bfe49965835732075" args="(struct json_object *obj, const char *key, struct json_object *val)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void json_object_object_add </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</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> *&nbsp;</td>
+          <td class="paramname"> <em>val</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <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 reference count will *not* be incremented. This is to make adding fields to objects in code more compact. If you want to retain a reference to an added object, independent of the lifetime of obj, you must wrap the passed object with json_object_get.</p>
+<p>Upon calling this, the ownership of val transfers to obj. Thus you must make sure that you do in fact have ownership over this object. For instance, json_object_new_object will give you ownership until you transfer it, whereas json_object_object_get does not.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>key</em>&nbsp;</td><td>the object field name (a private copy will be duplicated) </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>val</em>&nbsp;</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>
+
+</div>
+</div>
+<a class="anchor" id="a03653c18aafccd1ffba1ad318e342845"></a><!-- doxytag: member="json_object.h::json_object_object_del" ref="a03653c18aafccd1ffba1ad318e342845" args="(struct json_object *obj, const char *key)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void json_object_object_del </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>key</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Delete the given <a class="el" href="structjson__object.html">json_object</a> field</p>
+<p>The reference count will be decremented for the deleted object. If there are no more owners of the value represented by this key, then the value is freed. Otherwise, the reference to the value will remain in memory.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>key</em>&nbsp;</td><td>the object field name </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ac11730ad909d1f9eb077d1ce9ff8b153"></a><!-- doxytag: member="json_object.h::json_object_object_get" ref="ac11730ad909d1f9eb077d1ce9ff8b153" args="(struct json_object *obj, const char *key)" -->
+<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_object_get </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>key</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [read]</code></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>*No* reference counts will be changed. There is no need to manually adjust reference counts through the json_object_put/json_object_get methods unless you need to have the child (value) reference maintain a different lifetime than the owning parent (obj). Ownership of the returned value is retained by obj (do not do json_object_put unless you have done a json_object_get). If you delete the value from obj (json_object_object_del) and wish to access the returned reference afterwards, make sure you have first gotten shared ownership through json_object_get (&amp; don't forget to do a json_object_put or transfer ownership to prevent a memory leak).</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>key</em>&nbsp;</td><td>the object field name </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></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>
+
+</div>
+</div>
+<a class="anchor" id="af3f38b3395b1af8e9d3ac73818c3a936"></a><!-- doxytag: member="json_object.h::json_object_object_get_ex" ref="af3f38b3395b1af8e9d3ac73818c3a936" args="(struct json_object *obj, const char *key, struct json_object **value)" -->
+<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>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</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> **&nbsp;</td>
+          <td class="paramname"> <em>value</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <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> associated with a given object field.</p>
+<p>This returns true if the key is found, false in all other cases (including if obj isn't a json_type_object).</p>
+<p>*No* reference counts will be changed. There is no need to manually adjust reference counts through the json_object_put/json_object_get methods unless you need to have the child (value) reference maintain a different lifetime than the owning parent (obj). Ownership of value is retained by obj.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>key</em>&nbsp;</td><td>the object field name </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>value</em>&nbsp;</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 field name.</td></tr>
+  </table>
+  </dd>
+</dl>
+<p>It is safe to pass a NULL value. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>whether or not the key exists </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="accc34b38e15e46357d64a0beed3d0150"></a><!-- doxytag: member="json_object.h::json_object_put" ref="accc34b38e15e46357d64a0beed3d0150" args="(struct json_object *obj)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void json_object_put </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Decrement the reference count of <a class="el" href="structjson__object.html">json_object</a> and free if it reaches zero. You must have ownership of obj prior to doing this or you will cause an imbalance in the reference count.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a1f62a660e2619559d1f3f54cd7483ff8"></a><!-- doxytag: member="json_object.h::json_object_to_json_string" ref="a1f62a660e2619559d1f3f54cd7483ff8" args="(struct json_object *obj)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* json_object_to_json_string </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</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><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a string in JSON format </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a84421dab94ccad42e901e534c6d7b658"></a><!-- doxytag: member="json_object.h::json_object_to_json_string_ext" ref="a84421dab94ccad42e901e534c6d7b658" args="(struct json_object *obj, int flags)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* json_object_to_json_string_ext </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>flags</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Stringify object to json format </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>the <a class="el" href="structjson__object.html">json_object</a> instance </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>flags</em>&nbsp;</td><td>formatting options, see JSON_C_TO_STRING_PRETTY and other constants </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a string in JSON format </dd></dl>
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="a20dbe4913551cefa6b4b0a77fd4397c4"></a><!-- doxytag: member="json_object.h::json_hex_chars" ref="a20dbe4913551cefa6b4b0a77fd4397c4" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* <a class="el" href="json__object_8h.html#a20dbe4913551cefa6b4b0a77fd4397c4">json_hex_chars</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a27427f89f2fc995639e366635fbe58ac"></a><!-- doxytag: member="json_object.h::json_number_chars" ref="a27427f89f2fc995639e366635fbe58ac" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* <a class="el" href="json__object_8h.html#a27427f89f2fc995639e366635fbe58ac">json_number_chars</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/json__object__iterator_8h.html b/doc/html/json__object__iterator_8h.html
new file mode 100644 (file)
index 0000000..33a650b
--- /dev/null
@@ -0,0 +1,270 @@
+<!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"/>
+<title>json-c: json_object_iterator.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>json_object_iterator.h File Reference</h1>
+<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.  
+<a href="#_details">More...</a></p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Structures</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object__iterator.html">json_object_iterator</a></td></tr>
+<tr><td colspan="2"><h2>Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__iterator_8h.html#af30f56ca510d59da42e5592f9a436c10">json_object_iter_init_default</a> (void)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__iterator_8h.html#a925eb97b5aa5b64986a0f663f53cf0fa">json_object_iter_begin</a> (struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__iterator_8h.html#a1fa3784395fb14496e3f1a1633028fd4">json_object_iter_end</a> (const struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__iterator_8h.html#aa98a310c340f6d9b4eeecb673aa5e240">json_object_iter_next</a> (struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a> *iter)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__iterator_8h.html#af17775b9b812a4206a84e4d3fb5774ab">json_object_iter_peek_name</a> (const struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a> *iter)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__iterator_8h.html#a47b0af7f1722c10475dffd29efc0b89d">json_object_iter_peek_value</a> (const struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a> *iter)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__iterator_8h.html#a878ca25f72b339882aa2607ac938e79c">json_object_iter_equal</a> (const struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a> *iter1, const struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a> *iter2)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<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>
+<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/>
+ * Thread-safe: NO<br/>
+ * Reentrant: NO </p>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="a925eb97b5aa5b64986a0f663f53cf0fa"></a><!-- doxytag: member="json_object_iterator.h::json_object_iter_begin" ref="a925eb97b5aa5b64986a0f663f53cf0fa" args="(struct json_object *obj)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a> json_object_iter_begin </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Retrieves an iterator to the first pair of the JSON Object.</p>
+<dl class="warning"><dt><b>Warning:</b></dt><dd>Any modification of the underlying pair invalidates all iterators to that pair.</dd></dl>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>JSON Object instance (MUST be of type <a class="el" href="structjson__object.html">json_object</a>)</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></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"><pre class="fragment"> <span class="keyword">struct </span><a class="code" href="structjson__object__iterator.html">json_object_iterator</a> it;
+ <span class="keyword">struct </span><a class="code" href="structjson__object__iterator.html">json_object_iterator</a> itEnd;
+ <span class="keyword">struct </span><a class="code" href="structjson__object.html">json_object</a>* obj;
+
+ obj = <a class="code" href="json__tokener_8h.html#abf031fdf1e5caab71e2225a99588c6bb">json_tokener_parse</a>(<span class="stringliteral">&quot;{&#39;first&#39;:&#39;george&#39;, &#39;age&#39;:100}&quot;</span>);
+ it = <a class="code" href="json__object__iterator_8h.html#a925eb97b5aa5b64986a0f663f53cf0fa">json_object_iter_begin</a>(obj);
+ itEnd = <a class="code" href="json__object__iterator_8h.html#a1fa3784395fb14496e3f1a1633028fd4">json_object_iter_end</a>(obj);
+
+ <span class="keywordflow">while</span> (!<a class="code" href="json__object__iterator_8h.html#a878ca25f72b339882aa2607ac938e79c">json_object_iter_equal</a>(&amp;it, &amp;itEnd)) {
+     printf(<span class="stringliteral">&quot;%s\n&quot;</span>,
+            <a class="code" href="json__object__iterator_8h.html#af17775b9b812a4206a84e4d3fb5774ab">json_object_iter_peek_name</a>(&amp;it));
+     <a class="code" href="json__object__iterator_8h.html#aa98a310c340f6d9b4eeecb673aa5e240">json_object_iter_next</a>(&amp;it);
+ }
+</pre></div> 
+</div>
+</div>
+<a class="anchor" id="a1fa3784395fb14496e3f1a1633028fd4"></a><!-- doxytag: member="json_object_iterator.h::json_object_iter_end" ref="a1fa3784395fb14496e3f1a1633028fd4" args="(const struct json_object *obj)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a> json_object_iter_end </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Retrieves the iterator that represents the position beyond the last pair of the given JSON Object instance.</p>
+<dl class="warning"><dt><b>Warning:</b></dt><dd>Do NOT write code that assumes that the "end" iterator value is NULL, even if it is so in a particular instance of the implementation.</dd></dl>
+<dl class="note"><dt><b>Note:</b></dt><dd>The reason we do not (and MUST NOT) provide "json_object_iter_is_end(json_object_iterator* iter)" type of API is because it would limit the underlying representation of name/value containment (or force us to add additional, otherwise unnecessary, fields to the iterator structure). The "end" iterator and the equality test method, on the other hand, permit us to cleanly abstract pretty much any reasonable underlying representation without burdening the iterator structure with unnecessary data.</dd>
+<dd>
+For performance reasons, memorize the "end" iterator prior to any loop.</dd></dl>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>obj</em>&nbsp;</td><td>JSON Object instance (MUST be of type <a class="el" href="structjson__object.html">json_object</a>)</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd><a class="el" href="structjson__object__iterator.html">json_object_iterator</a> On return, the iterator refers to the "end" of the Object instance's pairs (i.e., NOT the last pair, but "beyond the last
+              pair" value) </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a878ca25f72b339882aa2607ac938e79c"></a><!-- doxytag: member="json_object_iterator.h::json_object_iter_equal" ref="a878ca25f72b339882aa2607ac938e79c" args="(const struct json_object_iterator *iter1, const struct json_object_iterator *iter2)" -->
+<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_iter_equal </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a> *&nbsp;</td>
+          <td class="paramname"> <em>iter1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a> *&nbsp;</td>
+          <td class="paramname"> <em>iter2</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Tests two iterators for equality. Typically used to test for end of iteration by comparing an iterator to the corresponding "end" iterator (that was derived from the same JSON Object instance).</p>
+<dl class="note"><dt><b>Note:</b></dt><dd>The reason we do not (and MUST NOT) provide "json_object_iter_is_end(json_object_iterator* iter)" type of API is because it would limit the underlying representation of name/value containment (or force us to add additional, otherwise unnecessary, fields to the iterator structure). The equality test method, on the other hand, permits us to cleanly abstract pretty much any reasonable underlying representation.</dd></dl>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>iter1</em>&nbsp;</td><td>Pointer to first valid, non-NULL iterator </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>iter2</em>&nbsp;</td><td>POinter to second valid, non-NULL iterator</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="warning"><dt><b>Warning:</b></dt><dd>if a NULL iterator pointer or an uninitialized or invalid iterator, or iterators derived from different JSON Object instances are passed, bad things will happen!</dd></dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>json_bool non-zero if iterators are equal (i.e., both reference the same name/value pair or are both at "end"); zero if they are not equal. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="af30f56ca510d59da42e5592f9a436c10"></a><!-- doxytag: member="json_object_iterator.h::json_object_iter_init_default" ref="af30f56ca510d59da42e5592f9a436c10" args="(void)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a> json_object_iter_init_default </td>
+          <td>(</td>
+          <td class="paramtype">void&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </tr>
+      </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"><pre class="fragment"> <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>();
+ MyClass() : iter_(<a class="code" href="json__object__iterator_8h.html#af30f56ca510d59da42e5592f9a436c10">json_object_iter_init_default</a>())
+</pre></div><dl class="note"><dt><b>Note:</b></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="return"><dt><b>Returns:</b></dt><dd><a class="el" href="structjson__object__iterator.html">json_object_iterator</a> </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="aa98a310c340f6d9b4eeecb673aa5e240"></a><!-- doxytag: member="json_object_iterator.h::json_object_iter_next" ref="aa98a310c340f6d9b4eeecb673aa5e240" args="(struct json_object_iterator *iter)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void json_object_iter_next </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a> *&nbsp;</td>
+          <td class="paramname"> <em>iter</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Returns an iterator to the next pair, if any</p>
+<dl class="warning"><dt><b>Warning:</b></dt><dd>Any modification of the underlying pair invalidates all iterators to that pair.</dd></dl>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>iter</em>&nbsp;</td><td>[IN/OUT] Pointer to iterator that references a name/value pair; MUST be a valid, non-end iterator. WARNING: bad things will happen if invalid or "end" iterator is passed. Upon return will contain the reference to the next pair if there is one; if there are no more pairs, will contain the "end" iterator value, which may be compared against the return value of <a class="el" href="json__object__iterator_8h.html#a1fa3784395fb14496e3f1a1633028fd4">json_object_iter_end()</a> for the same JSON Object instance. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="af17775b9b812a4206a84e4d3fb5774ab"></a><!-- doxytag: member="json_object_iterator.h::json_object_iter_peek_name" ref="af17775b9b812a4206a84e4d3fb5774ab" args="(const struct json_object_iterator *iter)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* json_object_iter_peek_name </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a> *&nbsp;</td>
+          <td class="paramname"> <em>iter</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Returns a const pointer to the name of the pair referenced by the given iterator.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>iter</em>&nbsp;</td><td>pointer to iterator that references a name/value pair; MUST be a valid, non-end iterator.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="warning"><dt><b>Warning:</b></dt><dd>bad things will happen if an invalid or "end" iterator is passed.</dd></dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>const char* Pointer to the name of the referenced name/value pair. The name memory belongs to the name/value pair, will be freed when the pair is deleted or modified, and MUST NOT be modified or freed by the user. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a47b0af7f1722c10475dffd29efc0b89d"></a><!-- doxytag: member="json_object_iterator.h::json_object_iter_peek_value" ref="a47b0af7f1722c10475dffd29efc0b89d" args="(const struct json_object_iterator *iter)" -->
+<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_iter_peek_value </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structjson__object__iterator.html">json_object_iterator</a> *&nbsp;</td>
+          <td class="paramname"> <em>iter</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Returns a pointer to the json-c instance representing the value of the referenced name/value pair, without altering the instance's reference count.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>iter</em>&nbsp;</td><td>pointer to iterator that references a name/value pair; MUST be a valid, non-end iterator.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="warning"><dt><b>Warning:</b></dt><dd>bad things will happen if invalid or "end" iterator is passed.</dd></dl>
+<dl class="return"><dt><b>Returns:</b></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#accc34b38e15e46357d64a0beed3d0150">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>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/json__object__private_8h.html b/doc/html/json__object__private_8h.html
new file mode 100644 (file)
index 0000000..2918e45
--- /dev/null
@@ -0,0 +1,68 @@
+<!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"/>
+<title>json-c: json_object_private.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>json_object_private.h File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Structures</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html">json_object</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">union &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionjson__object_1_1data.html">json_object::data</a></td></tr>
+<tr><td colspan="2"><h2>Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef void(&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__private_8h.html#ac96402e72ae5c12d690ec95ed441ec70">json_object_delete_fn</a> )(struct <a class="el" href="structjson__object.html">json_object</a> *o)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef int(&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__object__private_8h.html#a778fe57040398137cf9ccf9f2dd53282">json_object_to_json_string_fn</a> )(struct <a class="el" href="structjson__object.html">json_object</a> *o, struct <a class="el" href="structprintbuf.html">printbuf</a> *pb, int level, int flags)</td></tr>
+</table>
+<hr/><h2>Typedef Documentation</h2>
+<a class="anchor" id="ac96402e72ae5c12d690ec95ed441ec70"></a><!-- doxytag: member="json_object_private.h::json_object_delete_fn" ref="ac96402e72ae5c12d690ec95ed441ec70" args=")(struct json_object *o)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void( <a class="el" href="json__object__private_8h.html#ac96402e72ae5c12d690ec95ed441ec70">json_object_delete_fn</a>)(struct <a class="el" href="structjson__object.html">json_object</a> *o)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a778fe57040398137cf9ccf9f2dd53282"></a><!-- doxytag: member="json_object_private.h::json_object_to_json_string_fn" ref="a778fe57040398137cf9ccf9f2dd53282" args=")(struct json_object *o, struct printbuf *pb, int level, int flags)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef int( <a class="el" href="json__object__private_8h.html#a778fe57040398137cf9ccf9f2dd53282">json_object_to_json_string_fn</a>)(struct <a class="el" href="structjson__object.html">json_object</a> *o, struct <a class="el" href="structprintbuf.html">printbuf</a> *pb, int level, int flags)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/json__tokener_8h.html b/doc/html/json__tokener_8h.html
new file mode 100644 (file)
index 0000000..fe95ef8
--- /dev/null
@@ -0,0 +1,449 @@
+<!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"/>
+<title>json-c: json_tokener.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>json_tokener.h File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Structures</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener__srec.html">json_tokener_srec</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener.html">json_tokener</a></td></tr>
+<tr><td colspan="2"><h2>Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#ac4299cf4ed799b028e61cf7b2b0d5f1f">JSON_TOKENER_MAX_DEPTH</a>&nbsp;&nbsp;&nbsp;32</td></tr>
+<tr><td colspan="2"><h2>Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a> { <br/>
+&nbsp;&nbsp;<a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59afe2fa9bde03155019b2df30f66a5fcd0">json_tokener_success</a>, 
+<a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a9b26e920ca765df91c84e999561d8fb0">json_tokener_continue</a>, 
+<a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a59b2c36d9cc30c3038e09b9ddee6c86c">json_tokener_error_depth</a>, 
+<a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a8f774f4c7869afdd9b92295fca3a9ded">json_tokener_error_parse_eof</a>, 
+<br/>
+&nbsp;&nbsp;<a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a3309fa8ea4ab3ee0a81c55b69d223710">json_tokener_error_parse_unexpected</a>, 
+<a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a641bbb8d881fdd1e463f20a1a203b77c">json_tokener_error_parse_null</a>, 
+<a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59addbdfe084e20709da3d20c8ae8ca278c">json_tokener_error_parse_boolean</a>, 
+<a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59ab1b3ad685eb97235d269cc5b9eb7ab81">json_tokener_error_parse_number</a>, 
+<br/>
+&nbsp;&nbsp;<a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a574846740b785146f164a209dc89574e">json_tokener_error_parse_array</a>, 
+<a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a2003bd8e96c6680cd22419c5ceafd4c0">json_tokener_error_parse_object_key_name</a>, 
+<a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59af91a2a819b0d6344d6d4e1d2579f28fd">json_tokener_error_parse_object_key_sep</a>, 
+<a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a9ddb98741aebf7ac44735b4a43717013">json_tokener_error_parse_object_value_sep</a>, 
+<br/>
+&nbsp;&nbsp;<a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a033ce89ce7b8f9e591e4bea92121c4c7">json_tokener_error_parse_string</a>, 
+<a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a3588c05b1da8b909a8cbdef66b0a1a28">json_tokener_error_parse_comment</a>
+<br/>
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2">json_tokener_state</a> { <br/>
+&nbsp;&nbsp;<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a9db152607ec1872a000f1fcd8757297d">json_tokener_state_eatws</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a7c4c0bed1ebde45f5a99de4278792d72">json_tokener_state_start</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2ad80b689cb709967b67a348de3d8601d2">json_tokener_state_finish</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a668fb2654c59608945370003403a5792">json_tokener_state_null</a>, 
+<br/>
+&nbsp;&nbsp;<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a0ff1d1935d49188aa1e6b998d43e655c">json_tokener_state_comment_start</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a8c2680b8873a8dce85f0b1ac25882dc9">json_tokener_state_comment</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2ad8151350b1ef50298bafbab244ac1162">json_tokener_state_comment_eol</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a62cef297a37a98b1239ea4bbd39723e1">json_tokener_state_comment_end</a>, 
+<br/>
+&nbsp;&nbsp;<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2aa90ea4c327a285bfbbce49d42d491d65">json_tokener_state_string</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a1cf793d73587f68c4f2b3b4f65ff728e">json_tokener_state_string_escape</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a6c852da2e694be56799c58c201d6dca0">json_tokener_state_escape_unicode</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a3525b15ecd0a698281b3914115b6bd3e">json_tokener_state_boolean</a>, 
+<br/>
+&nbsp;&nbsp;<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a7ce18d281d322af690b45f3b8b599e81">json_tokener_state_number</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2ab3d763300f1914865be09d603ddc11f4">json_tokener_state_array</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2aa2a01798ebe318ea91c38a886418f771">json_tokener_state_array_add</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a4ec7762aeab3424cbb14354c94025865">json_tokener_state_array_sep</a>, 
+<br/>
+&nbsp;&nbsp;<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a8c7dbda177a5d83a36a64f7cb99b9a29">json_tokener_state_object_field_start</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a77375940a10806e81d99876d13be67fc">json_tokener_state_object_field</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a0220aea1d9204aadfffde92c7f73f5f7">json_tokener_state_object_field_end</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2a4c7b7deac37355491572f6da84f208aa">json_tokener_state_object_value</a>, 
+<br/>
+&nbsp;&nbsp;<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2ade6bee72f2147e634b19eb84e58eb162">json_tokener_state_object_value_add</a>, 
+<a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2adaf3e06c5fc04fd4f04040cd67698215">json_tokener_state_object_sep</a>
+<br/>
+ }</td></tr>
+<tr><td colspan="2"><h2>Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">const char *&nbsp;</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><td class="memItemLeft" align="right" valign="top">enum <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a>&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__tokener.html">json_tokener</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a55d6e8a6f6d90992c063a39e21769c52">json_tokener_new</a> (void)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</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><td class="memItemLeft" align="right" valign="top">void&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</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><td colspan="2"><h2>Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__tokener_8h.html#a6ede8ee7a4ec1fed68d10ea77294c966">json_tokener_errors</a> []</td></tr>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="ac4299cf4ed799b028e61cf7b2b0d5f1f"></a><!-- doxytag: member="json_tokener.h::JSON_TOKENER_MAX_DEPTH" ref="ac4299cf4ed799b028e61cf7b2b0d5f1f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_TOKENER_MAX_DEPTH&nbsp;&nbsp;&nbsp;32</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Enumeration Type Documentation</h2>
+<a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59"></a><!-- doxytag: member="json_tokener.h::json_tokener_error" ref="a0a31f0df8a532ef8be5c09ba40eacb59" args="" -->
+<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></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59afe2fa9bde03155019b2df30f66a5fcd0"></a><!-- doxytag: member="json_tokener_success" ref="a0a31f0df8a532ef8be5c09ba40eacb59afe2fa9bde03155019b2df30f66a5fcd0" args="" -->json_tokener_success</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a9b26e920ca765df91c84e999561d8fb0"></a><!-- doxytag: member="json_tokener_continue" ref="a0a31f0df8a532ef8be5c09ba40eacb59a9b26e920ca765df91c84e999561d8fb0" args="" -->json_tokener_continue</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a59b2c36d9cc30c3038e09b9ddee6c86c"></a><!-- doxytag: member="json_tokener_error_depth" ref="a0a31f0df8a532ef8be5c09ba40eacb59a59b2c36d9cc30c3038e09b9ddee6c86c" args="" -->json_tokener_error_depth</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a8f774f4c7869afdd9b92295fca3a9ded"></a><!-- doxytag: member="json_tokener_error_parse_eof" ref="a0a31f0df8a532ef8be5c09ba40eacb59a8f774f4c7869afdd9b92295fca3a9ded" args="" -->json_tokener_error_parse_eof</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a3309fa8ea4ab3ee0a81c55b69d223710"></a><!-- doxytag: member="json_tokener_error_parse_unexpected" ref="a0a31f0df8a532ef8be5c09ba40eacb59a3309fa8ea4ab3ee0a81c55b69d223710" args="" -->json_tokener_error_parse_unexpected</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a641bbb8d881fdd1e463f20a1a203b77c"></a><!-- doxytag: member="json_tokener_error_parse_null" ref="a0a31f0df8a532ef8be5c09ba40eacb59a641bbb8d881fdd1e463f20a1a203b77c" args="" -->json_tokener_error_parse_null</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59addbdfe084e20709da3d20c8ae8ca278c"></a><!-- doxytag: member="json_tokener_error_parse_boolean" ref="a0a31f0df8a532ef8be5c09ba40eacb59addbdfe084e20709da3d20c8ae8ca278c" args="" -->json_tokener_error_parse_boolean</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59ab1b3ad685eb97235d269cc5b9eb7ab81"></a><!-- doxytag: member="json_tokener_error_parse_number" ref="a0a31f0df8a532ef8be5c09ba40eacb59ab1b3ad685eb97235d269cc5b9eb7ab81" args="" -->json_tokener_error_parse_number</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a574846740b785146f164a209dc89574e"></a><!-- doxytag: member="json_tokener_error_parse_array" ref="a0a31f0df8a532ef8be5c09ba40eacb59a574846740b785146f164a209dc89574e" args="" -->json_tokener_error_parse_array</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a2003bd8e96c6680cd22419c5ceafd4c0"></a><!-- doxytag: member="json_tokener_error_parse_object_key_name" ref="a0a31f0df8a532ef8be5c09ba40eacb59a2003bd8e96c6680cd22419c5ceafd4c0" args="" -->json_tokener_error_parse_object_key_name</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59af91a2a819b0d6344d6d4e1d2579f28fd"></a><!-- doxytag: member="json_tokener_error_parse_object_key_sep" ref="a0a31f0df8a532ef8be5c09ba40eacb59af91a2a819b0d6344d6d4e1d2579f28fd" args="" -->json_tokener_error_parse_object_key_sep</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a9ddb98741aebf7ac44735b4a43717013"></a><!-- doxytag: member="json_tokener_error_parse_object_value_sep" ref="a0a31f0df8a532ef8be5c09ba40eacb59a9ddb98741aebf7ac44735b4a43717013" args="" -->json_tokener_error_parse_object_value_sep</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a033ce89ce7b8f9e591e4bea92121c4c7"></a><!-- doxytag: member="json_tokener_error_parse_string" ref="a0a31f0df8a532ef8be5c09ba40eacb59a033ce89ce7b8f9e591e4bea92121c4c7" args="" -->json_tokener_error_parse_string</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="a0a31f0df8a532ef8be5c09ba40eacb59a3588c05b1da8b909a8cbdef66b0a1a28"></a><!-- doxytag: member="json_tokener_error_parse_comment" ref="a0a31f0df8a532ef8be5c09ba40eacb59a3588c05b1da8b909a8cbdef66b0a1a28" args="" -->json_tokener_error_parse_comment</em>&nbsp;</td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2"></a><!-- doxytag: member="json_tokener.h::json_tokener_state" ref="af026dec71e4548e6200eb2f902f1c4e2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2">json_tokener_state</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a9db152607ec1872a000f1fcd8757297d"></a><!-- doxytag: member="json_tokener_state_eatws" ref="af026dec71e4548e6200eb2f902f1c4e2a9db152607ec1872a000f1fcd8757297d" args="" -->json_tokener_state_eatws</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a7c4c0bed1ebde45f5a99de4278792d72"></a><!-- doxytag: member="json_tokener_state_start" ref="af026dec71e4548e6200eb2f902f1c4e2a7c4c0bed1ebde45f5a99de4278792d72" args="" -->json_tokener_state_start</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2ad80b689cb709967b67a348de3d8601d2"></a><!-- doxytag: member="json_tokener_state_finish" ref="af026dec71e4548e6200eb2f902f1c4e2ad80b689cb709967b67a348de3d8601d2" args="" -->json_tokener_state_finish</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a668fb2654c59608945370003403a5792"></a><!-- doxytag: member="json_tokener_state_null" ref="af026dec71e4548e6200eb2f902f1c4e2a668fb2654c59608945370003403a5792" args="" -->json_tokener_state_null</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a0ff1d1935d49188aa1e6b998d43e655c"></a><!-- doxytag: member="json_tokener_state_comment_start" ref="af026dec71e4548e6200eb2f902f1c4e2a0ff1d1935d49188aa1e6b998d43e655c" args="" -->json_tokener_state_comment_start</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a8c2680b8873a8dce85f0b1ac25882dc9"></a><!-- doxytag: member="json_tokener_state_comment" ref="af026dec71e4548e6200eb2f902f1c4e2a8c2680b8873a8dce85f0b1ac25882dc9" args="" -->json_tokener_state_comment</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2ad8151350b1ef50298bafbab244ac1162"></a><!-- doxytag: member="json_tokener_state_comment_eol" ref="af026dec71e4548e6200eb2f902f1c4e2ad8151350b1ef50298bafbab244ac1162" args="" -->json_tokener_state_comment_eol</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a62cef297a37a98b1239ea4bbd39723e1"></a><!-- doxytag: member="json_tokener_state_comment_end" ref="af026dec71e4548e6200eb2f902f1c4e2a62cef297a37a98b1239ea4bbd39723e1" args="" -->json_tokener_state_comment_end</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2aa90ea4c327a285bfbbce49d42d491d65"></a><!-- doxytag: member="json_tokener_state_string" ref="af026dec71e4548e6200eb2f902f1c4e2aa90ea4c327a285bfbbce49d42d491d65" args="" -->json_tokener_state_string</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a1cf793d73587f68c4f2b3b4f65ff728e"></a><!-- doxytag: member="json_tokener_state_string_escape" ref="af026dec71e4548e6200eb2f902f1c4e2a1cf793d73587f68c4f2b3b4f65ff728e" args="" -->json_tokener_state_string_escape</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a6c852da2e694be56799c58c201d6dca0"></a><!-- doxytag: member="json_tokener_state_escape_unicode" ref="af026dec71e4548e6200eb2f902f1c4e2a6c852da2e694be56799c58c201d6dca0" args="" -->json_tokener_state_escape_unicode</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a3525b15ecd0a698281b3914115b6bd3e"></a><!-- doxytag: member="json_tokener_state_boolean" ref="af026dec71e4548e6200eb2f902f1c4e2a3525b15ecd0a698281b3914115b6bd3e" args="" -->json_tokener_state_boolean</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a7ce18d281d322af690b45f3b8b599e81"></a><!-- doxytag: member="json_tokener_state_number" ref="af026dec71e4548e6200eb2f902f1c4e2a7ce18d281d322af690b45f3b8b599e81" args="" -->json_tokener_state_number</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2ab3d763300f1914865be09d603ddc11f4"></a><!-- doxytag: member="json_tokener_state_array" ref="af026dec71e4548e6200eb2f902f1c4e2ab3d763300f1914865be09d603ddc11f4" args="" -->json_tokener_state_array</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2aa2a01798ebe318ea91c38a886418f771"></a><!-- doxytag: member="json_tokener_state_array_add" ref="af026dec71e4548e6200eb2f902f1c4e2aa2a01798ebe318ea91c38a886418f771" args="" -->json_tokener_state_array_add</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a4ec7762aeab3424cbb14354c94025865"></a><!-- doxytag: member="json_tokener_state_array_sep" ref="af026dec71e4548e6200eb2f902f1c4e2a4ec7762aeab3424cbb14354c94025865" args="" -->json_tokener_state_array_sep</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a8c7dbda177a5d83a36a64f7cb99b9a29"></a><!-- doxytag: member="json_tokener_state_object_field_start" ref="af026dec71e4548e6200eb2f902f1c4e2a8c7dbda177a5d83a36a64f7cb99b9a29" args="" -->json_tokener_state_object_field_start</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a77375940a10806e81d99876d13be67fc"></a><!-- doxytag: member="json_tokener_state_object_field" ref="af026dec71e4548e6200eb2f902f1c4e2a77375940a10806e81d99876d13be67fc" args="" -->json_tokener_state_object_field</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a0220aea1d9204aadfffde92c7f73f5f7"></a><!-- doxytag: member="json_tokener_state_object_field_end" ref="af026dec71e4548e6200eb2f902f1c4e2a0220aea1d9204aadfffde92c7f73f5f7" args="" -->json_tokener_state_object_field_end</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2a4c7b7deac37355491572f6da84f208aa"></a><!-- doxytag: member="json_tokener_state_object_value" ref="af026dec71e4548e6200eb2f902f1c4e2a4c7b7deac37355491572f6da84f208aa" args="" -->json_tokener_state_object_value</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2ade6bee72f2147e634b19eb84e58eb162"></a><!-- doxytag: member="json_tokener_state_object_value_add" ref="af026dec71e4548e6200eb2f902f1c4e2ade6bee72f2147e634b19eb84e58eb162" args="" -->json_tokener_state_object_value_add</em>&nbsp;</td><td>
+</td></tr>
+<tr><td valign="top"><em><a class="anchor" id="af026dec71e4548e6200eb2f902f1c4e2adaf3e06c5fc04fd4f04040cd67698215"></a><!-- doxytag: member="json_tokener_state_object_sep" ref="af026dec71e4548e6200eb2f902f1c4e2adaf3e06c5fc04fd4f04040cd67698215" args="" -->json_tokener_state_object_sep</em>&nbsp;</td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="a04c5625212aed3216cc303429e47f642"></a><!-- doxytag: member="json_tokener.h::json_tokener_error_desc" ref="a04c5625212aed3216cc303429e47f642" args="(enum json_tokener_error jerr)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* json_tokener_error_desc </td>
+          <td>(</td>
+          <td class="paramtype">enum <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a>&nbsp;</td>
+          <td class="paramname"> <em>jerr</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </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>
+<dl class="return"><dt><b>Returns:</b></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><!-- doxytag: member="json_tokener.h::json_tokener_free" ref="af6645ff27c0ca82c6e314390814fcbeb" args="(struct json_tokener *tok)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void json_tokener_free </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__tokener.html">json_tokener</a> *&nbsp;</td>
+          <td class="paramname"> <em>tok</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae8dff7f1ea11702aecf418e0da5574fe"></a><!-- doxytag: member="json_tokener.h::json_tokener_get_error" ref="ae8dff7f1ea11702aecf418e0da5574fe" args="(struct json_tokener *tok)" -->
+<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>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__tokener.html">json_tokener</a> *&nbsp;</td>
+          <td class="paramname"> <em>tok</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </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>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><!-- doxytag: member="json_tokener.h::json_tokener_new" ref="a55d6e8a6f6d90992c063a39e21769c52" args="(void)" -->
+<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>(</td>
+          <td class="paramtype">void&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abf031fdf1e5caab71e2225a99588c6bb"></a><!-- doxytag: member="json_tokener.h::json_tokener_parse" ref="abf031fdf1e5caab71e2225a99588c6bb" args="(const char *str)" -->
+<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>(</td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>str</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0d9a666c21879647e8831f9cfa691673"></a><!-- doxytag: member="json_tokener.h::json_tokener_parse_ex" ref="a0d9a666c21879647e8831f9cfa691673" args="(struct json_tokener *tok, const char *str, int len)" -->
+<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>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__tokener.html">json_tokener</a> *&nbsp;</td>
+          <td class="paramname"> <em>tok</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>str</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>len</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [read]</code></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><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>Example: </p>
+<div class="fragment"><pre class="fragment"><a class="code" href="structjson__object.html">json_object</a> *jobj = NULL;
+<span class="keyword">const</span> <span class="keywordtype">char</span> *mystring = NULL;
+<span class="keywordtype">int</span> stringlen = 0;
+<span class="keyword">enum</span> <a class="code" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a> jerr;
+<span class="keywordflow">do</span> {
+        mystring = ...  <span class="comment">// get JSON string, e.g. read from file, etc...</span>
+        stringlen = strlen(mystring);
+        jobj = <a class="code" href="json__tokener_8h.html#a0d9a666c21879647e8831f9cfa691673">json_tokener_parse_ex</a>(tok, mystring, stringlen);
+} <span class="keywordflow">while</span> ((jerr = <a class="code" href="json__tokener_8h.html#ae8dff7f1ea11702aecf418e0da5574fe">json_tokener_get_error</a>(tok)) == <a class="code" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59a9b26e920ca765df91c84e999561d8fb0">json_tokener_continue</a>);
+<span class="keywordflow">if</span> (jerr != <a class="code" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59afe2fa9bde03155019b2df30f66a5fcd0">json_tokener_success</a>)
+{
+        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));
+        <span class="comment">// Handle errors, as appropriate for your application.</span>
+}
+<span class="keywordflow">if</span> (tok-&gt;char_offset &lt; stringlen) <span class="comment">// XXX shouldn&#39;t access internal fields</span>
+{
+        <span class="comment">// Handle extra characters after parsed object as desired.</span>
+        <span class="comment">// e.g. issue an error, parse another object from that point, etc...</span>
+}
+<span class="comment">// Success, use jobj here.</span>
+</pre></div><dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>tok</em>&nbsp;</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 valign="top"></td><td valign="top"><em>str</em>&nbsp;</td><td>an string with any valid JSON expression, or portion of. This does not need to be null terminated. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>len</em>&nbsp;</td><td>the length of str </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a1c8f5d8baad383dc8879615d2b02b53c"></a><!-- doxytag: member="json_tokener.h::json_tokener_parse_verbose" ref="a1c8f5d8baad383dc8879615d2b02b53c" args="(const char *str, enum json_tokener_error *error)" -->
+<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>(</td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>str</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a> *&nbsp;</td>
+          <td class="paramname"> <em>error</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae23dd7ad4737bfc18409af6173ab2b09"></a><!-- doxytag: member="json_tokener.h::json_tokener_reset" ref="ae23dd7ad4737bfc18409af6173ab2b09" args="(struct json_tokener *tok)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void json_tokener_reset </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structjson__tokener.html">json_tokener</a> *&nbsp;</td>
+          <td class="paramname"> <em>tok</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="a6ede8ee7a4ec1fed68d10ea77294c966"></a><!-- doxytag: member="json_tokener.h::json_tokener_errors" ref="a6ede8ee7a4ec1fed68d10ea77294c966" args="[]" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* <a class="el" href="json__tokener_8h.html#a6ede8ee7a4ec1fed68d10ea77294c966">json_tokener_errors</a>[]</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p><b>XXX</b> do not use json_tokener_errors directly. After v0.10 this will be removed.</p>
+<p>See <a class="el" href="json__tokener_8h.html#a04c5625212aed3216cc303429e47f642">json_tokener_error_desc()</a> instead. </p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/json__util_8h.html b/doc/html/json__util_8h.html
new file mode 100644 (file)
index 0000000..5a544ea
--- /dev/null
@@ -0,0 +1,182 @@
+<!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"/>
+<title>json-c: json_util.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>json_util.h File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#a084b6afc8f7fbef88976aabe4aca7efd">JSON_FILE_BUF_SIZE</a>&nbsp;&nbsp;&nbsp;4096</td></tr>
+<tr><td colspan="2"><h2>Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</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><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#a00f5c43b3035faa4e4f3e55cf59707ee">json_object_to_file</a> (char *filename, struct <a class="el" href="structjson__object.html">json_object</a> *obj)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="json__util_8h.html#a1ddcf96dd176ed447ce4df383190cfa8">json_object_to_file_ext</a> (char *filename, struct <a class="el" href="structjson__object.html">json_object</a> *obj, int flags)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</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><td class="memItemLeft" align="right" valign="top">const char *&nbsp;</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>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="a084b6afc8f7fbef88976aabe4aca7efd"></a><!-- doxytag: member="json_util.h::JSON_FILE_BUF_SIZE" ref="a084b6afc8f7fbef88976aabe4aca7efd" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define JSON_FILE_BUF_SIZE&nbsp;&nbsp;&nbsp;4096</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="a8fa0bba6b7ddb149a2159d99bae709ce"></a><!-- doxytag: member="json_util.h::json_object_from_file" ref="a8fa0bba6b7ddb149a2159d99bae709ce" args="(const char *filename)" -->
+<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_file </td>
+          <td>(</td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>filename</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a00f5c43b3035faa4e4f3e55cf59707ee"></a><!-- doxytag: member="json_util.h::json_object_to_file" ref="a00f5c43b3035faa4e4f3e55cf59707ee" args="(char *filename, struct json_object *obj)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int json_object_to_file </td>
+          <td>(</td>
+          <td class="paramtype">char *&nbsp;</td>
+          <td class="paramname"> <em>filename</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1ddcf96dd176ed447ce4df383190cfa8"></a><!-- doxytag: member="json_util.h::json_object_to_file_ext" ref="a1ddcf96dd176ed447ce4df383190cfa8" args="(char *filename, struct json_object *obj, int flags)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int json_object_to_file_ext </td>
+          <td>(</td>
+          <td class="paramtype">char *&nbsp;</td>
+          <td class="paramname"> <em>filename</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td>
+          <td class="paramname"> <em>obj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>flags</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9bb9882ef2859ca2c1ee17805679bc25"></a><!-- doxytag: member="json_util.h::json_parse_int64" ref="a9bb9882ef2859ca2c1ee17805679bc25" args="(const char *buf, int64_t *retval)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int json_parse_int64 </td>
+          <td>(</td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int64_t *&nbsp;</td>
+          <td class="paramname"> <em>retval</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a74031a1b948dc9fed3f367ea6ce78389"></a><!-- doxytag: member="json_util.h::json_type_to_name" ref="a74031a1b948dc9fed3f367ea6ce78389" args="(enum json_type o_type)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* json_type_to_name </td>
+          <td>(</td>
+          <td class="paramtype">enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a>&nbsp;</td>
+          <td class="paramname"> <em>o_type</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Return a string describing the type of the object. e.g. "int", or "object", etc... </p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/linkhash_8h.html b/doc/html/linkhash_8h.html
new file mode 100644 (file)
index 0000000..b250287
--- /dev/null
@@ -0,0 +1,767 @@
+<!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"/>
+<title>json-c: linkhash.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>linkhash.h File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Structures</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__entry.html">lh_entry</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html">lh_table</a></td></tr>
+<tr><td colspan="2"><h2>Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a032f1bd115df254dda325437203ce5fb">LH_PRIME</a>&nbsp;&nbsp;&nbsp;0x9e370001UL</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a66b61772c29d85eb52b697e0b0dc0aaf">LH_LOAD_FACTOR</a>&nbsp;&nbsp;&nbsp;0.66</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a93fad7f8ae44575dc89c9567859972d2">LH_EMPTY</a>&nbsp;&nbsp;&nbsp;(void*)-1</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#ac69428f2de0a6fb080b6fb373d506aa7">LH_FREED</a>&nbsp;&nbsp;&nbsp;(void*)-2</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#ad7dd67da915065dce2c6f44cb03e2d82">lh_foreach</a>(table, entry)&nbsp;&nbsp;&nbsp;for(entry = table-&gt;head; entry; entry = entry-&gt;next)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#abcbb0df08b4976d0649b826b6bacfca1">lh_foreach_safe</a>(table, entry, tmp)&nbsp;&nbsp;&nbsp;for(entry = table-&gt;head; entry &amp;&amp; ((tmp = entry-&gt;next) || 1); entry = tmp)</td></tr>
+<tr><td colspan="2"><h2>Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef void(&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a671553d0ee3c2a123190ba0f8ed2b635">lh_entry_free_fn</a> )(struct <a class="el" href="structlh__entry.html">lh_entry</a> *e)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef unsigned long(&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a38bae27995dcfb6ee3fb109a9be229b2">lh_hash_fn</a> )(const void *k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef int(&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a91fd85fc81b0c7c83c62f00e84729091">lh_equal_fn</a> )(const void *k1, const void *k2)</td></tr>
+<tr><td colspan="2"><h2>Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">unsigned long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a2e560f0d3e5a20f6b0bfa4049737db23">lh_ptr_hash</a> (const void *k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</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><td class="memItemLeft" align="right" valign="top">unsigned long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a1fcf495b9c4ce169630cb31f638b8435">lh_char_hash</a> (const void *k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__table.html">lh_table</a> *&nbsp;</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#a671553d0ee3c2a123190ba0f8ed2b635">lh_entry_free_fn</a> *free_fn, <a class="el" href="linkhash_8h.html#a38bae27995dcfb6ee3fb109a9be229b2">lh_hash_fn</a> *hash_fn, <a class="el" href="linkhash_8h.html#a91fd85fc81b0c7c83c62f00e84729091">lh_equal_fn</a> *equal_fn)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__table.html">lh_table</a> *&nbsp;</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#a671553d0ee3c2a123190ba0f8ed2b635">lh_entry_free_fn</a> *free_fn)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__table.html">lh_table</a> *&nbsp;</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#a671553d0ee3c2a123190ba0f8ed2b635">lh_entry_free_fn</a> *free_fn)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</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><td class="memItemLeft" align="right" valign="top">int&nbsp;</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><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&nbsp;</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><td class="memItemLeft" align="right" valign="top">const void *&nbsp;</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><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>&nbsp;</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><td class="memItemLeft" align="right" valign="top">int&nbsp;</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>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a2fed2c78f70d229edb2d00775ffe593c">lh_table_delete</a> (struct <a class="el" href="structlh__table.html">lh_table</a> *t, const void *k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="linkhash_8h.html#a1294160fa0e80cee04cd745a401f43a4">lh_abort</a> (const char *msg,...)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</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>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="a93fad7f8ae44575dc89c9567859972d2"></a><!-- doxytag: member="linkhash.h::LH_EMPTY" ref="a93fad7f8ae44575dc89c9567859972d2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LH_EMPTY&nbsp;&nbsp;&nbsp;(void*)-1</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>sentinel pointer value for empty slots </p>
+
+</div>
+</div>
+<a class="anchor" id="ad7dd67da915065dce2c6f44cb03e2d82"></a><!-- doxytag: member="linkhash.h::lh_foreach" ref="ad7dd67da915065dce2c6f44cb03e2d82" args="(table, entry)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define lh_foreach</td>
+          <td>(</td>
+          <td class="paramtype">table, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">entry&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;for(entry = table-&gt;head; entry; entry = entry-&gt;next)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Convenience list iterator. </p>
+
+</div>
+</div>
+<a class="anchor" id="abcbb0df08b4976d0649b826b6bacfca1"></a><!-- doxytag: member="linkhash.h::lh_foreach_safe" ref="abcbb0df08b4976d0649b826b6bacfca1" args="(table, entry, tmp)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define lh_foreach_safe</td>
+          <td>(</td>
+          <td class="paramtype">table, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">entry, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">tmp&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;for(entry = table-&gt;head; entry &amp;&amp; ((tmp = entry-&gt;next) || 1); entry = tmp)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>lh_foreach_safe allows calling of deletion routine while iterating. </p>
+
+</div>
+</div>
+<a class="anchor" id="ac69428f2de0a6fb080b6fb373d506aa7"></a><!-- doxytag: member="linkhash.h::LH_FREED" ref="ac69428f2de0a6fb080b6fb373d506aa7" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LH_FREED&nbsp;&nbsp;&nbsp;(void*)-2</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>sentinel pointer value for freed slots </p>
+
+</div>
+</div>
+<a class="anchor" id="a66b61772c29d85eb52b697e0b0dc0aaf"></a><!-- doxytag: member="linkhash.h::LH_LOAD_FACTOR" ref="a66b61772c29d85eb52b697e0b0dc0aaf" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LH_LOAD_FACTOR&nbsp;&nbsp;&nbsp;0.66</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The fraction of filled hash buckets until an insert will cause the table to be resized. This can range from just above 0 up to 1.0. </p>
+
+</div>
+</div>
+<a class="anchor" id="a032f1bd115df254dda325437203ce5fb"></a><!-- doxytag: member="linkhash.h::LH_PRIME" ref="a032f1bd115df254dda325437203ce5fb" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LH_PRIME&nbsp;&nbsp;&nbsp;0x9e370001UL</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>golden prime used in hash functions </p>
+
+</div>
+</div>
+<hr/><h2>Typedef Documentation</h2>
+<a class="anchor" id="a671553d0ee3c2a123190ba0f8ed2b635"></a><!-- doxytag: member="linkhash.h::lh_entry_free_fn" ref="a671553d0ee3c2a123190ba0f8ed2b635" args=")(struct lh_entry *e)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void( <a class="el" href="linkhash_8h.html#a671553d0ee3c2a123190ba0f8ed2b635">lh_entry_free_fn</a>)(struct <a class="el" href="structlh__entry.html">lh_entry</a> *e)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>callback function prototypes </p>
+
+</div>
+</div>
+<a class="anchor" id="a91fd85fc81b0c7c83c62f00e84729091"></a><!-- doxytag: member="linkhash.h::lh_equal_fn" ref="a91fd85fc81b0c7c83c62f00e84729091" args=")(const void *k1, const void *k2)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef int( <a class="el" href="linkhash_8h.html#a91fd85fc81b0c7c83c62f00e84729091">lh_equal_fn</a>)(const void *k1, const void *k2)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>callback function prototypes </p>
+
+</div>
+</div>
+<a class="anchor" id="a38bae27995dcfb6ee3fb109a9be229b2"></a><!-- doxytag: member="linkhash.h::lh_hash_fn" ref="a38bae27995dcfb6ee3fb109a9be229b2" args=")(const void *k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef unsigned long( <a class="el" href="linkhash_8h.html#a38bae27995dcfb6ee3fb109a9be229b2">lh_hash_fn</a>)(const void *k)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>callback function prototypes </p>
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="a1294160fa0e80cee04cd745a401f43a4"></a><!-- doxytag: member="linkhash.h::lh_abort" ref="a1294160fa0e80cee04cd745a401f43a4" args="(const char *msg,...)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lh_abort </td>
+          <td>(</td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>msg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&nbsp;</td>
+          <td class="paramname"> <em>...</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae4e9f21fb1a556c7a50c6b7ea61f2079"></a><!-- doxytag: member="linkhash.h::lh_char_equal" ref="ae4e9f21fb1a556c7a50c6b7ea61f2079" args="(const void *k1, const void *k2)" -->
+<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 *&nbsp;</td>
+          <td class="paramname"> <em>k1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>k2</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1fcf495b9c4ce169630cb31f638b8435"></a><!-- doxytag: member="linkhash.h::lh_char_hash" ref="a1fcf495b9c4ce169630cb31f638b8435" args="(const void *k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">unsigned long lh_char_hash </td>
+          <td>(</td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>k</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0aaf11e11ee5b0925279a52eab04bc38"></a><!-- doxytag: member="linkhash.h::lh_kchar_table_new" ref="a0aaf11e11ee5b0925279a52eab04bc38" args="(int size, const char *name, lh_entry_free_fn *free_fn)" -->
+<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>(</td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>size</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</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#a671553d0ee3c2a123190ba0f8ed2b635">lh_entry_free_fn</a> *&nbsp;</td>
+          <td class="paramname"> <em>free_fn</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Convenience function to create a new linkhash table with char keys. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>size</em>&nbsp;</td><td>initial table size. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>table name. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>free_fn</em>&nbsp;</td><td>callback function used to free memory for entries. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a pointer onto the linkhash table. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a705513954267a16cc1d40a284a7c441e"></a><!-- doxytag: member="linkhash.h::lh_kptr_table_new" ref="a705513954267a16cc1d40a284a7c441e" args="(int size, const char *name, lh_entry_free_fn *free_fn)" -->
+<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>(</td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>size</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</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#a671553d0ee3c2a123190ba0f8ed2b635">lh_entry_free_fn</a> *&nbsp;</td>
+          <td class="paramname"> <em>free_fn</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Convenience function to create a new linkhash table with ptr keys. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>size</em>&nbsp;</td><td>initial table size. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>table name. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>free_fn</em>&nbsp;</td><td>callback function used to free memory for entries. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a pointer onto the linkhash table. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a6ce3cb97560072c40f5caeaba85f756a"></a><!-- doxytag: member="linkhash.h::lh_ptr_equal" ref="a6ce3cb97560072c40f5caeaba85f756a" args="(const void *k1, const void *k2)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lh_ptr_equal </td>
+          <td>(</td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>k1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>k2</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2e560f0d3e5a20f6b0bfa4049737db23"></a><!-- doxytag: member="linkhash.h::lh_ptr_hash" ref="a2e560f0d3e5a20f6b0bfa4049737db23" args="(const void *k)" -->
+<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 *&nbsp;</td>
+          <td class="paramname"> <em>k</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Pre-defined hash and equality functions </p>
+
+</div>
+</div>
+<a class="anchor" id="a2fed2c78f70d229edb2d00775ffe593c"></a><!-- doxytag: member="linkhash.h::lh_table_delete" ref="a2fed2c78f70d229edb2d00775ffe593c" args="(struct lh_table *t, const void *k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lh_table_delete </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structlh__table.html">lh_table</a> *&nbsp;</td>
+          <td class="paramname"> <em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>k</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </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><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>t</em>&nbsp;</td><td>the table to delete from. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>k</em>&nbsp;</td><td>a pointer to the key to delete. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>0 if the item was deleted. </dd>
+<dd>
+-1 if it was not found. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="ae5885a71c3457190fb1dc2d6e20dde3b"></a><!-- doxytag: member="linkhash.h::lh_table_delete_entry" ref="ae5885a71c3457190fb1dc2d6e20dde3b" args="(struct lh_table *t, struct lh_entry *e)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lh_table_delete_entry </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structlh__table.html">lh_table</a> *&nbsp;</td>
+          <td class="paramname"> <em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&nbsp;</td>
+          <td class="paramname"> <em>e</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </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><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>t</em>&nbsp;</td><td>the table to delete from. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>e</em>&nbsp;</td><td>a pointer to the entry to delete. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>0 if the item was deleted. </dd>
+<dd>
+-1 if it was not found. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a81653acf740cf8c9fe672e6cd16df0cf"></a><!-- doxytag: member="linkhash.h::lh_table_free" ref="a81653acf740cf8c9fe672e6cd16df0cf" args="(struct lh_table *t)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lh_table_free </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structlh__table.html">lh_table</a> *&nbsp;</td>
+          <td class="paramname"> <em>t</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </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><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>t</em>&nbsp;</td><td>table to free. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a22b897763cc34a98c21c7fe82d151004"></a><!-- doxytag: member="linkhash.h::lh_table_insert" ref="a22b897763cc34a98c21c7fe82d151004" args="(struct lh_table *t, void *k, const void *v)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int lh_table_insert </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structlh__table.html">lh_table</a> *&nbsp;</td>
+          <td class="paramname"> <em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&nbsp;</td>
+          <td class="paramname"> <em>k</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>v</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Insert a record into the table. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>t</em>&nbsp;</td><td>the table to insert into. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>k</em>&nbsp;</td><td>a pointer to the key to insert. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>v</em>&nbsp;</td><td>a pointer to the value to insert. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a49c27f18a174eaf126d1b7953df13cb1"></a><!-- doxytag: member="linkhash.h::lh_table_lookup" ref="a49c27f18a174eaf126d1b7953df13cb1" args="(struct lh_table *t, const void *k)" -->
+<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> *&nbsp;</td>
+          <td class="paramname"> <em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>k</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Lookup a record into the table </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>t</em>&nbsp;</td><td>the table to lookup </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>k</em>&nbsp;</td><td>a pointer to the key to lookup </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></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>
+
+</div>
+</div>
+<a class="anchor" id="ad3b6ca2d967a6c3021ee6c39e014a918"></a><!-- doxytag: member="linkhash.h::lh_table_lookup_entry" ref="ad3b6ca2d967a6c3021ee6c39e014a918" args="(struct lh_table *t, const void *k)" -->
+<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 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structlh__table.html">lh_table</a> *&nbsp;</td>
+          <td class="paramname"> <em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>k</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Lookup a record into the table. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>t</em>&nbsp;</td><td>the table to lookup </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>k</em>&nbsp;</td><td>a pointer to the key to lookup </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a pointer to the record structure of the value or NULL if it does not exist. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a81c270bb0dd9d5c8a3e7ae20bc4d67f3"></a><!-- doxytag: member="linkhash.h::lh_table_lookup_ex" ref="a81c270bb0dd9d5c8a3e7ae20bc4d67f3" args="(struct lh_table *t, const void *k, void **v)" -->
+<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> lh_table_lookup_ex </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structlh__table.html">lh_table</a> *&nbsp;</td>
+          <td class="paramname"> <em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>k</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void **&nbsp;</td>
+          <td class="paramname"> <em>v</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Lookup a record in the table </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>t</em>&nbsp;</td><td>the table to lookup </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>k</em>&nbsp;</td><td>a pointer to the key to lookup </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>v</em>&nbsp;</td><td>a pointer to a where to store the found value (set to NULL if it doesn't exist). </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>whether or not the key was found </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="ac3ba464ac43c083397b1f1d34f2ddf55"></a><!-- doxytag: member="linkhash.h::lh_table_new" ref="ac3ba464ac43c083397b1f1d34f2ddf55" args="(int size, const char *name, lh_entry_free_fn *free_fn, lh_hash_fn *hash_fn, lh_equal_fn *equal_fn)" -->
+<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_table_new </td>
+          <td>(</td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>size</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</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#a671553d0ee3c2a123190ba0f8ed2b635">lh_entry_free_fn</a> *&nbsp;</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#a38bae27995dcfb6ee3fb109a9be229b2">lh_hash_fn</a> *&nbsp;</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#a91fd85fc81b0c7c83c62f00e84729091">lh_equal_fn</a> *&nbsp;</td>
+          <td class="paramname"> <em>equal_fn</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Create a new linkhash table. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>size</em>&nbsp;</td><td>initial table size. The table is automatically resized although this incurs a performance penalty. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>the table name. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>free_fn</em>&nbsp;</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 valign="top"></td><td valign="top"><em>hash_fn</em>&nbsp;</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 valign="top"></td><td valign="top"><em>equal_fn</em>&nbsp;</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="return"><dt><b>Returns:</b></dt><dd>a pointer onto the linkhash table. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a5322eccf3394af7dc1ebb22af8f8c562"></a><!-- doxytag: member="linkhash.h::lh_table_resize" ref="a5322eccf3394af7dc1ebb22af8f8c562" args="(struct lh_table *t, int new_size)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void lh_table_resize </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structlh__table.html">lh_table</a> *&nbsp;</td>
+          <td class="paramname"> <em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>new_size</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/pages.html b/doc/html/pages.html
new file mode 100644 (file)
index 0000000..49847f2
--- /dev/null
@@ -0,0 +1,31 @@
+<!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"/>
+<title>json-c: Page Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>Related Pages</h1>Here is a list of all related documentation pages:<ul>
+<li><a class="el" href="deprecated.html">Deprecated List</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:46 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/printbuf_8h.html b/doc/html/printbuf_8h.html
new file mode 100644 (file)
index 0000000..2cbaa70
--- /dev/null
@@ -0,0 +1,264 @@
+<!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"/>
+<title>json-c: printbuf.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>Globals</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>printbuf.h File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Structures</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structprintbuf.html">printbuf</a></td></tr>
+<tr><td colspan="2"><h2>Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="printbuf_8h.html#a6f3a4dc87fab41c37e3eff42f40dc346">printbuf_memappend_fast</a>(p, bufptr, bufsize)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="printbuf_8h.html#acdd84ad88987c0166b7ba0e3f1f8f1bb">printbuf_length</a>(p)&nbsp;&nbsp;&nbsp;((p)-&gt;bpos)</td></tr>
+<tr><td colspan="2"><h2>Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structprintbuf.html">printbuf</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="printbuf_8h.html#a3e390ebc7660a18335edd89f640fd415">printbuf_new</a> (void)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="printbuf_8h.html#a22f09779a19db59a83e7cb8c2ce4c75f">printbuf_memappend</a> (struct <a class="el" href="structprintbuf.html">printbuf</a> *p, const char *buf, int size)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="printbuf_8h.html#ad7fc6ec4c296e85abf404244614cded5">printbuf_memset</a> (struct <a class="el" href="structprintbuf.html">printbuf</a> *pb, int offset, int charvalue, int len)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="printbuf_8h.html#adf6214db6c8ce994c7f7f1180863c8a4">sprintbuf</a> (struct <a class="el" href="structprintbuf.html">printbuf</a> *p, const char *msg,...)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="printbuf_8h.html#a4393ee3dedb376af11c96fe97532292e">printbuf_reset</a> (struct <a class="el" href="structprintbuf.html">printbuf</a> *p)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</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>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="acdd84ad88987c0166b7ba0e3f1f8f1bb"></a><!-- doxytag: member="printbuf.h::printbuf_length" ref="acdd84ad88987c0166b7ba0e3f1f8f1bb" args="(p)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define printbuf_length</td>
+          <td>(</td>
+          <td class="paramtype">p&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td>&nbsp;&nbsp;&nbsp;((p)-&gt;bpos)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6f3a4dc87fab41c37e3eff42f40dc346"></a><!-- doxytag: member="printbuf.h::printbuf_memappend_fast" ref="a6f3a4dc87fab41c37e3eff42f40dc346" args="(p, bufptr, bufsize)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define printbuf_memappend_fast</td>
+          <td>(</td>
+          <td class="paramtype">p, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">bufptr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">bufsize&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<b>Value:</b><div class="fragment"><pre class="fragment"><span class="keywordflow">do</span> {                                                         \
+  <span class="keywordflow">if</span> ((p-&gt;size - p-&gt;bpos) &gt; bufsize) {                       \
+    memcpy(p-&gt;buf + p-&gt;bpos, (bufptr), bufsize);             \
+    p-&gt;bpos += bufsize;                                      \
+    p-&gt;buf[p-&gt;bpos]= <span class="charliteral">&#39;\0&#39;</span>;                                   \
+  } <span class="keywordflow">else</span> {  <a class="code" href="printbuf_8h.html#a22f09779a19db59a83e7cb8c2ce4c75f">printbuf_memappend</a>(p, (bufptr), bufsize); }      \
+} <span class="keywordflow">while</span> (0)
+</pre></div>
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ab525221c767ac65c58ddeea8a655a4e8"></a><!-- doxytag: member="printbuf.h::printbuf_free" ref="ab525221c767ac65c58ddeea8a655a4e8" args="(struct printbuf *p)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void printbuf_free </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structprintbuf.html">printbuf</a> *&nbsp;</td>
+          <td class="paramname"> <em>p</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a22f09779a19db59a83e7cb8c2ce4c75f"></a><!-- doxytag: member="printbuf.h::printbuf_memappend" ref="a22f09779a19db59a83e7cb8c2ce4c75f" args="(struct printbuf *p, const char *buf, int size)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int printbuf_memappend </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structprintbuf.html">printbuf</a> *&nbsp;</td>
+          <td class="paramname"> <em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>size</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad7fc6ec4c296e85abf404244614cded5"></a><!-- doxytag: member="printbuf.h::printbuf_memset" ref="ad7fc6ec4c296e85abf404244614cded5" args="(struct printbuf *pb, int offset, int charvalue, int len)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int printbuf_memset </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structprintbuf.html">printbuf</a> *&nbsp;</td>
+          <td class="paramname"> <em>pb</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>offset</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>charvalue</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>len</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set len bytes of the buffer to charvalue, starting at offset offset. Similar to calling memset(x, charvalue, len);</p>
+<p>The memory allocated for the buffer is extended as necessary.</p>
+<p>If offset is -1, this starts at the end of the current data in the buffer. </p>
+
+</div>
+</div>
+<a class="anchor" id="a3e390ebc7660a18335edd89f640fd415"></a><!-- doxytag: member="printbuf.h::printbuf_new" ref="a3e390ebc7660a18335edd89f640fd415" args="(void)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structprintbuf.html">printbuf</a>* printbuf_new </td>
+          <td>(</td>
+          <td class="paramtype">void&nbsp;</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [read]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4393ee3dedb376af11c96fe97532292e"></a><!-- doxytag: member="printbuf.h::printbuf_reset" ref="a4393ee3dedb376af11c96fe97532292e" args="(struct printbuf *p)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void printbuf_reset </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structprintbuf.html">printbuf</a> *&nbsp;</td>
+          <td class="paramname"> <em>p</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adf6214db6c8ce994c7f7f1180863c8a4"></a><!-- doxytag: member="printbuf.h::sprintbuf" ref="adf6214db6c8ce994c7f7f1180863c8a4" args="(struct printbuf *p, const char *msg,...)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int sprintbuf </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structprintbuf.html">printbuf</a> *&nbsp;</td>
+          <td class="paramname"> <em>p</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>msg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&nbsp;</td>
+          <td class="paramname"> <em>...</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/structarray__list.html b/doc/html/structarray__list.html
new file mode 100644 (file)
index 0000000..ba2aa57
--- /dev/null
@@ -0,0 +1,96 @@
+<!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"/>
+<title>json-c: array_list Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>array_list Struct Reference</h1><!-- doxytag: class="array_list" --><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void **&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structarray__list.html#a7ba65feda2b156148c08667cf155b657">array</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structarray__list.html#a442fcfde196a3cc95a647f0708de814d">length</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structarray__list.html#aba48a197d3c8f1d56682da23fe883d0a">size</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="arraylist_8h.html#aad83e4ed3c8ea274e6f18459276d774b">array_list_free_fn</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structarray__list.html#ab7989cdde357e5c7819c562c7680ab74">free_fn</a></td></tr>
+</table>
+<hr/><h2>Field Documentation</h2>
+<a class="anchor" id="a7ba65feda2b156148c08667cf155b657"></a><!-- doxytag: member="array_list::array" ref="a7ba65feda2b156148c08667cf155b657" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void** <a class="el" href="structarray__list.html#a7ba65feda2b156148c08667cf155b657">array_list::array</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab7989cdde357e5c7819c562c7680ab74"></a><!-- doxytag: member="array_list::free_fn" ref="ab7989cdde357e5c7819c562c7680ab74" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="arraylist_8h.html#aad83e4ed3c8ea274e6f18459276d774b">array_list_free_fn</a>* <a class="el" href="structarray__list.html#ab7989cdde357e5c7819c562c7680ab74">array_list::free_fn</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a442fcfde196a3cc95a647f0708de814d"></a><!-- doxytag: member="array_list::length" ref="a442fcfde196a3cc95a647f0708de814d" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structarray__list.html#a442fcfde196a3cc95a647f0708de814d">array_list::length</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aba48a197d3c8f1d56682da23fe883d0a"></a><!-- doxytag: member="array_list::size" ref="aba48a197d3c8f1d56682da23fe883d0a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structarray__list.html#aba48a197d3c8f1d56682da23fe883d0a">array_list::size</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="arraylist_8h.html">arraylist.h</a></li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/structjson__object.html b/doc/html/structjson__object.html
new file mode 100644 (file)
index 0000000..c8f389c
--- /dev/null
@@ -0,0 +1,126 @@
+<!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"/>
+<title>json-c: json_object Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>json_object Struct Reference</h1><!-- doxytag: class="json_object" --><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Structures</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">union &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionjson__object_1_1data.html">data</a></td></tr>
+<tr><td colspan="2"><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum <a class="el" href="json__object_8h.html#ac75c61993722a9b8aaa44704072ec06c">json_type</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#a28307a4a3fe6cefe27e28fec56b76b3e">o_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object__private_8h.html#ac96402e72ae5c12d690ec95ed441ec70">json_object_delete_fn</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#aa3a238f4b671c21fa0578fc37a126c2e">_delete</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object__private_8h.html#a778fe57040398137cf9ccf9f2dd53282">json_object_to_json_string_fn</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#a077a02daac4653f91584dd7f47c3d632">_to_json_string</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#aca9b93573ba6bb8cf66d87c170a575b2">_ref_count</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structprintbuf.html">printbuf</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#afdcaa9e24bce7c86c33cb6f6ae65cb56">_pb</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">union <a class="el" href="unionjson__object_1_1data.html">json_object::data</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object.html#a33aff83ffea02b934235c4821cca8cf0">o</a></td></tr>
+</table>
+<hr/><h2>Field Documentation</h2>
+<a class="anchor" id="aa3a238f4b671c21fa0578fc37a126c2e"></a><!-- doxytag: member="json_object::_delete" ref="aa3a238f4b671c21fa0578fc37a126c2e" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object__private_8h.html#ac96402e72ae5c12d690ec95ed441ec70">json_object_delete_fn</a>* <a class="el" href="structjson__object.html#aa3a238f4b671c21fa0578fc37a126c2e">json_object::_delete</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afdcaa9e24bce7c86c33cb6f6ae65cb56"></a><!-- doxytag: member="json_object::_pb" ref="afdcaa9e24bce7c86c33cb6f6ae65cb56" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structprintbuf.html">printbuf</a>* <a class="el" href="structjson__object.html#afdcaa9e24bce7c86c33cb6f6ae65cb56">json_object::_pb</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aca9b93573ba6bb8cf66d87c170a575b2"></a><!-- doxytag: member="json_object::_ref_count" ref="aca9b93573ba6bb8cf66d87c170a575b2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structjson__object.html#aca9b93573ba6bb8cf66d87c170a575b2">json_object::_ref_count</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a077a02daac4653f91584dd7f47c3d632"></a><!-- doxytag: member="json_object::_to_json_string" ref="a077a02daac4653f91584dd7f47c3d632" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="json__object__private_8h.html#a778fe57040398137cf9ccf9f2dd53282">json_object_to_json_string_fn</a>* <a class="el" href="structjson__object.html#a077a02daac4653f91584dd7f47c3d632">json_object::_to_json_string</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a33aff83ffea02b934235c4821cca8cf0"></a><!-- doxytag: member="json_object::o" ref="a33aff83ffea02b934235c4821cca8cf0" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">union <a class="el" href="unionjson__object_1_1data.html">json_object::data</a>  <a class="el" href="structjson__object.html#a33aff83ffea02b934235c4821cca8cf0">json_object::o</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a28307a4a3fe6cefe27e28fec56b76b3e"></a><!-- doxytag: member="json_object::o_type" ref="a28307a4a3fe6cefe27e28fec56b76b3e" args="" -->
+<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> <a class="el" href="structjson__object.html#a28307a4a3fe6cefe27e28fec56b76b3e">json_object::o_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="json__object__private_8h.html">json_object_private.h</a></li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/structjson__object__iter.html b/doc/html/structjson__object__iter.html
new file mode 100644 (file)
index 0000000..098b6cd
--- /dev/null
@@ -0,0 +1,82 @@
+<!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"/>
+<title>json-c: json_object_iter Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>json_object_iter Struct Reference</h1><!-- doxytag: class="json_object_iter" --><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object__iter.html#a0b76228b3a039075e9d84f88fa72ff53">key</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object__iter.html#aaae14a8d17aacddacb0a57234e0a4491">val</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object__iter.html#a64e326f050826c644c02ed5bcd214faa">entry</a></td></tr>
+</table>
+<hr/><h2>Field Documentation</h2>
+<a class="anchor" id="a64e326f050826c644c02ed5bcd214faa"></a><!-- doxytag: member="json_object_iter::entry" ref="a64e326f050826c644c02ed5bcd214faa" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structlh__entry.html">lh_entry</a>* <a class="el" href="structjson__object__iter.html#a64e326f050826c644c02ed5bcd214faa">json_object_iter::entry</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0b76228b3a039075e9d84f88fa72ff53"></a><!-- doxytag: member="json_object_iter::key" ref="a0b76228b3a039075e9d84f88fa72ff53" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* <a class="el" href="structjson__object__iter.html#a0b76228b3a039075e9d84f88fa72ff53">json_object_iter::key</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aaae14a8d17aacddacb0a57234e0a4491"></a><!-- doxytag: member="json_object_iter::val" ref="aaae14a8d17aacddacb0a57234e0a4491" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* <a class="el" href="structjson__object__iter.html#aaae14a8d17aacddacb0a57234e0a4491">json_object_iter::val</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="json__object_8h.html">json_object.h</a></li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/structjson__object__iterator.html b/doc/html/structjson__object__iterator.html
new file mode 100644 (file)
index 0000000..786f3ec
--- /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"/>
+<title>json-c: json_object_iterator Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>json_object_iterator Struct Reference</h1><!-- doxytag: class="json_object_iterator" --><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">const void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__object__iterator.html#a69c61c14f5a36b1dc2217e49cd987f47">opaque_</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>The opaque iterator that references a name/value pair within a JSON Object instance or the "end" iterator value. </p>
+<hr/><h2>Field Documentation</h2>
+<a class="anchor" id="a69c61c14f5a36b1dc2217e49cd987f47"></a><!-- doxytag: member="json_object_iterator::opaque_" ref="a69c61c14f5a36b1dc2217e49cd987f47" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const void* <a class="el" href="structjson__object__iterator.html#a69c61c14f5a36b1dc2217e49cd987f47">json_object_iterator::opaque_</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="json__object__iterator_8h.html">json_object_iterator.h</a></li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/structjson__tokener.html b/doc/html/structjson__tokener.html
new file mode 100644 (file)
index 0000000..7c89951
--- /dev/null
@@ -0,0 +1,180 @@
+<!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"/>
+<title>json-c: json_tokener Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>json_tokener Struct Reference</h1><!-- doxytag: class="json_tokener" --><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener.html#a9772e2170322a19d8da6ce5d7dc46895">str</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structprintbuf.html">printbuf</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener.html#a1cdc7f85d7bde95f81bb08b7e61d6684">pb</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener.html#ae0e5102b44cc1fc680be3e0fb5fff028">depth</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener.html#ad3bf0aa728ea14549d5aa6ca8dcba070">is_double</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener.html#a8eed213c0a37d09c1df66c8567e44471">st_pos</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener.html#a9daae2516fd6df23555d33ef01020a76">char_offset</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum <a class="el" href="json__tokener_8h.html#a0a31f0df8a532ef8be5c09ba40eacb59">json_tokener_error</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener.html#adef37cdc2578d8f8920db14315728cbd">err</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener.html#a32fa73e43fb760e6845231a8482eb064">ucs_char</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener.html#aea488b73085ac7c5969ae7fc29e25fa0">quote_char</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__tokener__srec.html">json_tokener_srec</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener.html#a1499f97597246a18357b874e1805a678">stack</a> [JSON_TOKENER_MAX_DEPTH]</td></tr>
+</table>
+<hr/><h2>Field Documentation</h2>
+<a class="anchor" id="a9daae2516fd6df23555d33ef01020a76"></a><!-- doxytag: member="json_tokener::char_offset" ref="a9daae2516fd6df23555d33ef01020a76" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structjson__tokener.html#a9daae2516fd6df23555d33ef01020a76">json_tokener::char_offset</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae0e5102b44cc1fc680be3e0fb5fff028"></a><!-- doxytag: member="json_tokener::depth" ref="ae0e5102b44cc1fc680be3e0fb5fff028" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structjson__tokener.html#ae0e5102b44cc1fc680be3e0fb5fff028">json_tokener::depth</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adef37cdc2578d8f8920db14315728cbd"></a><!-- doxytag: member="json_tokener::err" ref="adef37cdc2578d8f8920db14315728cbd" args="" -->
+<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> <a class="el" href="structjson__tokener.html#adef37cdc2578d8f8920db14315728cbd">json_tokener::err</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad3bf0aa728ea14549d5aa6ca8dcba070"></a><!-- doxytag: member="json_tokener::is_double" ref="ad3bf0aa728ea14549d5aa6ca8dcba070" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structjson__tokener.html#ad3bf0aa728ea14549d5aa6ca8dcba070">json_tokener::is_double</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1cdc7f85d7bde95f81bb08b7e61d6684"></a><!-- doxytag: member="json_tokener::pb" ref="a1cdc7f85d7bde95f81bb08b7e61d6684" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structprintbuf.html">printbuf</a>* <a class="el" href="structjson__tokener.html#a1cdc7f85d7bde95f81bb08b7e61d6684">json_tokener::pb</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aea488b73085ac7c5969ae7fc29e25fa0"></a><!-- doxytag: member="json_tokener::quote_char" ref="aea488b73085ac7c5969ae7fc29e25fa0" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char <a class="el" href="structjson__tokener.html#aea488b73085ac7c5969ae7fc29e25fa0">json_tokener::quote_char</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8eed213c0a37d09c1df66c8567e44471"></a><!-- doxytag: member="json_tokener::st_pos" ref="a8eed213c0a37d09c1df66c8567e44471" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structjson__tokener.html#a8eed213c0a37d09c1df66c8567e44471">json_tokener::st_pos</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1499f97597246a18357b874e1805a678"></a><!-- doxytag: member="json_tokener::stack" ref="a1499f97597246a18357b874e1805a678" args="[JSON_TOKENER_MAX_DEPTH]" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structjson__tokener__srec.html">json_tokener_srec</a> <a class="el" href="structjson__tokener.html#a1499f97597246a18357b874e1805a678">json_tokener::stack</a>[JSON_TOKENER_MAX_DEPTH]</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9772e2170322a19d8da6ce5d7dc46895"></a><!-- doxytag: member="json_tokener::str" ref="a9772e2170322a19d8da6ce5d7dc46895" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* <a class="el" href="structjson__tokener.html#a9772e2170322a19d8da6ce5d7dc46895">json_tokener::str</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a32fa73e43fb760e6845231a8482eb064"></a><!-- doxytag: member="json_tokener::ucs_char" ref="a32fa73e43fb760e6845231a8482eb064" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">unsigned int <a class="el" href="structjson__tokener.html#a32fa73e43fb760e6845231a8482eb064">json_tokener::ucs_char</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="json__tokener_8h.html">json_tokener.h</a></li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/structjson__tokener__srec.html b/doc/html/structjson__tokener__srec.html
new file mode 100644 (file)
index 0000000..5fada3a
--- /dev/null
@@ -0,0 +1,96 @@
+<!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"/>
+<title>json-c: json_tokener_srec Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>json_tokener_srec Struct Reference</h1><!-- doxytag: class="json_tokener_srec" --><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2">json_tokener_state</a> state&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener__srec.html#a868b9912dbb1e4813a630c944f522d48">saved_state</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener__srec.html#ad2bb71affec1da5ba1d9952c3bf2c12a">obj</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structjson__object.html">json_object</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener__srec.html#a466f192f920368a5a6375aeba1e2757f">current</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structjson__tokener__srec.html#a99551c172e97ac2e7a3849a50b4f51ca">obj_field_name</a></td></tr>
+</table>
+<hr/><h2>Field Documentation</h2>
+<a class="anchor" id="a466f192f920368a5a6375aeba1e2757f"></a><!-- doxytag: member="json_tokener_srec::current" ref="a466f192f920368a5a6375aeba1e2757f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* <a class="el" href="structjson__tokener__srec.html#a466f192f920368a5a6375aeba1e2757f">json_tokener_srec::current</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad2bb71affec1da5ba1d9952c3bf2c12a"></a><!-- doxytag: member="json_tokener_srec::obj" ref="ad2bb71affec1da5ba1d9952c3bf2c12a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structjson__object.html">json_object</a>* <a class="el" href="structjson__tokener__srec.html#ad2bb71affec1da5ba1d9952c3bf2c12a">json_tokener_srec::obj</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a99551c172e97ac2e7a3849a50b4f51ca"></a><!-- doxytag: member="json_tokener_srec::obj_field_name" ref="a99551c172e97ac2e7a3849a50b4f51ca" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* <a class="el" href="structjson__tokener__srec.html#a99551c172e97ac2e7a3849a50b4f51ca">json_tokener_srec::obj_field_name</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a868b9912dbb1e4813a630c944f522d48"></a><!-- doxytag: member="json_tokener_srec::saved_state" ref="a868b9912dbb1e4813a630c944f522d48" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="json__tokener_8h.html#af026dec71e4548e6200eb2f902f1c4e2">json_tokener_state</a> state <a class="el" href="structjson__tokener__srec.html#a868b9912dbb1e4813a630c944f522d48">json_tokener_srec::saved_state</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="json__tokener_8h.html">json_tokener.h</a></li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/structlh__entry.html b/doc/html/structlh__entry.html
new file mode 100644 (file)
index 0000000..6c95138
--- /dev/null
@@ -0,0 +1,102 @@
+<!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"/>
+<title>json-c: lh_entry Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>lh_entry Struct Reference</h1><!-- doxytag: class="lh_entry" --><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__entry.html#a6b176b3582c9cf553af6431750f5c3b6">k</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">const void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__entry.html#a1b676732ab2ad3eeaedf6ec60a6a0835">v</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__entry.html#a7c40c46e72d9a0ba071a8d49d535bc67">next</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__entry.html#a6fb9c3de01fb5af67d8d429921cc6a3b">prev</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>An entry in the hash table </p>
+<hr/><h2>Field Documentation</h2>
+<a class="anchor" id="a6b176b3582c9cf553af6431750f5c3b6"></a><!-- doxytag: member="lh_entry::k" ref="a6b176b3582c9cf553af6431750f5c3b6" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* <a class="el" href="structlh__entry.html#a6b176b3582c9cf553af6431750f5c3b6">lh_entry::k</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The key. </p>
+
+</div>
+</div>
+<a class="anchor" id="a7c40c46e72d9a0ba071a8d49d535bc67"></a><!-- doxytag: member="lh_entry::next" ref="a7c40c46e72d9a0ba071a8d49d535bc67" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structlh__entry.html">lh_entry</a>* <a class="el" href="structlh__entry.html#a7c40c46e72d9a0ba071a8d49d535bc67">lh_entry::next</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The next entry </p>
+
+</div>
+</div>
+<a class="anchor" id="a6fb9c3de01fb5af67d8d429921cc6a3b"></a><!-- doxytag: member="lh_entry::prev" ref="a6fb9c3de01fb5af67d8d429921cc6a3b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structlh__entry.html">lh_entry</a>* <a class="el" href="structlh__entry.html#a6fb9c3de01fb5af67d8d429921cc6a3b">lh_entry::prev</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The previous entry. </p>
+
+</div>
+</div>
+<a class="anchor" id="a1b676732ab2ad3eeaedf6ec60a6a0835"></a><!-- doxytag: member="lh_entry::v" ref="a1b676732ab2ad3eeaedf6ec60a6a0835" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const void* <a class="el" href="structlh__entry.html#a1b676732ab2ad3eeaedf6ec60a6a0835">lh_entry::v</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The value. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="linkhash_8h.html">linkhash.h</a></li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/structlh__table.html b/doc/html/structlh__table.html
new file mode 100644 (file)
index 0000000..25bb330
--- /dev/null
@@ -0,0 +1,249 @@
+<!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"/>
+<title>json-c: lh_table Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>lh_table Struct Reference</h1><!-- doxytag: class="lh_table" --><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#ae251575ec2935bcb0e0589ca8e243839">size</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#aa172ed8fe205367b54e0e2cdf9ea8c6c">count</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#a9458e41d842ce40cd37dc13458ced133">collisions</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#ab4cde49bd9ce7a07daaf99af34ddb67e">resizes</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#afd0385c645413d26e682f725a6f52164">lookups</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#afd64becd0d2cfbc91a4c9c9a117498b9">inserts</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#a8348bdd7e61c8d72b402f6a152013fbf">deletes</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#aebf4001cde3746ec8025c1d87d4e6279">name</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#aa7d986a3b12a9fa47e349713794c30fb">head</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#a479895e45db2bdf9bf5d173fa4b7e277">tail</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__entry.html">lh_entry</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#a4fd9c5aba38791b26ab0ec614a5caf8f">table</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="linkhash_8h.html#a671553d0ee3c2a123190ba0f8ed2b635">lh_entry_free_fn</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#a30ea5903f4f8126abd6aa489ffe14737">free_fn</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="linkhash_8h.html#a38bae27995dcfb6ee3fb109a9be229b2">lh_hash_fn</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#a1488d1a4a320b1a9bb2f441859544be1">hash_fn</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="linkhash_8h.html#a91fd85fc81b0c7c83c62f00e84729091">lh_equal_fn</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlh__table.html#aa646c287a6a46e09da6c7457c981a359">equal_fn</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>The hash table structure. </p>
+<hr/><h2>Field Documentation</h2>
+<a class="anchor" id="a9458e41d842ce40cd37dc13458ced133"></a><!-- doxytag: member="lh_table::collisions" ref="a9458e41d842ce40cd37dc13458ced133" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structlh__table.html#a9458e41d842ce40cd37dc13458ced133">lh_table::collisions</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Number of collisions. </p>
+
+</div>
+</div>
+<a class="anchor" id="aa172ed8fe205367b54e0e2cdf9ea8c6c"></a><!-- doxytag: member="lh_table::count" ref="aa172ed8fe205367b54e0e2cdf9ea8c6c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structlh__table.html#aa172ed8fe205367b54e0e2cdf9ea8c6c">lh_table::count</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Numbers of entries. </p>
+
+</div>
+</div>
+<a class="anchor" id="a8348bdd7e61c8d72b402f6a152013fbf"></a><!-- doxytag: member="lh_table::deletes" ref="a8348bdd7e61c8d72b402f6a152013fbf" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structlh__table.html#a8348bdd7e61c8d72b402f6a152013fbf">lh_table::deletes</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Number of deletes. </p>
+
+</div>
+</div>
+<a class="anchor" id="aa646c287a6a46e09da6c7457c981a359"></a><!-- doxytag: member="lh_table::equal_fn" ref="aa646c287a6a46e09da6c7457c981a359" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="linkhash_8h.html#a91fd85fc81b0c7c83c62f00e84729091">lh_equal_fn</a>* <a class="el" href="structlh__table.html#aa646c287a6a46e09da6c7457c981a359">lh_table::equal_fn</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a30ea5903f4f8126abd6aa489ffe14737"></a><!-- doxytag: member="lh_table::free_fn" ref="a30ea5903f4f8126abd6aa489ffe14737" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="linkhash_8h.html#a671553d0ee3c2a123190ba0f8ed2b635">lh_entry_free_fn</a>* <a class="el" href="structlh__table.html#a30ea5903f4f8126abd6aa489ffe14737">lh_table::free_fn</a></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="a1488d1a4a320b1a9bb2f441859544be1"></a><!-- doxytag: member="lh_table::hash_fn" ref="a1488d1a4a320b1a9bb2f441859544be1" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="linkhash_8h.html#a38bae27995dcfb6ee3fb109a9be229b2">lh_hash_fn</a>* <a class="el" href="structlh__table.html#a1488d1a4a320b1a9bb2f441859544be1">lh_table::hash_fn</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa7d986a3b12a9fa47e349713794c30fb"></a><!-- doxytag: member="lh_table::head" ref="aa7d986a3b12a9fa47e349713794c30fb" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structlh__entry.html">lh_entry</a>* <a class="el" href="structlh__table.html#aa7d986a3b12a9fa47e349713794c30fb">lh_table::head</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The first entry. </p>
+
+</div>
+</div>
+<a class="anchor" id="afd64becd0d2cfbc91a4c9c9a117498b9"></a><!-- doxytag: member="lh_table::inserts" ref="afd64becd0d2cfbc91a4c9c9a117498b9" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structlh__table.html#afd64becd0d2cfbc91a4c9c9a117498b9">lh_table::inserts</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Number of inserts. </p>
+
+</div>
+</div>
+<a class="anchor" id="afd0385c645413d26e682f725a6f52164"></a><!-- doxytag: member="lh_table::lookups" ref="afd0385c645413d26e682f725a6f52164" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structlh__table.html#afd0385c645413d26e682f725a6f52164">lh_table::lookups</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Number of lookups. </p>
+
+</div>
+</div>
+<a class="anchor" id="aebf4001cde3746ec8025c1d87d4e6279"></a><!-- doxytag: member="lh_table::name" ref="aebf4001cde3746ec8025c1d87d4e6279" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* <a class="el" href="structlh__table.html#aebf4001cde3746ec8025c1d87d4e6279">lh_table::name</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Name of the hash table. </p>
+
+</div>
+</div>
+<a class="anchor" id="ab4cde49bd9ce7a07daaf99af34ddb67e"></a><!-- doxytag: member="lh_table::resizes" ref="ab4cde49bd9ce7a07daaf99af34ddb67e" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structlh__table.html#ab4cde49bd9ce7a07daaf99af34ddb67e">lh_table::resizes</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Number of resizes. </p>
+
+</div>
+</div>
+<a class="anchor" id="ae251575ec2935bcb0e0589ca8e243839"></a><!-- doxytag: member="lh_table::size" ref="ae251575ec2935bcb0e0589ca8e243839" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structlh__table.html#ae251575ec2935bcb0e0589ca8e243839">lh_table::size</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Size of our hash. </p>
+
+</div>
+</div>
+<a class="anchor" id="a4fd9c5aba38791b26ab0ec614a5caf8f"></a><!-- doxytag: member="lh_table::table" ref="a4fd9c5aba38791b26ab0ec614a5caf8f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structlh__entry.html">lh_entry</a>* <a class="el" href="structlh__table.html#a4fd9c5aba38791b26ab0ec614a5caf8f">lh_table::table</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a479895e45db2bdf9bf5d173fa4b7e277"></a><!-- doxytag: member="lh_table::tail" ref="a479895e45db2bdf9bf5d173fa4b7e277" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structlh__entry.html">lh_entry</a>* <a class="el" href="structlh__table.html#a479895e45db2bdf9bf5d173fa4b7e277">lh_table::tail</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The last entry. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="linkhash_8h.html">linkhash.h</a></li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/structprintbuf.html b/doc/html/structprintbuf.html
new file mode 100644 (file)
index 0000000..eb101d2
--- /dev/null
@@ -0,0 +1,82 @@
+<!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"/>
+<title>json-c: printbuf Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<h1>printbuf Struct Reference</h1><!-- doxytag: class="printbuf" --><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structprintbuf.html#a5d7cf8ac260f1f7c50fecaf9bd7bc651">buf</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structprintbuf.html#aba980ad7406329e32f557dfa0eb7b1b2">bpos</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structprintbuf.html#a12ce6440eaa06a55b96ebdc5a9778dd5">size</a></td></tr>
+</table>
+<hr/><h2>Field Documentation</h2>
+<a class="anchor" id="aba980ad7406329e32f557dfa0eb7b1b2"></a><!-- doxytag: member="printbuf::bpos" ref="aba980ad7406329e32f557dfa0eb7b1b2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structprintbuf.html#aba980ad7406329e32f557dfa0eb7b1b2">printbuf::bpos</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5d7cf8ac260f1f7c50fecaf9bd7bc651"></a><!-- doxytag: member="printbuf::buf" ref="a5d7cf8ac260f1f7c50fecaf9bd7bc651" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* <a class="el" href="structprintbuf.html#a5d7cf8ac260f1f7c50fecaf9bd7bc651">printbuf::buf</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a12ce6440eaa06a55b96ebdc5a9778dd5"></a><!-- doxytag: member="printbuf::size" ref="a12ce6440eaa06a55b96ebdc5a9778dd5" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="structprintbuf.html#a12ce6440eaa06a55b96ebdc5a9778dd5">printbuf::size</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="printbuf_8h.html">printbuf.h</a></li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/doc/html/tab_b.gif b/doc/html/tab_b.gif
new file mode 100644 (file)
index 0000000..0d62348
Binary files /dev/null and b/doc/html/tab_b.gif differ
diff --git a/doc/html/tab_l.gif b/doc/html/tab_l.gif
new file mode 100644 (file)
index 0000000..9b1e633
Binary files /dev/null and b/doc/html/tab_l.gif differ
diff --git a/doc/html/tab_r.gif b/doc/html/tab_r.gif
new file mode 100644 (file)
index 0000000..ce9dd9f
Binary files /dev/null and b/doc/html/tab_r.gif differ
diff --git a/doc/html/tabs.css b/doc/html/tabs.css
new file mode 100644 (file)
index 0000000..a444163
--- /dev/null
@@ -0,0 +1,105 @@
+/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */
+
+DIV.tabs
+{
+   float            : left;
+   width            : 100%;
+   background       : url("tab_b.gif") repeat-x bottom;
+   margin-bottom    : 4px;
+}
+
+DIV.tabs UL
+{
+   margin           : 0px;
+   padding-left     : 10px;
+   list-style       : none;
+}
+
+DIV.tabs LI, DIV.tabs FORM
+{
+   display          : inline;
+   margin           : 0px;
+   padding          : 0px;
+}
+
+DIV.tabs FORM
+{
+   float            : right;
+}
+
+DIV.tabs A
+{
+   float            : left;
+   background       : url("tab_r.gif") no-repeat right top;
+   border-bottom    : 1px solid #84B0C7;
+   font-size        : 80%;
+   font-weight      : bold;
+   text-decoration  : none;
+}
+
+DIV.tabs A:hover
+{
+   background-position: 100% -150px;
+}
+
+DIV.tabs A:link, DIV.tabs A:visited,
+DIV.tabs A:active, DIV.tabs A:hover
+{
+       color: #1A419D;
+}
+
+DIV.tabs SPAN
+{
+   float            : left;
+   display          : block;
+   background       : url("tab_l.gif") no-repeat left top;
+   padding          : 5px 9px;
+   white-space      : nowrap;
+}
+
+DIV.tabs #MSearchBox
+{
+   float            : right;
+   display          : inline;
+   font-size        : 1em;
+}
+
+DIV.tabs TD
+{
+   font-size        : 80%;
+   font-weight      : bold;
+   text-decoration  : none;
+}
+
+
+
+/* Commented Backslash Hack hides rule from IE5-Mac \*/
+DIV.tabs SPAN {float : none;}
+/* End IE5-Mac hack */
+
+DIV.tabs A:hover SPAN
+{
+   background-position: 0% -150px;
+}
+
+DIV.tabs LI.current A
+{
+   background-position: 100% -150px;
+   border-width     : 0px;
+}
+
+DIV.tabs LI.current SPAN
+{
+   background-position: 0% -150px;
+   padding-bottom   : 6px;
+}
+
+DIV.navpath
+{
+   background       : none;
+   border           : none;
+   border-bottom    : 1px solid #84B0C7;
+   text-align       : center;
+   margin           : 2px;
+   padding          : 2px;
+}
diff --git a/doc/html/unionjson__object_1_1data.html b/doc/html/unionjson__object_1_1data.html
new file mode 100644 (file)
index 0000000..2e8514f
--- /dev/null
@@ -0,0 +1,155 @@
+<!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"/>
+<title>json-c: json_object::data Union Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.3 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul>
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs">
+    <ul>
+      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+      <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath"><a class="el" href="structjson__object.html">json_object</a>::<a class="el" href="unionjson__object_1_1data.html">data</a>
+  </div>
+</div>
+<div class="contents">
+<h1>json_object::data Union Reference</h1><!-- doxytag: class="json_object::data" --><table border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="2"><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="json__object_8h.html#a81f02022906fafc71eb9197049f07f73">json_bool</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionjson__object_1_1data.html#a98a3964e5fb0b3a0e9d8786b8facde5c">c_boolean</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">double&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionjson__object_1_1data.html#a9cc4abdb21302913701ac0c8dc75e55a">c_double</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int64_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionjson__object_1_1data.html#a7733181cdb631570913e3a2abfd6937c">c_int64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlh__table.html">lh_table</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionjson__object_1_1data.html#a68089c942f154d4df590d8ecb476a69b">c_object</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structarray__list.html">array_list</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionjson__object_1_1data.html#a4ad6bf2fd6d8718f55850509edfe2e45">c_array</a></td></tr>
+<tr><td class="memItemLeft" >struct {</td></tr>
+<tr><td class="memItemLeft" >&nbsp;&nbsp;&nbsp;char *&nbsp;&nbsp;&nbsp;<a class="el" href="unionjson__object_1_1data.html#a18a82441c3972195a3bf698bb286634b">str</a></td></tr>
+<tr><td class="memItemLeft" >&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;<a class="el" href="unionjson__object_1_1data.html#ac2386853b8a4e7d0b28a27ed599ccef7">len</a></td></tr>
+<tr><td class="memItemLeft" valign="top">}&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="unionjson__object_1_1data.html#af9cd2e329ad7ab0a86b1b622290a663a">c_string</a></td></tr>
+</table>
+<hr/><h2>Field Documentation</h2>
+<a class="anchor" id="a4ad6bf2fd6d8718f55850509edfe2e45"></a><!-- doxytag: member="json_object::data::c_array" ref="a4ad6bf2fd6d8718f55850509edfe2e45" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structarray__list.html">array_list</a>* <a class="el" href="unionjson__object_1_1data.html#a4ad6bf2fd6d8718f55850509edfe2e45">json_object::data::c_array</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a98a3964e5fb0b3a0e9d8786b8facde5c"></a><!-- doxytag: member="json_object::data::c_boolean" ref="a98a3964e5fb0b3a0e9d8786b8facde5c" args="" -->
+<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> <a class="el" href="unionjson__object_1_1data.html#a98a3964e5fb0b3a0e9d8786b8facde5c">json_object::data::c_boolean</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9cc4abdb21302913701ac0c8dc75e55a"></a><!-- doxytag: member="json_object::data::c_double" ref="a9cc4abdb21302913701ac0c8dc75e55a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">double <a class="el" href="unionjson__object_1_1data.html#a9cc4abdb21302913701ac0c8dc75e55a">json_object::data::c_double</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7733181cdb631570913e3a2abfd6937c"></a><!-- doxytag: member="json_object::data::c_int64" ref="a7733181cdb631570913e3a2abfd6937c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int64_t <a class="el" href="unionjson__object_1_1data.html#a7733181cdb631570913e3a2abfd6937c">json_object::data::c_int64</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a68089c942f154d4df590d8ecb476a69b"></a><!-- doxytag: member="json_object::data::c_object" ref="a68089c942f154d4df590d8ecb476a69b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structlh__table.html">lh_table</a>* <a class="el" href="unionjson__object_1_1data.html#a68089c942f154d4df590d8ecb476a69b">json_object::data::c_object</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af9cd2e329ad7ab0a86b1b622290a663a"></a><!-- doxytag: member="json_object::data::c_string" ref="af9cd2e329ad7ab0a86b1b622290a663a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct { ... }   <a class="el" href="unionjson__object_1_1data.html#af9cd2e329ad7ab0a86b1b622290a663a">json_object::data::c_string</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac2386853b8a4e7d0b28a27ed599ccef7"></a><!-- doxytag: member="json_object::data::len" ref="ac2386853b8a4e7d0b28a27ed599ccef7" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int <a class="el" href="unionjson__object_1_1data.html#ac2386853b8a4e7d0b28a27ed599ccef7">json_object::data::len</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a18a82441c3972195a3bf698bb286634b"></a><!-- doxytag: member="json_object::data::str" ref="a18a82441c3972195a3bf698bb286634b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* <a class="el" href="unionjson__object_1_1data.html#a18a82441c3972195a3bf698bb286634b">json_object::data::str</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this union was generated from the following file:<ul>
+<li><a class="el" href="json__object__private_8h.html">json_object_private.h</a></li>
+</ul>
+</div>
+<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 28 15:52:47 2012 for json-c by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
+</body>
+</html>
diff --git a/json.h b/json.h
index a5a3432..d49715b 100644 (file)
--- a/json.h
+++ b/json.h
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
  * Michael Clark <michael@metaparadigm.com>
+ * Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
  *
  * This library is free software; you can redistribute it and/or modify
  * it under the terms of the MIT license. See COPYING for details.
@@ -23,6 +24,7 @@ extern "C" {
 #include "json_util.h"
 #include "json_object.h"
 #include "json_tokener.h"
+#include "json_object_iterator.h"
 
 #ifdef __cplusplus
 }
diff --git a/json_config.h.in b/json_config.h.in
new file mode 100644 (file)
index 0000000..7888e02
--- /dev/null
@@ -0,0 +1,3 @@
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef JSON_C_HAVE_INTTYPES_H
diff --git a/json_inttypes.h b/json_inttypes.h
new file mode 100644 (file)
index 0000000..2f84ade
--- /dev/null
@@ -0,0 +1,28 @@
+
+#ifndef _json_inttypes_h_
+#define _json_inttypes_h_
+
+#include "json_config.h"
+
+#if defined(_MSC_VER) && _MSC_VER < 1700
+
+/* Anything less than Visual Studio C++ 10 is missing stdint.h and inttypes.h */
+typedef __int32 int32_t;
+#define INT32_MIN    ((int32_t)_I32_MIN)
+#define INT32_MAX    ((int32_t)_I32_MAX)
+typedef __int64 int64_t;
+#define INT64_MIN    ((int64_t)_I64_MIN)
+#define INT64_MAX    ((int64_t)_I64_MAX)
+#define PRId64 "I64d"
+#define SCNd64 "I64d"
+
+#else
+
+#ifdef JSON_C_HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+/* inttypes.h includes stdint.h */
+
+#endif
+
+#endif
index f52445c..5a35938 100644 (file)
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
  * Michael Clark <michael@metaparadigm.com>
+ * Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
  *
  * This library is free software; you can redistribute it and/or modify
  * it under the terms of the MIT license. See COPYING for details.
 #include "printbuf.h"
 #include "linkhash.h"
 #include "arraylist.h"
+#include "json_inttypes.h"
 #include "json_object.h"
 #include "json_object_private.h"
+#include "json_util.h"
 
 #if !HAVE_STRNDUP
   char* strndup(const char* str, size_t n);
 #endif /* !HAVE_STRNDUP */
 
+// Don't define this.  It's not thread-safe.
 /* #define REFCOUNT_DEBUG 1 */
 
 const char *json_number_chars = "0123456789.+-eE";
-const char *json_hex_chars = "0123456789abcdef";
-
-#ifdef REFCOUNT_DEBUG
-static const char* json_type_name[] = {
-  "null",
-  "boolean",
-  "double",
-  "int",
-  "object",
-  "array",
-  "string",
-};
-#endif /* REFCOUNT_DEBUG */
+const char *json_hex_chars = "0123456789abcdefABCDEF";
 
 static void json_object_generic_delete(struct json_object* jso);
 static struct json_object* json_object_new(enum json_type o_type);
@@ -69,7 +61,7 @@ static void json_object_fini(void) {
               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_name[obj->o_type], obj);
+        MC_DEBUG("\t%s:%p\n", json_type_to_name(obj->o_type), obj);
       }
     }
   }
@@ -81,15 +73,13 @@ static void json_object_fini(void) {
 
 /* string escaping */
 
-static int json_escape_str(struct printbuf *pb, char *str)
+static int json_escape_str(struct printbuf *pb, char *str, int len)
 {
   int pos = 0, start_offset = 0;
   unsigned char c;
-  do {
+  while (len--) {
     c = str[pos];
     switch(c) {
-    case '\0':
-      break;
     case '\b':
     case '\n':
     case '\r':
@@ -118,7 +108,7 @@ static int json_escape_str(struct printbuf *pb, char *str)
        start_offset = ++pos;
       } else pos++;
     }
-  } while(c);
+  }
   if(pos - start_offset > 0)
     printbuf_memappend(pb, str + start_offset, pos - start_offset);
   return 0;
@@ -150,7 +140,7 @@ static void json_object_generic_delete(struct json_object* jso)
 {
 #ifdef REFCOUNT_DEBUG
   MC_DEBUG("json_object_delete_%s: %p\n",
-          json_type_name[jso->o_type], jso);
+          json_type_to_name(jso->o_type), jso);
   lh_table_delete(json_object_table, jso);
 #endif /* REFCOUNT_DEBUG */
   printbuf_free(jso->_pb);
@@ -168,7 +158,7 @@ static struct json_object* json_object_new(enum json_type o_type)
   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_name[jso->o_type], jso);
+  MC_DEBUG("json_object_new_%s: %p\n", json_type_to_name(jso->o_type), jso);
 #endif /* REFCOUNT_DEBUG */
   return jso;
 }
@@ -178,54 +168,100 @@ static struct json_object* json_object_new(enum json_type o_type)
 
 int json_object_is_type(struct json_object *jso, enum json_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)
 {
+  if (!jso)
+    return json_type_null;
   return jso->o_type;
 }
 
+/* extended conversion to string */
+
+const char* json_object_to_json_string_ext(struct json_object *jso, int flags)
+{
+       if (!jso)
+               return "null";
+
+       if ((!jso->_pb) && !(jso->_pb = printbuf_new()))
+               return NULL;
+
+       printbuf_reset(jso->_pb);
 
-/* json_object_to_json_string */
+       if(jso->_to_json_string(jso, jso->_pb, 0, flags) < 0)
+               return NULL;
+
+       return jso->_pb->buf;
+}
+
+/* backwards-compatible conversion to string */
 
 const char* json_object_to_json_string(struct json_object *jso)
 {
-  if(!jso) return "null";
-  if(!jso->_pb) {
-    if(!(jso->_pb = printbuf_new())) return NULL;
-  } else {
-    printbuf_reset(jso->_pb);
-  }
-  if(jso->_to_json_string(jso, jso->_pb) < 0) return NULL;
-  return jso->_pb->buf;
+       return json_object_to_json_string_ext(jso, JSON_C_TO_STRING_SPACED);
 }
 
+static void indent(struct printbuf *pb, int level, int flags)
+{
+       if (flags & JSON_C_TO_STRING_PRETTY)
+       {
+               printbuf_memset(pb, -1, ' ', level * 2);
+       }
+}
 
 /* json_object_object */
 
 static int json_object_object_to_json_string(struct json_object* jso,
-                                            struct printbuf *pb)
-{
-  int i=0;
-  struct json_object_iter iter;
-  sprintbuf(pb, "{");
-
-  /* CAW: scope operator to make ANSI correctness */
-  /* CAW: switched to json_object_object_foreachC which uses an iterator struct */
-       json_object_object_foreachC(jso, iter) {
-                       if(i) sprintbuf(pb, ",");
-                       sprintbuf(pb, " \"");
-                       json_escape_str(pb, iter.key);
+                                            struct printbuf *pb,
+                                            int level,
+                                                int flags)
+{
+       int had_children = 0;
+       struct json_object_iter iter;
+
+       sprintbuf(pb, "{" /*}*/);
+       if (flags & JSON_C_TO_STRING_PRETTY)
+               sprintbuf(pb, "\n");
+       json_object_object_foreachC(jso, iter)
+       {
+               if (had_children)
+               {
+                       sprintbuf(pb, ",");
+                       if (flags & JSON_C_TO_STRING_PRETTY)
+                               sprintbuf(pb, "\n");
+               }
+               had_children = 1;
+               if (flags & JSON_C_TO_STRING_SPACED)
+                       sprintbuf(pb, " ");
+               indent(pb, level+1, flags);
+               sprintbuf(pb, "\"");
+               json_escape_str(pb, iter.key, strlen(iter.key));
+               if (flags & JSON_C_TO_STRING_SPACED)
                        sprintbuf(pb, "\": ");
-                       if(iter.val == NULL) sprintbuf(pb, "null");
-                       else iter.val->_to_json_string(iter.val, pb);
-                       i++;
+               else
+                       sprintbuf(pb, "\":");
+               if(iter.val == NULL)
+                       sprintbuf(pb, "null");
+               else
+                       iter.val->_to_json_string(iter.val, pb, level+1,flags);
        }
-
-  return sprintbuf(pb, " }");
+       if (flags & JSON_C_TO_STRING_PRETTY)
+       {
+               if (had_children)
+                       sprintbuf(pb, "\n");
+               indent(pb,level,flags);
+       }
+       if (flags & JSON_C_TO_STRING_SPACED)
+               return sprintbuf(pb, /*{*/ " }");
+       else
+               return sprintbuf(pb, /*{*/ "}");
 }
 
+
 static void json_object_lh_entry_free(struct lh_entry *ent)
 {
   free(ent->k);
@@ -269,7 +305,24 @@ void json_object_object_add(struct json_object* jso, const char *key,
 
 struct json_object* json_object_object_get(struct json_object* jso, const char *key)
 {
-  return (struct json_object*) lh_table_lookup(jso->o.c_object, key);
+  struct json_object *result;
+  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)
+{
+  if (NULL == jso) return FALSE;
+
+  switch(jso->o_type) {
+  case json_type_object:
+    return lh_table_lookup_ex(jso->o.c_object, (void*)key, (void**)value);
+  default:
+    if (value != NULL) {
+      *value = NULL;
+    }
+    return FALSE;
+  }
 }
 
 void json_object_object_del(struct json_object* jso, const char *key)
@@ -281,13 +334,15 @@ void json_object_object_del(struct json_object* jso, const char *key)
 /* json_object_boolean */
 
 static int json_object_boolean_to_json_string(struct json_object* jso,
-                                             struct printbuf *pb)
+                                             struct printbuf *pb,
+                                             int level,
+                                                 int flags)
 {
   if(jso->o.c_boolean) return sprintbuf(pb, "true");
   else return sprintbuf(pb, "false");
 }
 
-struct json_object* json_object_new_boolean(boolean b)
+struct json_object* json_object_new_boolean(json_bool b)
 {
   struct json_object *jso = json_object_new(json_type_boolean);
   if(!jso) return NULL;
@@ -296,18 +351,18 @@ struct json_object* json_object_new_boolean(boolean b)
   return jso;
 }
 
-boolean json_object_get_boolean(struct json_object *jso)
+json_bool json_object_get_boolean(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_int != 0);
+    return (jso->o.c_int64 != 0);
   case json_type_double:
     return (jso->o.c_double != 0);
   case json_type_string:
-    return (strlen(jso->o.c_string) != 0);
+    return (jso->o.c_string.len != 0);
   default:
     return FALSE;
   }
@@ -317,34 +372,84 @@ boolean json_object_get_boolean(struct json_object *jso)
 /* json_object_int */
 
 static int json_object_int_to_json_string(struct json_object* jso,
-                                         struct printbuf *pb)
+                                         struct printbuf *pb,
+                                         int level,
+                                         int flags)
+{
+  return sprintbuf(pb, "%"PRId64, jso->o.c_int64);
+}
+
+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;
+}
+
+int32_t json_object_get_int(struct json_object *jso)
 {
-  return sprintbuf(pb, "%d", jso->o.c_int);
+  int64_t cint64;
+  enum json_type o_type;
+
+  if(!jso) return 0;
+
+  o_type = jso->o_type;
+  cint64 = jso->o.c_int64;
+
+  if (o_type == json_type_string)
+  {
+       /*
+        * 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)
+               return 0; /* whoops, it didn't work. */
+       o_type = json_type_int;
+  }
+
+  switch(o_type) {
+  case json_type_int:
+       /* Make sure we return the correct values for out of range numbers. */
+       if (cint64 <= INT32_MIN)
+               return INT32_MIN;
+       else if (cint64 >= INT32_MAX)
+               return INT32_MAX;
+       else
+               return (int32_t)cint64;
+  case json_type_double:
+    return (int32_t)jso->o.c_double;
+  case json_type_boolean:
+    return jso->o.c_boolean;
+  default:
+    return 0;
+  }
 }
 
-struct json_object* json_object_new_int(int i)
+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_int = i;
+  jso->o.c_int64 = i;
   return jso;
 }
 
-int json_object_get_int(struct json_object *jso)
+int64_t json_object_get_int64(struct json_object *jso)
 {
-  int cint;
+   int64_t cint;
 
   if(!jso) return 0;
   switch(jso->o_type) {
   case json_type_int:
-    return jso->o.c_int;
+    return jso->o.c_int64;
   case json_type_double:
-    return (int)jso->o.c_double;
+    return (int64_t)jso->o.c_double;
   case json_type_boolean:
     return jso->o.c_boolean;
   case json_type_string:
-    if(sscanf(jso->o.c_string, "%d", &cint) == 1) return cint;
+       if (json_parse_int64(jso->o.c_string.str, &cint) == 0) return cint;
   default:
     return 0;
   }
@@ -354,9 +459,11 @@ int json_object_get_int(struct json_object *jso)
 /* json_object_double */
 
 static int json_object_double_to_json_string(struct json_object* jso,
-                                            struct printbuf *pb)
+                                            struct printbuf *pb,
+                                            int level,
+                                                int flags)
 {
-  return sprintbuf(pb, "%lf", jso->o.c_double);
+  return sprintbuf(pb, "%f", jso->o.c_double);
 }
 
 struct json_object* json_object_new_double(double d)
@@ -377,11 +484,11 @@ double json_object_get_double(struct json_object *jso)
   case json_type_double:
     return jso->o.c_double;
   case json_type_int:
-    return jso->o.c_int;
+    return jso->o.c_int64;
   case json_type_boolean:
     return jso->o.c_boolean;
   case json_type_string:
-    if(sscanf(jso->o.c_string, "%lf", &cdouble) == 1) return cdouble;
+    if(sscanf(jso->o.c_string.str, "%lf", &cdouble) == 1) return cdouble;
   default:
     return 0.0;
   }
@@ -391,17 +498,19 @@ double json_object_get_double(struct json_object *jso)
 /* json_object_string */
 
 static int json_object_string_to_json_string(struct json_object* jso,
-                                            struct printbuf *pb)
+                                            struct printbuf *pb,
+                                            int level,
+                                                int flags)
 {
   sprintbuf(pb, "\"");
-  json_escape_str(pb, jso->o.c_string);
+  json_escape_str(pb, jso->o.c_string.str, jso->o.c_string.len);
   sprintbuf(pb, "\"");
   return 0;
 }
 
 static void json_object_string_delete(struct json_object* jso)
 {
-  free(jso->o.c_string);
+  free(jso->o.c_string.str);
   json_object_generic_delete(jso);
 }
 
@@ -411,7 +520,8 @@ struct json_object* json_object_new_string(const char *s)
   if(!jso) return NULL;
   jso->_delete = &json_object_string_delete;
   jso->_to_json_string = &json_object_string_to_json_string;
-  jso->o.c_string = strdup(s);
+  jso->o.c_string.str = strdup(s);
+  jso->o.c_string.len = strlen(s);
   return jso;
 }
 
@@ -421,7 +531,9 @@ struct json_object* json_object_new_string_len(const char *s, int len)
   if(!jso) return NULL;
   jso->_delete = &json_object_string_delete;
   jso->_to_json_string = &json_object_string_to_json_string;
-  jso->o.c_string = strndup(s, len);
+  jso->o.c_string.str = malloc(len);
+  memcpy(jso->o.c_string.str, (void *)s, len);
+  jso->o.c_string.len = len;
   return jso;
 }
 
@@ -430,30 +542,65 @@ 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;
+    return jso->o.c_string.str;
   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;
+  }
+}
+
 
 /* json_object_array */
 
 static int json_object_array_to_json_string(struct json_object* jso,
-                                           struct printbuf *pb)
-{
-  int i;
-  sprintbuf(pb, "[");
-  for(i=0; i < json_object_array_length(jso); i++) {
-         struct json_object *val;
-         if(i) { sprintbuf(pb, ", "); }
-         else { sprintbuf(pb, " "); }
-
-      val = json_object_array_get_idx(jso, i);
-         if(val == NULL) { sprintbuf(pb, "null"); }
-         else { val->_to_json_string(val, pb); }
-  }
-  return sprintbuf(pb, " ]");
+                                            struct printbuf *pb,
+                                            int level,
+                                            int flags)
+{
+       int had_children = 0;
+       int ii;
+       sprintbuf(pb, "[");
+       if (flags & JSON_C_TO_STRING_PRETTY)
+               sprintbuf(pb, "\n");
+       for(ii=0; ii < json_object_array_length(jso); ii++)
+       {
+               struct json_object *val;
+               if (had_children)
+               {
+                       sprintbuf(pb, ",");
+                       if (flags & JSON_C_TO_STRING_PRETTY)
+                               sprintbuf(pb, "\n");
+               }
+               had_children = 1;
+               if (flags & JSON_C_TO_STRING_SPACED)
+                       sprintbuf(pb, " ");
+               indent(pb, level + 1, flags);
+               val = json_object_array_get_idx(jso, ii);
+               if(val == NULL)
+                       sprintbuf(pb, "null");
+               else
+                       val->_to_json_string(val, pb, level+1, flags);
+       }
+       if (flags & JSON_C_TO_STRING_PRETTY)
+       {
+               if (had_children)
+                       sprintbuf(pb, "\n");
+               indent(pb,level,flags);
+       }
+
+       if (flags & JSON_C_TO_STRING_SPACED)
+               return sprintbuf(pb, " ]");
+       else
+               return sprintbuf(pb, "]");
 }
 
 static void json_object_array_entry_free(void *data)
@@ -488,6 +635,11 @@ struct array_list* json_object_get_array(struct json_object *jso)
   }
 }
 
+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);
+}
+
 int json_object_array_length(struct json_object *jso)
 {
   return array_list_length(jso->o.c_array);
index 80d2313..6520a9a 100644 (file)
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
  * Michael Clark <michael@metaparadigm.com>
+ * Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
  *
  * This library is free software; you can redistribute it and/or modify
  * it under the terms of the MIT license. See COPYING for details.
 #ifndef _json_object_h_
 #define _json_object_h_
 
+#include "json_inttypes.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #define JSON_OBJECT_DEF_HASH_ENTRIES 16
 
+/**
+ * A flag for the json_object_to_json_string_ext() and
+ * json_object_to_file_ext() functions which causes the output
+ * to have no extra whitespace or formatting applied.
+ */
+#define JSON_C_TO_STRING_PLAIN      0
+/**
+ * A flag for the json_object_to_json_string_ext() and
+ * json_object_to_file_ext() functions which causes the output to have
+ * minimal whitespace inserted to make things slightly more readable.
+ */
+#define JSON_C_TO_STRING_SPACED     (1<<0)
+/**
+ * A flag for the json_object_to_json_string_ext() and
+ * json_object_to_file_ext() functions which causes
+ * the output to be formatted.
+ *
+ * See the "Two Space Tab" option at http://jsonformatter.curiousconcept.com/
+ * for an example of the format.
+ */
+#define JSON_C_TO_STRING_PRETTY     (1<<1)
+
 #undef FALSE
-#define FALSE ((boolean)0)
+#define FALSE ((json_bool)0)
 
 #undef TRUE
-#define TRUE ((boolean)1)
+#define TRUE ((json_bool)1)
 
 extern const char *json_number_chars;
 extern const char *json_hex_chars;
 
+/* CAW: added for ANSI C iteration correctness */
+struct json_object_iter
+{
+       char *key;
+       struct json_object *val;
+       struct lh_entry *entry;
+};
+
 /* forward structure definitions */
 
-typedef int boolean;
+typedef int json_bool;
 typedef struct printbuf printbuf;
 typedef struct lh_table lh_table;
 typedef struct array_list array_list;
@@ -40,25 +73,31 @@ typedef struct json_tokener json_tokener;
 /* supported object types */
 
 typedef enum json_type {
+  /* If you change this, be sure to update json_type_to_name() too */
   json_type_null,
   json_type_boolean,
   json_type_double,
   json_type_int,
   json_type_object,
   json_type_array,
-  json_type_string
+  json_type_string,
 } json_type;
 
 /* reference counting functions */
 
 /**
- * Increment the reference count of json_object
+ * Increment the reference count of json_object, thereby grabbing shared 
+ * ownership of obj.
+ *
  * @param obj the json_object instance
  */
 extern struct json_object* json_object_get(struct json_object *obj);
 
 /**
- * Decrement the reference count of json_object and free if it reaches zero
+ * Decrement the reference count of json_object and free if it reaches zero.
+ * You must have ownership of obj prior to doing this or you will cause an
+ * imbalance in the reference count.
+ *
  * @param obj the json_object instance
  */
 extern void json_object_put(struct json_object *obj);
@@ -68,6 +107,7 @@ extern void json_object_put(struct json_object *obj);
  * Check if the json_object is of a given type
  * @param obj the json_object instance
  * @param type one of:
+     json_type_null (i.e. obj == NULL),
      json_type_boolean,
      json_type_double,
      json_type_int,
@@ -78,9 +118,12 @@ extern void json_object_put(struct json_object *obj);
 extern int json_object_is_type(struct json_object *obj, enum json_type type);
 
 /**
- * Get the type of the json_object
+ * Get the type of the json_object.  See also json_type_to_name() to turn this
+ * into a string suitable, for instance, for logging.
+ *
  * @param obj the json_object instance
  * @returns type being one of:
+     json_type_null (i.e. obj == NULL),
      json_type_boolean,
      json_type_double,
      json_type_int,
@@ -91,16 +134,32 @@ extern int json_object_is_type(struct json_object *obj, enum json_type type);
 extern enum json_type json_object_get_type(struct json_object *obj);
 
 
-/** Stringify object to json format
+/** Stringify object to json format.
+ * Equivalent to json_object_to_json_string_ext(obj, JSON_C_TO_STRING_SPACED)
  * @param obj the json_object instance
  * @returns a string in JSON format
  */
 extern const char* json_object_to_json_string(struct json_object *obj);
 
+/** Stringify object to json format
+ * @param obj the json_object instance
+ * @param flags formatting options, see JSON_C_TO_STRING_PRETTY and other constants
+ * @returns a string in JSON format
+ */
+extern const char* json_object_to_json_string_ext(struct json_object *obj, int
+flags);
+
 
 /* object type methods */
 
-/** Create a new empty object
+/** Create a new empty object with a reference count of 1.  The caller of
+ * this object initially has sole ownership.  Remember, when using
+ * json_object_object_add or json_object_array_put_idx, ownership will
+ * transfer to the object/array.  Call json_object_get if you want to maintain
+ * shared ownership or also add this object as a child of multiple objects or
+ * arrays.  Any ownerships you acquired but did not transfer must be released
+ * through json_object_put.
+ *
  * @returns a json_object of type json_type_object
  */
 extern struct json_object* json_object_new_object(void);
@@ -115,7 +174,13 @@ extern struct lh_table* json_object_get_object(struct json_object *obj);
  *
  * The reference count will *not* be incremented. This is to make adding
  * fields to objects in code more compact. If you want to retain a reference
- * to an added object you must wrap the passed object with json_object_get
+ * to an added object, independent of the lifetime of obj, you must wrap the
+ * passed object with json_object_get.
+ *
+ * Upon calling this, the ownership of val transfers to obj.  Thus you must
+ * make sure that you do in fact have ownership over this object.  For instance,
+ * json_object_new_object will give you ownership until you transfer it,
+ * whereas json_object_object_get does not.
  *
  * @param obj the json_object instance
  * @param key the object field name (a private copy will be duplicated)
@@ -125,16 +190,52 @@ extern void json_object_object_add(struct json_object* obj, const char *key,
                                   struct json_object *val);
 
 /** Get the json_object associate with a given object field
+ *
+ * *No* reference counts will be changed.  There is no need to manually adjust
+ * reference counts through the json_object_put/json_object_get methods unless
+ * you need to have the child (value) reference maintain a different lifetime
+ * than the owning parent (obj). Ownership of the returned value is retained
+ * by obj (do not do json_object_put unless you have done a json_object_get).
+ * If you delete the value from obj (json_object_object_del) and wish to access
+ * the returned reference afterwards, make sure you have first gotten shared
+ * ownership through json_object_get (& don't forget to do a json_object_put
+ * or transfer ownership to prevent a memory leak).
+ *
  * @param obj the json_object instance
  * @param key the object field name
  * @returns the json_object associated with the given field name
+ * @deprecated Please use json_object_object_get_ex
  */
 extern struct json_object* json_object_object_get(struct json_object* obj,
                                                  const char *key);
 
+/** Get the json_object associated with a given object field.  
+ *
+ * This returns true if the key is found, false in all other cases (including 
+ * if obj isn't a json_type_object).
+ *
+ * *No* reference counts will be changed.  There is no need to manually adjust
+ * reference counts through the json_object_put/json_object_get methods unless
+ * you need to have the child (value) reference maintain a different lifetime
+ * than the owning parent (obj).  Ownership of value is retained by obj.
+ *
+ * @param obj the json_object instance
+ * @param key the object field name
+ * @param value a pointer where to store a reference to the json_object 
+ *              associated with the given field name.
+ *
+ *              It is safe to pass a NULL value.
+ * @returns whether or not the key exists
+ */
+extern json_bool json_object_object_get_ex(struct json_object* obj,
+                                                 const char *key,
+                                                  struct json_object **value);
+
 /** Delete the given json_object field
  *
- * The reference count will be decremented for the deleted object
+ * The reference count will be decremented for the deleted object.  If there
+ * are no more owners of the value represented by this key, then the value is
+ * freed.  Otherwise, the reference to the value will remain in memory.
  *
  * @param obj the json_object instance
  * @param key the object field name
@@ -144,7 +245,8 @@ extern void json_object_object_del(struct json_object* obj, const char *key);
 /** Iterate through all keys and values of an object
  * @param obj the json_object instance
  * @param key the local name for the char* key variable defined in the body
- * @param val the local name for the json_object* object variable defined in the body
+ * @param val the local name for the json_object* object variable defined in
+ *            the body
  */
 #if defined(__GNUC__) && !defined(__STRICT_ANSI__)
 
@@ -186,6 +288,16 @@ extern struct array_list* json_object_get_array(struct json_object *obj);
  */
 extern int json_object_array_length(struct json_object *obj);
 
+/** Sorts the elements of jso of type json_type_array
+*
+* Pointers to the json_object pointers will be passed as the two arguments
+* to @sort_fn
+*
+* @param obj the json_object instance
+* @param sort_fn a sorting function
+*/
+extern void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *));
+
 /** Add an element to the end of a json_object of type json_type_array
  *
  * The reference count will *not* be incremented. This is to make adding
@@ -224,46 +336,76 @@ extern int json_object_array_put_idx(struct json_object *obj, int idx,
 extern struct json_object* json_object_array_get_idx(struct json_object *obj,
                                                     int idx);
 
-/* boolean type methods */
+/* json_bool type methods */
 
 /** Create a new empty json_object of type json_type_boolean
- * @param b a boolean TRUE or FALSE (0 or 1)
+ * @param b a json_bool TRUE or FALSE (0 or 1)
  * @returns a json_object of type json_type_boolean
  */
-extern struct json_object* json_object_new_boolean(boolean b);
+extern struct json_object* json_object_new_boolean(json_bool b);
 
-/** Get the boolean value of a json_object
+/** Get the json_bool value of a json_object
  *
- * The type is coerced to a boolean if the passed object is not a boolean.
+ * The type is coerced to a json_bool if the passed object is not a json_bool.
  * integer and double objects will return FALSE if there value is zero
  * or TRUE otherwise. If the passed object is a string it will return
  * TRUE if it has a non zero length. If any other object type is passed
  * TRUE will be returned if the object is not NULL.
  *
  * @param obj the json_object instance
- * @returns a boolean
+ * @returns a json_bool
  */
-extern boolean json_object_get_boolean(struct json_object *obj);
+extern json_bool json_object_get_boolean(struct json_object *obj);
 
 
 /* int type methods */
 
 /** Create a new empty json_object of type json_type_int
+ * Note that values are stored as 64-bit values internally.
+ * To ensure the full range is maintained, use json_object_new_int64 instead.
+ * @param i the integer
+ * @returns a json_object of type json_type_int
+ */
+extern struct json_object* json_object_new_int(int32_t i);
+
+
+/** Create a new empty json_object of type json_type_int
  * @param i the integer
  * @returns a json_object of type json_type_int
  */
-extern struct json_object* json_object_new_int(int i);
+extern struct json_object* json_object_new_int64(int64_t i);
+
 
 /** Get the int value of a json_object
  *
  * The type is coerced to a int if the passed object is not a int.
  * double objects will return their integer conversion. Strings will be
- * parsed as an integer. If no conversion exists then 0 is returned.
+ * parsed as an integer. If no conversion exists then 0 is returned
+ * and errno is set to EINVAL. null is equivalent to 0 (no error values set)
+ *
+ * Note that integers are stored internally as 64-bit values.
+ * If the value of too big or too small to fit into 32-bit, INT32_MAX or
+ * INT32_MIN are returned, respectively.
  *
  * @param obj the json_object instance
  * @returns an int
  */
-extern int json_object_get_int(struct json_object *obj);
+extern int32_t json_object_get_int(struct json_object *obj);
+
+/** Get the int value of a json_object
+ *
+ * The type is coerced to a int64 if the passed object is not a int64.
+ * double objects will return their int64 conversion. Strings will be
+ * parsed as an int64. If no conversion exists then 0 is returned.
+ *
+ * NOTE: Set errno to 0 directly before a call to this function to determine
+ * whether or not conversion was successful (it does not clear the value for
+ * you).
+ *
+ * @param obj the json_object instance
+ * @returns an int64
+ */
+extern int64_t json_object_get_int64(struct json_object *obj);
 
 
 /* double type methods */
@@ -274,14 +416,28 @@ extern int json_object_get_int(struct json_object *obj);
  */
 extern struct json_object* json_object_new_double(double d);
 
-/** Get the double value of a json_object
+/** Get the double floating point value of a json_object
  *
  * The type is coerced to a double if the passed object is not a double.
- * integer objects will return their dboule conversion. Strings will be
- * parsed as a double. If no conversion exists then 0.0 is returned.
+ * integer objects will return their double conversion. Strings will be
+ * parsed as a double. If no conversion exists then 0.0 is returned and
+ * errno is set to EINVAL. null is equivalent to 0 (no error values set)
+ *
+ * If the value is too big to fit in a double, then the value is set to
+ * the closest infinity with errno set to ERANGE. If strings cannot be
+ * converted to their double value, then EINVAL is set & NaN is returned.
+ *
+ * Arrays of length 0 are interpreted as 0 (with no error flags set).
+ * Arrays of length 1 are effectively cast to the equivalent object and
+ * converted using the above rules.  All other arrays set the error to
+ * EINVAL & return NaN.
+ *
+ * NOTE: Set errno to 0 directly before a call to this function to
+ * determine whether or not conversion was successful (it does not clear
+ * the value for you).
  *
  * @param obj the json_object instance
- * @returns an double
+ * @returns a double floating point number
  */
 extern double json_object_get_double(struct json_object *obj);
 
@@ -312,6 +468,16 @@ extern struct json_object* json_object_new_string_len(const char *s, int len);
  */
 extern const char* json_object_get_string(struct json_object *obj);
 
+/** Get the string length of a json_object
+ *
+ * If the passed object is not of type json_type_string then zero
+ * will be returned.
+ *
+ * @param obj the json_object instance
+ * @returns int
+ */
+extern int json_object_get_string_len(struct json_object *obj);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/json_object_iterator.c b/json_object_iterator.c
new file mode 100644 (file)
index 0000000..7066649
--- /dev/null
@@ -0,0 +1,168 @@
+/**
+*******************************************************************************
+* @file json_object_iterator.c
+*
+* Copyright (c) 2009-2012 Hewlett-Packard Development Company, L.P.
+*
+* This library is free software; you can redistribute it and/or modify
+* it under the terms of the MIT license. See COPYING for details.
+*
+* @brief  json-c forces clients to use its private data
+*         structures for JSON Object iteration.  This API
+*         implementation corrects that by abstracting the
+*         private json-c details.
+*
+*******************************************************************************
+*/
+
+#include <stddef.h>
+
+#include "json.h"
+#include "json_object_private.h"
+
+#include "json_object_iterator.h"
+
+/**
+ * How It Works
+ *
+ * For each JSON Object, json-c maintains a linked list of zero
+ * or more lh_entry (link-hash entry) structures inside the
+ * Object's link-hash table (lh_table).
+ *
+ * Each lh_entry structure on the JSON Object's linked list
+ * represents a single name/value pair.  The "next" field of the
+ * last lh_entry in the list is set to NULL, which terminates
+ * the list.
+ *
+ * We represent a valid iterator that refers to an actual
+ * name/value pair via a pointer to the pair's lh_entry
+ * structure set as the iterator's opaque_ field.
+ *
+ * We follow json-c's current pair list representation by
+ * representing a valid "end" iterator (one that refers past the
+ * last pair) with a NULL value in the iterator's opaque_ field.
+ *
+ * A JSON Object without any pairs in it will have the "head"
+ * field of its lh_table structure set to NULL.  For such an
+ * object, json_object_iter_begin will return an iterator with
+ * the opaque_ field set to NULL, which is equivalent to the
+ * "end" iterator.
+ *
+ * When iterating, we simply update the iterator's opaque_ field
+ * to point to the next lh_entry structure in the linked list.
+ * opaque_ will become NULL once we iterate past the last pair
+ * in the list, which makes the iterator equivalent to the "end"
+ * iterator.
+ */
+
+/// Our current representation of the "end" iterator;
+///
+/// @note May not always be NULL
+static const void* kObjectEndIterValue = NULL;
+
+/**
+ * ****************************************************************************
+ */
+struct json_object_iterator
+json_object_iter_begin(struct json_object* obj)
+{
+    struct json_object_iterator iter;
+    struct lh_table* pTable;
+
+    /// @note json_object_get_object will return NULL if passed NULL
+    ///       or a non-json_type_object instance
+    pTable = json_object_get_object(obj);
+    JASSERT(NULL != pTable);
+
+    /// @note For a pair-less Object, head is NULL, which matches our
+    ///       definition of the "end" iterator
+    iter.opaque_ = pTable->head;
+    return iter;
+}
+
+/**
+ * ****************************************************************************
+ */
+struct json_object_iterator
+json_object_iter_end(const struct json_object* obj)
+{
+    struct json_object_iterator iter;
+
+    JASSERT(NULL != obj);
+    JASSERT(json_object_is_type(obj, json_type_object));
+
+    iter.opaque_ = kObjectEndIterValue;
+
+    return iter;
+}
+
+/**
+ * ****************************************************************************
+ */
+void
+json_object_iter_next(struct json_object_iterator* iter)
+{
+    JASSERT(NULL != iter);
+    JASSERT(kObjectEndIterValue != iter->opaque_);
+
+    iter->opaque_ = ((struct lh_entry *)iter->opaque_)->next;
+}
+
+
+/**
+ * ****************************************************************************
+ */
+const char*
+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);
+}
+
+
+/**
+ * ****************************************************************************
+ */
+struct json_object*
+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);
+}
+
+
+/**
+ * ****************************************************************************
+ */
+json_bool
+json_object_iter_equal(const struct json_object_iterator* iter1,
+                       const struct json_object_iterator* iter2)
+{
+    JASSERT(NULL != iter1);
+    JASSERT(NULL != iter2);
+
+    return (iter1->opaque_ == iter2->opaque_);
+}
+
+
+/**
+ * ****************************************************************************
+ */
+struct json_object_iterator
+json_object_iter_init_default(void)
+{
+    struct json_object_iterator iter;
+
+    /**
+     * @note Make this a negative, invalid value, such that
+     *       accidental access to it would likely be trapped by the
+     *       hardware as an invalid address.
+     */
+    iter.opaque_ = NULL;
+
+    return iter;
+}
diff --git a/json_object_iterator.h b/json_object_iterator.h
new file mode 100644 (file)
index 0000000..f6e7ca6
--- /dev/null
@@ -0,0 +1,239 @@
+/**
+*******************************************************************************
+* @file json_object_iterator.h
+*
+* Copyright (c) 2009-2012 Hewlett-Packard Development Company, L.P.
+*
+* This library is free software; you can redistribute it and/or modify
+* it under the terms of the MIT license. See COPYING for details.
+*
+* @brief  json-c forces clients to use its private data
+*         structures for JSON Object iteration.  This API
+*         corrects that by abstracting the private json-c
+*         details.
+*
+* API attributes: <br>
+*   * Thread-safe: NO<br>
+*   * Reentrant: NO
+*
+*******************************************************************************
+*/
+
+
+#ifndef JSON_OBJECT_ITERATOR_H
+#define JSON_OBJECT_ITERATOR_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Forward declaration for the opaque iterator information.
+ */
+struct json_object_iter_info_;
+
+/**
+ * The opaque iterator that references a name/value pair within
+ * a JSON Object instance or the "end" iterator value.
+ */
+struct json_object_iterator {
+    const void* opaque_;
+};
+
+
+/**
+ * forward declaration of json-c's JSON value instance structure
+ */
+struct json_object;
+
+
+/**
+ * Initializes an iterator structure to a "default" value that
+ * is convenient for initializing an iterator variable to a
+ * default state (e.g., initialization list in a class'
+ * constructor).
+ *
+ * @code
+ * struct json_object_iterator iter = json_object_iter_init_default();
+ * MyClass() : iter_(json_object_iter_init_default())
+ * @endcode
+ *
+ * @note The initialized value doesn't reference any specific
+ *       pair, is considered an invalid iterator, and MUST NOT
+ *       be passed to any json-c API that expects a valid
+ *       iterator.
+ *
+ * @note User and internal code MUST NOT make any assumptions
+ *       about and dependencies on the value of the "default"
+ *       iterator value.
+ *
+ * @return json_object_iterator
+ */
+struct json_object_iterator
+json_object_iter_init_default(void);
+
+/** Retrieves an iterator to the first pair of the JSON Object.
+ *
+ * @warning    Any modification of the underlying pair invalidates all
+ *             iterators to that pair.
+ *
+ * @param obj  JSON Object instance (MUST be of type json_object)
+ *
+ * @return json_object_iterator If the JSON Object has at
+ *              least one pair, on return, the iterator refers
+ *              to the first pair. If the JSON Object doesn't
+ *              have any pairs, the returned iterator is
+ *              equivalent to the "end" iterator for the same
+ *              JSON Object instance.
+ *
+ * @code
+ * struct json_object_iterator it;
+ * struct json_object_iterator itEnd;
+ * struct json_object* obj;
+ *
+ * obj = json_tokener_parse("{'first':'george', 'age':100}");
+ * it = json_object_iter_begin(obj);
+ * itEnd = json_object_iter_end(obj);
+ *
+ * while (!json_object_iter_equal(&it, &itEnd)) {
+ *     printf("%s\n",
+ *            json_object_iter_peek_name(&it));
+ *     json_object_iter_next(&it);
+ * }
+ *
+ * @endcode
+ */
+struct json_object_iterator
+json_object_iter_begin(struct json_object* obj);
+
+/** Retrieves the iterator that represents the position beyond the
+ *  last pair of the given JSON Object instance.
+ *
+ *  @warning Do NOT write code that assumes that the "end"
+ *        iterator value is NULL, even if it is so in a
+ *        particular instance of the implementation.
+ *
+ *  @note The reason we do not (and MUST NOT) provide
+ *        "json_object_iter_is_end(json_object_iterator* iter)"
+ *        type of API is because it would limit the underlying
+ *        representation of name/value containment (or force us
+ *        to add additional, otherwise unnecessary, fields to
+ *        the iterator structure). The "end" iterator and the
+ *        equality test method, on the other hand, permit us to
+ *        cleanly abstract pretty much any reasonable underlying
+ *        representation without burdening the iterator
+ *        structure with unnecessary data.
+ *
+ *  @note For performance reasons, memorize the "end" iterator prior
+ *        to any loop.
+ *
+ * @param obj JSON Object instance (MUST be of type json_object)
+ *
+ * @return json_object_iterator On return, the iterator refers
+ *              to the "end" of the Object instance's pairs
+ *              (i.e., NOT the last pair, but "beyond the last
+ *              pair" value)
+ */
+struct json_object_iterator
+json_object_iter_end(const struct json_object* obj);
+
+/** Returns an iterator to the next pair, if any
+ *
+ * @warning    Any modification of the underlying pair
+ *             invalidates all iterators to that pair.
+ *
+ * @param iter [IN/OUT] Pointer to iterator that references a
+ *         name/value pair; MUST be a valid, non-end iterator.
+ *         WARNING: bad things will happen if invalid or "end"
+ *         iterator is passed. Upon return will contain the
+ *         reference to the next pair if there is one; if there
+ *         are no more pairs, will contain the "end" iterator
+ *         value, which may be compared against the return value
+ *         of json_object_iter_end() for the same JSON Object
+ *         instance.
+ */
+void
+json_object_iter_next(struct json_object_iterator* iter);
+
+
+/** Returns a const pointer to the name of the pair referenced
+ *  by the given iterator.
+ *
+ * @param iter pointer to iterator that references a name/value
+ *             pair; MUST be a valid, non-end iterator.
+ *
+ * @warning    bad things will happen if an invalid or
+ *                     "end" iterator is passed.
+ *
+ * @return const char* Pointer to the name of the referenced
+ *         name/value pair.  The name memory belongs to the
+ *         name/value pair, will be freed when the pair is
+ *         deleted or modified, and MUST NOT be modified or
+ *         freed by the user.
+ */
+const char*
+json_object_iter_peek_name(const struct json_object_iterator* iter);
+
+
+/** Returns a pointer to the json-c instance representing the
+ *  value of the referenced name/value pair, without altering
+ *  the instance's reference count.
+ *
+ * @param iter         pointer to iterator that references a name/value
+ *                     pair; MUST be a valid, non-end iterator.
+ *
+ * @warning    bad things will happen if invalid or
+ *             "end" iterator is passed.
+ *
+ * @return struct json_object* Pointer to the json-c value
+ *         instance of the referenced name/value pair;  the
+ *         value's reference count is not changed by this
+ *         function: if you plan to hold on to this json-c node,
+ *         take a look at json_object_get() and
+ *         json_object_put(). IMPORTANT: json-c API represents
+ *         the JSON Null value as a NULL json_object instance
+ *         pointer.
+ */
+struct json_object*
+json_object_iter_peek_value(const struct json_object_iterator* iter);
+
+
+/** Tests two iterators for equality.  Typically used to test
+ *  for end of iteration by comparing an iterator to the
+ *  corresponding "end" iterator (that was derived from the same
+ *  JSON Object instance).
+ *
+ *  @note The reason we do not (and MUST NOT) provide
+ *        "json_object_iter_is_end(json_object_iterator* iter)"
+ *        type of API is because it would limit the underlying
+ *        representation of name/value containment (or force us
+ *        to add additional, otherwise unnecessary, fields to
+ *        the iterator structure). The equality test method, on
+ *        the other hand, permits us to cleanly abstract pretty
+ *        much any reasonable underlying representation.
+ *
+ * @param iter1 Pointer to first valid, non-NULL iterator
+ * @param iter2 POinter to second valid, non-NULL iterator
+ *
+ * @warning    if a NULL iterator pointer or an uninitialized
+ *             or invalid iterator, or iterators derived from
+ *             different JSON Object instances are passed, bad things
+ *             will happen!
+ *
+ * @return json_bool non-zero if iterators are equal (i.e., both
+ *         reference the same name/value pair or are both at
+ *         "end"); zero if they are not equal.
+ */
+json_bool
+json_object_iter_equal(const struct json_object_iterator* iter1,
+                       const struct json_object_iterator* iter2);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif // JSON_OBJECT_ITERATOR_H
index 9fb4011..597332b 100644 (file)
@@ -18,7 +18,9 @@ extern "C" {
 
 typedef void (json_object_delete_fn)(struct json_object *o);
 typedef int (json_object_to_json_string_fn)(struct json_object *o,
-                                           struct printbuf *pb);
+                                               struct printbuf *pb,
+                                               int level,
+                                               int flags);
 
 struct json_object
 {
@@ -28,23 +30,18 @@ struct json_object
   int _ref_count;
   struct printbuf *_pb;
   union data {
-    boolean c_boolean;
+    json_bool c_boolean;
     double c_double;
-    int c_int;
+    int64_t c_int64;
     struct lh_table *c_object;
     struct array_list *c_array;
-    char *c_string;
+    struct {
+        char *str;
+        int len;
+    } c_string;
   } o;
 };
 
-/* CAW: added for ANSI C iteration correctness */
-struct json_object_iter
-{
-       char *key;
-       struct json_object *val;
-       struct lh_entry *entry;
-};
-
 #ifdef __cplusplus
 }
 #endif
index 04f11ba..1c82484 100644 (file)
 #include <stddef.h>
 #include <ctype.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_tokener.h"
-
+#include "json_util.h"
 
 #if !HAVE_STRNCASECMP && defined(_MSC_VER)
   /* MSC has the version as _strnicmp */
@@ -41,10 +43,11 @@ static const char* json_null_str = "null";
 static const char* json_true_str = "true";
 static const char* json_false_str = "false";
 
+// XXX after v0.10 this array will become static:
 const char* json_tokener_errors[] = {
   "success",
   "continue",
-  "nesting to deep",
+  "nesting too deep",
   "unexpected end of data",
   "unexpected character",
   "null expected",
@@ -58,6 +61,24 @@ const char* json_tokener_errors[] = {
   "expected comment",
 };
 
+const char *json_tokener_error_desc(enum json_tokener_error jerr)
+{
+       if (jerr < 0 || jerr > sizeof(json_tokener_errors))
+               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)
+{
+       return tok->err;
+}
+
+/* Stuff for decoding unicode sequences */
+#define IS_HIGH_SURROGATE(uc) (((uc) & 0xFC00) == 0xD800)
+#define IS_LOW_SURROGATE(uc)  (((uc) & 0xFC00) == 0xDC00)
+#define DECODE_SURROGATE_PAIR(hi,lo) ((((hi) & 0x3FF) << 10) + ((lo) & 0x3FF) + 0x10000)
+static unsigned char utf8_replacement_char[3] = { 0xEF, 0xBF, 0xBD };
+
 
 struct json_tokener* json_tokener_new(void)
 {
@@ -101,15 +122,30 @@ void json_tokener_reset(struct json_tokener *tok)
 
 struct json_object* json_tokener_parse(const char *str)
 {
-  struct json_tokener* tok;
-  struct json_object* obj;
-
-  tok = json_tokener_new();
-  obj = json_tokener_parse_ex(tok, str, -1);
-  if(tok->err != json_tokener_success)
-    obj = (struct json_object*)error_ptr(-tok->err);
-  json_tokener_free(tok);
-  return obj;
+    enum json_tokener_error jerr_ignored;
+    struct json_object* obj;
+    obj = json_tokener_parse_verbose(str, &jerr_ignored);
+    return obj;
+}
+
+struct json_object* json_tokener_parse_verbose(const char *str, enum json_tokener_error *error)
+{
+    struct json_tokener* tok;
+    struct json_object* obj;
+
+    tok = json_tokener_new();
+    if (!tok)
+      return NULL;
+    obj = json_tokener_parse_ex(tok, str, -1);
+    *error = tok->err;
+    if(tok->err != json_tokener_success) {
+               if (obj != NULL)
+                       json_object_put(obj);
+        obj = NULL;
+    }
+
+    json_tokener_free(tok);
+    return obj;
 }
 
 
@@ -176,6 +212,7 @@ char* strndup(const char* str, size_t n)
 #define ADVANCE_CHAR(str, tok) \
   ( ++(str), ((tok)->char_offset)++, c)
 
+
 /* End optimization macro defs */
 
 
@@ -195,7 +232,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
 
     case json_tokener_state_eatws:
       /* Advance until we change state */
-      while (isspace(c)) {
+      while (isspace((int)c)) {
        if ((!ADVANCE_CHAR(str, tok)) || (!POP_CHAR(c, tok)))
          goto out;
       }
@@ -398,40 +435,97 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
       break;
 
     case json_tokener_state_escape_unicode:
-            /* Note that the following code is inefficient for handling large
-       * chunks of extended chars, calling printbuf_memappend() once
-       * for each multi-byte character of input.
-       * This is a good area for future optimization.
-       */
        {
-         /* Advance until we change state */
+          unsigned int got_hi_surrogate = 0;
+
+         /* 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(tok->st_pos == 4) {
-               unsigned char utf_out[3];
+               unsigned char unescaped_utf[4];
+
+                if (got_hi_surrogate) {
+                 if (IS_LOW_SURROGATE(tok->ucs_char)) {
+                    /* Recalculate the ucs_char, then fall thru to process normally */
+                    tok->ucs_char = DECODE_SURROGATE_PAIR(got_hi_surrogate, tok->ucs_char);
+                  } else {
+                    /* Hi surrogate was not followed by a low surrogate */
+                    /* Replace the hi and process the rest normally */
+                   printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
+                  }
+                  got_hi_surrogate = 0;
+                }
+
                if (tok->ucs_char < 0x80) {
-                 utf_out[0] = tok->ucs_char;
-                 printbuf_memappend_fast(tok->pb, (char*)utf_out, 1);
+                 unescaped_utf[0] = tok->ucs_char;
+                 printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 1);
                } else if (tok->ucs_char < 0x800) {
-                 utf_out[0] = 0xc0 | (tok->ucs_char >> 6);
-                 utf_out[1] = 0x80 | (tok->ucs_char & 0x3f);
-                 printbuf_memappend_fast(tok->pb, (char*)utf_out, 2);
+                 unescaped_utf[0] = 0xc0 | (tok->ucs_char >> 6);
+                 unescaped_utf[1] = 0x80 | (tok->ucs_char & 0x3f);
+                 printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 2);
+               } else if (IS_HIGH_SURROGATE(tok->ucs_char)) {
+                  /* Got a high surrogate.  Remember it and look for the
+                   * the beginning of another sequence, which should be the
+                   * low surrogate.
+                   */
+                  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) &&
+                      (str[1] == '\\') &&
+                      (str[2] == 'u'))
+                  {
+                   ADVANCE_CHAR(str, tok);
+                   ADVANCE_CHAR(str, tok);
+
+                    /* Advance to the first char of the next sequence and
+                     * continue processing with the next sequence.
+                     */
+                   if (!ADVANCE_CHAR(str, tok) || !POP_CHAR(c, tok)) {
+                     printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
+                     goto out;
+                    }
+                   tok->ucs_char = 0;
+                    tok->st_pos = 0;
+                    continue; /* other json_tokener_state_escape_unicode */
+                  } else {
+                    /* Got a high surrogate without another sequence following
+                     * it.  Put a replacement char in for the hi surrogate
+                     * and pretend we finished.
+                     */
+                   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 */
+                 printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
+                } else if (tok->ucs_char < 0x10000) {
+                 unescaped_utf[0] = 0xe0 | (tok->ucs_char >> 12);
+                 unescaped_utf[1] = 0x80 | ((tok->ucs_char >> 6) & 0x3f);
+                 unescaped_utf[2] = 0x80 | (tok->ucs_char & 0x3f);
+                 printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 3);
+               } else if (tok->ucs_char < 0x110000) {
+                 unescaped_utf[0] = 0xf0 | ((tok->ucs_char >> 18) & 0x07);
+                 unescaped_utf[1] = 0x80 | ((tok->ucs_char >> 12) & 0x3f);
+                 unescaped_utf[2] = 0x80 | ((tok->ucs_char >> 6) & 0x3f);
+                 unescaped_utf[3] = 0x80 | (tok->ucs_char & 0x3f);
+                 printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 4);
                } else {
-                 utf_out[0] = 0xe0 | (tok->ucs_char >> 12);
-                 utf_out[1] = 0x80 | ((tok->ucs_char >> 6) & 0x3f);
-                 utf_out[2] = 0x80 | (tok->ucs_char & 0x3f);
-                 printbuf_memappend_fast(tok->pb, (char*)utf_out, 3);
-               }
+                  /* Don't know what we got--insert the replacement char */
+                 printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
+                }
                state = saved_state;
                break;
              }
            } else {
              tok->err = json_tokener_error_parse_string;
              goto out;
-                 }
-         if (!ADVANCE_CHAR(str, tok) || !POP_CHAR(c, tok))
+           }
+         if (!ADVANCE_CHAR(str, tok) || !POP_CHAR(c, tok)) {
+            if (got_hi_surrogate) /* Clean up any pending chars */
+             printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
            goto out;
+         }
        }
       }
       break;
@@ -468,7 +562,8 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
        int case_len=0;
        while(c && strchr(json_number_chars, c)) {
          ++case_len;
-         if(c == '.' || c == 'e') tok->is_double = 1;
+         if(c == '.' || c == 'e' || c == 'E')
+           tok->is_double = 1;
          if (!ADVANCE_CHAR(str, tok) || !POP_CHAR(c, tok)) {
            printbuf_memappend_fast(tok->pb, case_start, case_len);
            goto out;
@@ -478,11 +573,11 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
           printbuf_memappend_fast(tok->pb, case_start, case_len);
       }
       {
-        int numi;
-        double numd;
-        if(!tok->is_double && sscanf(tok->pb->buf, "%d", &numi) == 1) {
-          current = json_object_new_int(numi);
-        } else if(tok->is_double && sscanf(tok->pb->buf, "%lf", &numd) == 1) {
+       int64_t num64;
+       double  numd;
+       if (!tok->is_double && json_parse_int64(tok->pb->buf, &num64) == 0) {
+               current = json_object_new_int64(num64);
+       } else if(tok->is_double && sscanf(tok->pb->buf, "%lf", &numd) == 1) {
           current = json_object_new_double(numd);
         } else {
           tok->err = json_tokener_error_parse_number;
@@ -621,7 +716,17 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
       tok->err = json_tokener_error_parse_eof;
   }
 
-  if(tok->err == json_tokener_success) return json_object_get(current);
+  if (tok->err == json_tokener_success) 
+  {
+    json_object *ret = json_object_get(current);
+       int ii;
+
+       /* Partially reset, so we parse additional objects on subsequent calls. */
+    for(ii = tok->depth; ii >= 0; ii--)
+      json_tokener_reset_level(tok, ii);
+    return ret;
+  }
+
   MC_DEBUG("json_tokener_parse_ex: error %s at offset %d\n",
           json_tokener_errors[tok->err], tok->char_offset);
   return NULL;
index 7d40b40..d104c75 100644 (file)
@@ -76,18 +76,108 @@ struct json_tokener
   char *str;
   struct printbuf *pb;
   int depth, is_double, st_pos, char_offset;
-  ptrdiff_t err;
+  enum json_tokener_error err;
   unsigned int ucs_char;
   char quote_char;
   struct json_tokener_srec stack[JSON_TOKENER_MAX_DEPTH];
 };
 
+/**
+ * Given an error previously returned by json_tokener_get_error(),
+ * return a human readable description of the error.
+ *
+ * @return a generic error message is returned if an invalid error value is provided.
+ */
+const char *json_tokener_error_desc(enum json_tokener_error jerr);
+
+/** 
+ * @b XXX do not use json_tokener_errors directly.  
+ * After v0.10 this will be removed.
+ *
+ * See json_tokener_error_desc() instead.
+ */
 extern const char* json_tokener_errors[];
 
+/**
+ * Retrieve the error caused by the last call to json_tokener_parse_ex(),
+ * or json_tokener_success if there is no error.
+ *
+ * When parsing a JSON string in pieces, if the tokener is in the middle
+ * of parsing this will return json_tokener_continue.
+ *
+ * See also json_tokener_error_desc().
+ */
+enum json_tokener_error json_tokener_get_error(struct json_tokener *tok);
+
 extern struct json_tokener* json_tokener_new(void);
 extern 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);
+
+/** 
+ * Parse a string and return a non-NULL json_object if a valid JSON value
+ * is found.  The string does not need to be a JSON object or array;
+ * it can also be a string, number or boolean value.
+ *
+ * A partial JSON string can be parsed.  If the parsing is incomplete,
+ * NULL will be returned and json_tokener_get_error() will be return 
+ * json_tokener_continue.
+ * json_tokener_parse_ex() can then be called with additional bytes in str
+ * to continue the parsing.  
+ *
+ * If json_tokener_parse_ex() returns NULL and the error anything other than
+ * json_tokener_continue, a fatal error has occurred and parsing must be
+ * halted.  Then tok object must not be re-used until json_tokener_reset() is
+ * called.
+ *
+ * When a valid JSON value is parsed, a non-NULL json_object will be
+ * returned.  Also, json_tokener_get_error() will return json_tokener_success.
+ * Be sure to check the type with json_object_is_type() or
+ * json_object_get_type() before using the object.
+ *
+ * @b XXX this shouldn't use internal fields:
+ * Trailing characters after the parsed value do not automatically cause an 
+ * error.  It is up to the caller to decide whether to treat this as an
+ * error or to handle the additional characters, perhaps by parsing another
+ * json value starting from that point.
+ *
+ * Extra characters can be detected by comparing the tok->char_offset against
+ * the length of the last len parameter passed in.
+ *
+ * The tokener does \b not maintain an internal buffer so the caller is
+ * responsible for calling json_tokener_parse_ex with an appropriate str
+ * parameter starting with the extra characters.
+ *
+ * Example:
+ * @code
+json_object *jobj = NULL;
+const char *mystring = NULL;
+int stringlen = 0;
+enum json_tokener_error jerr;
+do {
+       mystring = ...  // get JSON string, e.g. read from file, etc...
+       stringlen = strlen(mystring);
+       jobj = json_tokener_parse_ex(tok, mystring, stringlen);
+} while ((jerr = json_tokener_get_error(tok)) == json_tokener_continue);
+if (jerr != json_tokener_success)
+{
+       fprintf(stderr, "Error: %s\n", json_tokener_error_desc(jerr));
+       // Handle errors, as appropriate for your application.
+}
+if (tok->char_offset < stringlen) // XXX shouldn't access internal fields
+{
+       // Handle extra characters after parsed object as desired.
+       // e.g. issue an error, parse another object from that point, etc...
+}
+// Success, use jobj here.
+
+@endcode
+ *
+ * @param tok a json_tokener previously allocated with json_tokener_new()
+ * @param str an string with any valid JSON expression, or portion of.  This does not need to be null terminated.
+ * @param len the length of str
+ */
 extern struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
                                                 const char *str, int len);
 
index af6f3d6..e551d2d 100644 (file)
@@ -10,6 +10,7 @@
  */
 
 #include "config.h"
+#undef realloc
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -17,6 +18,7 @@
 #include <limits.h>
 #include <string.h>
 #include <errno.h>
+#include <ctype.h>
 
 #if HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #include "bits.h"
 #include "debug.h"
 #include "printbuf.h"
+#include "json_inttypes.h"
 #include "json_object.h"
 #include "json_tokener.h"
 #include "json_util.h"
 
-struct json_object* json_object_from_file(char *filename)
+struct json_object* json_object_from_file(const char *filename)
 {
   struct printbuf *pb;
   struct json_object *obj;
@@ -62,11 +65,12 @@ struct json_object* json_object_from_file(char *filename)
   if((fd = open(filename, O_RDONLY)) < 0) {
     MC_ERROR("json_object_from_file: error reading file %s: %s\n",
             filename, strerror(errno));
-    return (struct json_object*)error_ptr(-1);
+    return NULL; // XAX this is an API change!
   }
   if(!(pb = printbuf_new())) {
+    close(fd);
     MC_ERROR("json_object_from_file: printbuf_new failed\n");
-    return (struct json_object*)error_ptr(-1);
+    return NULL;
   }
   while((ret = read(fd, buf, JSON_FILE_BUF_SIZE)) > 0) {
     printbuf_memappend(pb, buf, ret);
@@ -76,14 +80,16 @@ struct json_object* json_object_from_file(char *filename)
     MC_ABORT("json_object_from_file: error reading file %s: %s\n",
             filename, strerror(errno));
     printbuf_free(pb);
-    return (struct json_object*)error_ptr(-1);
+    return NULL;
   }
   obj = json_tokener_parse(pb->buf);
   printbuf_free(pb);
   return obj;
 }
 
-int json_object_to_file(char *filename, struct json_object *obj)
+/* extended "format and write to file" function */
+
+int json_object_to_file_ext(char *filename, struct json_object *obj, int flags)
 {
   const char *json_str;
   int fd, ret;
@@ -100,8 +106,10 @@ int json_object_to_file(char *filename, struct json_object *obj)
     return -1;
   }
 
-  if(!(json_str = json_object_to_json_string(obj))) { return -1; }
-
+  if(!(json_str = json_object_to_json_string_ext(obj,flags))) {
+    close(fd);
+    return -1;
+  }
 
   wsize = (unsigned int)(strlen(json_str) & UINT_MAX); /* CAW: probably unnecessary, but the most 64bit safe */
   wpos = 0;
@@ -120,3 +128,112 @@ int json_object_to_file(char *filename, struct json_object *obj)
   close(fd);
   return 0;
 }
+
+// backwards compatible "format and write to file" function
+
+int json_object_to_file(char *filename, struct json_object *obj)
+{
+  return json_object_to_file_ext(filename, obj, JSON_C_TO_STRING_PLAIN);
+}
+
+int json_parse_int64(const char *buf, int64_t *retval)
+{
+       int64_t num64;
+       const char *buf_skip_space;
+       int orig_has_neg;
+       if (sscanf(buf, "%" SCNd64, &num64) != 1)
+       {
+               MC_DEBUG("Failed to parse, sscanf != 1\n");
+               return 1;
+       }
+       buf_skip_space = buf;
+       orig_has_neg = 0;
+       // Skip leading spaces
+       while (isspace((int)*buf_skip_space) && *buf_skip_space)
+               buf_skip_space++;
+       if (*buf_skip_space == '-')
+       {
+               buf_skip_space++;
+               orig_has_neg = 1;
+       }
+       // Skip leading zeros, but keep at least one digit
+       while (buf_skip_space[0] == '0' && buf_skip_space[1] != '\0')
+               buf_skip_space++;
+       if (buf_skip_space[0] == '0' && buf_skip_space[1] == '\0')
+               orig_has_neg = 0; // "-0" is the same as just plain "0"
+       
+       if (errno != ERANGE)
+       {
+               char buf_cmp[100];
+               char *buf_cmp_start = buf_cmp;
+               int recheck_has_neg = 0;
+               int buf_cmp_len;
+               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 NOT successfully parsed the value.
+                */
+               if (orig_has_neg != recheck_has_neg ||
+                   strncmp(buf_skip_space, buf_cmp_start, strlen(buf_cmp_start)) != 0 ||
+                       (strlen(buf_skip_space) != buf_cmp_len &&
+                        isdigit((int)buf_skip_space[buf_cmp_len])
+                   )
+                  )
+               {
+                       errno = ERANGE;
+               }
+       }
+       if (errno == ERANGE)
+       {
+               if (orig_has_neg)
+                       num64 = INT64_MIN;
+               else
+                       num64 = INT64_MAX;
+       }
+       *retval = num64;
+       return 0;
+}
+
+#if HAVE_REALLOC == 0
+void* rpl_realloc(void* p, size_t n)
+{
+       if (n == 0)
+               n = 1;
+       if (p == 0)
+               return malloc(n);
+       return realloc(p, n);
+}
+#endif
+
+#define NELEM(a)        (sizeof(a) / sizeof(a[0]))
+static const char* json_type_name[] = {
+  /* If you change this, be sure to update the enum json_type definition too */
+  "null",
+  "boolean",
+  "double",
+  "int",
+  "object",
+  "array",
+  "string",
+};
+
+const char *json_type_to_name(enum json_type o_type)
+{
+       if (o_type < 0 || o_type >= 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));
+               return NULL;
+       }
+       return json_type_name[o_type];
+}
+
index 6ab0287..277c3a7 100644 (file)
@@ -21,8 +21,17 @@ extern "C" {
 #define JSON_FILE_BUF_SIZE 4096
 
 /* utility functions */
-extern struct json_object* json_object_from_file(char *filename);
+extern struct json_object* json_object_from_file(const char *filename);
 extern int json_object_to_file(char *filename, struct json_object *obj);
+extern int json_object_to_file_ext(char *filename, struct json_object *obj, int flags);
+extern int json_parse_int64(const char *buf, int64_t *retval);
+
+
+/**
+ * Return a string describing the type of the object.
+ * e.g. "int", or "object", etc...
+ */
+extern const char *json_type_to_name(enum json_type o_type);
 
 #ifdef __cplusplus
 }
index 998cf7d..ddedc12 100644 (file)
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
  * Michael Clark <michael@metaparadigm.com>
+ * Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
  *
  * This library is free software; you can redistribute it and/or modify
  * it under the terms of the MIT license. See COPYING for details.
@@ -125,7 +126,7 @@ int lh_table_insert(struct lh_table *t, void *k, const void *v)
        unsigned long h, n;
 
        t->inserts++;
-       if(t->count > t->size * 0.66) lh_table_resize(t, t->size * 2);
+       if(t->count >= t->size * LH_LOAD_FACTOR) lh_table_resize(t, t->size * 2);
 
        h = t->hash_fn(k);
        n = h % t->size;
@@ -158,13 +159,15 @@ struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k)
 {
        unsigned long h = t->hash_fn(k);
        unsigned long n = h % t->size;
+       int count = 0;
 
        t->lookups++;
-       while( 1 ) {
+       while( count < t->size ) {
                if(t->table[n].k == LH_EMPTY) return NULL;
                if(t->table[n].k != LH_FREED &&
                   t->equal_fn(t->table[n].k, k)) return &t->table[n];
                if(++n == t->size) n = 0;
+               count++;
        }
        return NULL;
 }
@@ -172,11 +175,21 @@ struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k)
 
 const void* lh_table_lookup(struct lh_table *t, const void *k)
 {
-       struct lh_entry *e = lh_table_lookup_entry(t, k);
-       if(e) return e->v;
-       return NULL;
+       void *result;
+       lh_table_lookup_ex(t, k, &result);
+       return result;
 }
 
+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;
+               return TRUE; /* key found */
+       }
+       if (v != NULL) *v = NULL;
+       return FALSE; /* key not found */
+}
 
 int lh_table_delete_entry(struct lh_table *t, struct lh_entry *e)
 {
index 90f219d..bbb5488 100644 (file)
@@ -3,6 +3,7 @@
  *
  * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
  * Michael Clark <michael@metaparadigm.com>
+ * Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
  *
  * This library is free software; you can redistribute it and/or modify
  * it under the terms of the MIT license. See COPYING for details.
@@ -12,6 +13,8 @@
 #ifndef _linkhash_h_
 #define _linkhash_h_
 
+#include "json_object.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -22,6 +25,13 @@ extern "C" {
 #define LH_PRIME 0x9e370001UL
 
 /**
+ * The fraction of filled hash buckets until an insert will cause the table
+ * to be resized.  
+ * This can range from just above 0 up to 1.0.
+ */
+#define LH_LOAD_FACTOR 0.66
+
+/**
  * sentinel pointer value for empty slots
  */
 #define LH_EMPTY (void*)-1
@@ -234,9 +244,18 @@ extern struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k)
  * @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.
  */
 extern const void* lh_table_lookup(struct lh_table *t, const void *k);
 
+/**
+ * Lookup a record in the table
+ * @param t the table to lookup
+ * @param k a pointer to the key to lookup
+ * @param v a pointer to a where to store the found value (set to NULL if it doesn't exist).
+ * @return whether or not the key was found
+ */
+extern json_bool lh_table_lookup_ex(struct lh_table *t, const void *k, void **v);
 
 /**
  * Delete a record from the table.
index a05e43b..3f8824a 100644 (file)
@@ -1,3 +1,7 @@
+* Mon Mar 18 21:10:05 UTC 2013 - tracy.graydon@intel.com
+- Branch for 2.0
+- Update to 0.10 version 
+
 * Mon May 21 18:17:23 UTC 2012 - tu.c.truong@intel.com
 - Intial commit to Gerrit
 
index 86daaae..21ec8e5 100644 (file)
@@ -1,5 +1,5 @@
 Name:          json-c
-Version:       0.9
+Version:       0.10
 Release:       1%{?dist}
 Summary:       A JSON implementation in C
 Group:         Development/Libraries
index 97366c3..b951c7b 100644 (file)
@@ -29,6 +29,8 @@
 #include "debug.h"
 #include "printbuf.h"
 
+static int printbuf_extend(struct printbuf *p, int min_size);
+
 struct printbuf* printbuf_new(void)
 {
   struct printbuf *p;
@@ -45,19 +47,40 @@ struct printbuf* printbuf_new(void)
 }
 
 
-int printbuf_memappend(struct printbuf *p, const char *buf, int size)
+/**
+ * Extend the buffer p so it has a size of at least min_size.
+ *
+ * If the current size is large enough, nothing is changed.
+ *
+ * Note: this does not check the available space!  The caller
+ *  is responsible for performing those calculations.
+ */
+static int printbuf_extend(struct printbuf *p, int min_size)
 {
-  char *t;
-  if(p->size - p->bpos <= size) {
-    int new_size = json_max(p->size * 2, p->bpos + size + 8);
+       char *t;
+       int new_size;
+
+       if (p->size >= min_size)
+               return 0;
+
+       new_size = json_max(p->size * 2, min_size + 8);
 #ifdef PRINTBUF_DEBUG
-    MC_DEBUG("printbuf_memappend: realloc "
-            "bpos=%d wrsize=%d old_size=%d new_size=%d\n",
-            p->bpos, size, p->size, new_size);
+       MC_DEBUG("printbuf_memappend: realloc "
+         "bpos=%d min_size=%d old_size=%d new_size=%d\n",
+         p->bpos, min_size, p->size, new_size);
 #endif /* PRINTBUF_DEBUG */
-    if(!(t = (char*)realloc(p->buf, new_size))) return -1;
-    p->size = new_size;
-    p->buf = t;
+       if(!(t = (char*)realloc(p->buf, new_size)))
+               return -1;
+       p->size = new_size;
+       p->buf = t;
+       return 0;
+}
+
+int printbuf_memappend(struct printbuf *p, const char *buf, int size)
+{
+  if (p->size <= p->bpos + size + 1) {
+    if (printbuf_extend(p, p->bpos + size + 1) < 0)
+      return -1;
   }
   memcpy(p->buf + p->bpos, buf, size);
   p->bpos += size;
@@ -65,7 +88,27 @@ int printbuf_memappend(struct printbuf *p, const char *buf, int size)
   return size;
 }
 
-#if !HAVE_VSNPRINTF && defined(WIN32)
+int printbuf_memset(struct printbuf *pb, int offset, int charvalue, int len)
+{
+       int size_needed;
+
+       if (offset == -1)
+               offset = pb->bpos;
+       size_needed = offset + len;
+       if (pb->size < size_needed)
+       {
+               if (printbuf_extend(pb, size_needed) < 0)
+                       return -1;
+       }
+
+       memset(pb->buf + offset, charvalue, len);
+       if (pb->bpos < size_needed)
+               pb->bpos = size_needed;
+
+       return 0;
+}
+
+#if !HAVE_VSNPRINTF && defined(_MSC_VER)
 # define vsnprintf _vsnprintf
 #elif !HAVE_VSNPRINTF /* !HAVE_VSNPRINTF */
 # error Need vsnprintf!
@@ -123,7 +166,7 @@ int sprintbuf(struct printbuf *p, const char *msg, ...)
      would have been written - this code handles both cases. */
   if(size == -1 || size > 127) {
     va_start(ap, msg);
-    if((size = vasprintf(&t, msg, ap)) == -1) { va_end(ap); return -1; }
+    if((size = vasprintf(&t, msg, ap)) < 0) { va_end(ap); return -1; }
     va_end(ap);
     printbuf_memappend(p, t, size);
     free(t);
index 53fa921..b1bde7f 100644 (file)
@@ -20,8 +20,6 @@
 extern "C" {
 #endif
 
-#undef PRINTBUF_DEBUG
-
 struct printbuf {
   char *buf;
   int bpos;
@@ -31,10 +29,12 @@ struct printbuf {
 extern struct printbuf*
 printbuf_new(void);
 
-/* As an optimization, printbuf_memappend is defined as a macro that
- * handles copying data if the buffer is large enough; otherwise it
- * invokes printbuf_memappend_real() which performs the heavy lifting
- * of realloc()ing the buffer and copying data.
+/* As an optimization, printbuf_memappend_fast is defined as a macro
+ * that handles copying data if the buffer is large enough; otherwise
+ * it invokes printbuf_memappend_real() which performs the heavy
+ * lifting of realloc()ing the buffer and copying data.
+ * Your code should not use printbuf_memappend directly--use
+ * printbuf_memappend_fast instead.
  */
 extern int
 printbuf_memappend(struct printbuf *p, const char *buf, int size);
@@ -48,6 +48,19 @@ do {                                                         \
   } else {  printbuf_memappend(p, (bufptr), bufsize); }      \
 } while (0)
 
+#define printbuf_length(p) ((p)->bpos)
+
+/**
+ * Set len bytes of the buffer to charvalue, starting at offset offset.
+ * Similar to calling memset(x, charvalue, len);
+ *
+ * The memory allocated for the buffer is extended as necessary.
+ *
+ * If offset is -1, this starts at the end of the current data in the buffer.
+ */
+extern int
+printbuf_memset(struct printbuf *pb, int offset, int charvalue, int len);
+
 extern int
 sprintbuf(struct printbuf *p, const char *msg, ...);
 
diff --git a/test1.c b/test1.c
deleted file mode 100644 (file)
index d2e6d0b..0000000
--- a/test1.c
+++ /dev/null
@@ -1,164 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-
-#include "json.h"
-
-int main(int argc, char **argv)
-{
-  json_tokener *tok;
-  json_object *my_string, *my_int, *my_object, *my_array;
-  json_object *new_obj;
-  int i;
-
-  MC_SET_DEBUG(1);
-
-  my_string = json_object_new_string("\t");
-  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));
-  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));
-  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));
-
-  my_int = json_object_new_int(9);
-  printf("my_int=%d\n", json_object_get_int(my_int));
-  printf("my_int.to_string()=%s\n", json_object_to_json_string(my_int));
-
-  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));
-  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("my_array.to_string()=%s\n", json_object_to_json_string(my_array));    
-
-  my_object = json_object_new_object();
-  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));
-  json_object_object_add(my_object, "bool1", json_object_new_boolean(1));
-  json_object_object_add(my_object, "baz", json_object_new_string("bang"));
-  json_object_object_add(my_object, "baz", json_object_new_string("fark"));
-  json_object_object_del(my_object, "baz");
-  /*json_object_object_add(my_object, "arr", my_array);*/
-  printf("my_object=\n");
-  json_object_object_foreach(my_object, key, val) {
-    printf("\t%s: %s\n", key, json_object_to_json_string(val));
-  }
-  printf("my_object.to_string()=%s\n", json_object_to_json_string(my_object));
-
-  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("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));
-  json_object_put(new_obj);
-
-  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);
-
-  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);
-
-  new_obj = json_tokener_parse("{ foo }");
-  if(is_error(new_obj)) printf("got error as expected\n");
-
-  new_obj = json_tokener_parse("foo");
-  if(is_error(new_obj)) printf("got error as expected\n");
-
-  new_obj = json_tokener_parse("{ \"foo");
-  if(is_error(new_obj)) printf("got error as expected\n");
-
-  /* test incremental parsing */
-  tok = json_tokener_new();
-  new_obj = json_tokener_parse_ex(tok, "{ \"foo", 6);
-  if(is_error(new_obj)) printf("got error as expected\n");
-  new_obj = json_tokener_parse_ex(tok, "\": {\"bar", 8);
-  if(is_error(new_obj)) printf("got error as expected\n");
-  new_obj = json_tokener_parse_ex(tok, "\":13}}", 6);
-  printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
-  json_object_put(new_obj);  
-  json_tokener_free(tok);
-
-  json_object_put(my_string);
-  json_object_put(my_int);
-  json_object_put(my_object);
-  //json_object_put(my_array);
-
-  return 0;
-}
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644 (file)
index 0000000..e2854dd
--- /dev/null
@@ -0,0 +1,49 @@
+
+include ../Makefile.am.inc
+
+LIBJSON_LA=$(top_builddir)/libjson.la
+
+check_PROGRAMS = test1 test1Formatted 
+check_PROGRAMS += test2 test2Formatted
+check_PROGRAMS += test4
+check_PROGRAMS += test_parse_int64
+check_PROGRAMS += test_null
+check_PROGRAMS += test_cast
+check_PROGRAMS += test_parse
+
+test1_LDADD = $(LIBJSON_LA)
+
+test1Formatted_LDADD= $(LIBJSON_LA)
+test1Formatted_SOURCES = test1.c parse_flags.c
+test1Formatted_CPPFLAGS = -DTEST_FORMATTED
+
+test2_LDADD = $(LIBJSON_LA)
+
+test2Formatted_LDADD= $(LIBJSON_LA)
+test2Formatted_SOURCES = test2.c parse_flags.c
+test2Formatted_CPPFLAGS = -DTEST_FORMATTED
+
+test4_LDADD = $(LIBJSON_LA)
+
+test_parse_int64_LDADD = $(LIBJSON_LA)
+
+test_null_LDADD = $(LIBJSON_LA)
+
+test_cast_LDADD = $(LIBJSON_LA)
+
+test_parse_LDADD = $(LIBJSON_LA)
+
+TESTS = test1.test test2.test test4.test parse_int64.test test_null.test test_cast.test test_parse.test
+
+TESTS+= test_printbuf.test
+check_PROGRAMS+=test_printbuf
+test_printbuf_LDADD = $(LIBJSON_LA)
+
+EXTRA_DIST=
+EXTRA_DIST += $(TESTS)
+
+testsubdir=testSubDir
+TESTS_ENVIRONMENT       = top_builddir=$(top_builddir)
+
+distclean-local:
+       -rm -rf $(testsubdir)
diff --git a/tests/parse_flags.c b/tests/parse_flags.c
new file mode 100644 (file)
index 0000000..fafabc8
--- /dev/null
@@ -0,0 +1,42 @@
+#include <stdio.h>
+#include <string.h>
+
+#include "json.h"
+#include "parse_flags.h"
+
+static struct {
+       const char *arg;
+       int flag;
+} format_args[] = {
+       { "plain", JSON_C_TO_STRING_PLAIN },
+       { "spaced", JSON_C_TO_STRING_SPACED },
+       { "pretty", JSON_C_TO_STRING_PRETTY },
+};
+
+#ifndef NELEM
+#define NELEM(x) (sizeof(x) / sizeof(&x[0]))
+#endif
+
+int parse_flags(int argc, char **argv)
+{
+       int arg_idx;
+       int sflags = 0;
+       for (arg_idx = 1; arg_idx < argc ; arg_idx++)
+       {
+               int jj;
+               for (jj = 0; jj < NELEM(format_args); jj++)
+               {
+                       if (strcasecmp(argv[arg_idx], format_args[jj].arg) == 0)
+                       {
+                               sflags |= format_args[jj].flag;
+                               break;
+                       }
+               }
+               if (jj == NELEM(format_args))
+               {
+                       printf("Unknown arg: %s\n", argv[arg_idx]);
+                       exit(1);
+               }
+       }
+       return sflags;
+}
diff --git a/tests/parse_flags.h b/tests/parse_flags.h
new file mode 100644 (file)
index 0000000..c5e2f41
--- /dev/null
@@ -0,0 +1,4 @@
+#ifndef __parse_flags_h
+#define __parse_flags_h
+int parse_flags(int argc, char **argv);
+#endif
diff --git a/tests/parse_int64.test b/tests/parse_int64.test
new file mode 100755 (executable)
index 0000000..2b7fbfb
--- /dev/null
@@ -0,0 +1,12 @@
+#!/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 $?
diff --git a/tests/test-defs.sh b/tests/test-defs.sh
new file mode 100755 (executable)
index 0000000..658a75d
--- /dev/null
@@ -0,0 +1,128 @@
+#!/bin/sh
+
+# Make sure srcdir is an absolute path.  Supply the variable
+# if it does not exist.  We want to be able to run the tests
+# stand-alone!!
+#
+srcdir=${srcdir-.}
+if test ! -d $srcdir ; then
+    echo "test-defs.sh: installation error" 1>&2
+    exit 1
+fi
+
+# Use absolute paths
+case "$srcdir" in
+    /* | [A-Za-z]:\\*) ;;
+    *) srcdir=`\cd $srcdir && pwd` ;;
+esac
+
+case "$top_builddir" in
+    /* | [A-Za-z]:\\*) ;;
+    *) top_builddir=`\cd ${top_builddir-..} && pwd` ;;
+esac
+
+top_builddir=${top_builddir}/tests
+
+progname=`echo "$0" | sed 's,^.*/,,'`
+testname=`echo "$progname" | sed 's,-.*$,,'`
+testsubdir=${testsubdir-testSubDir}
+testsubdir=${testsubdir}/${progname}
+
+# User can set VERBOSE to cause output redirection
+case "$VERBOSE" in
+[Nn]|[Nn][Oo]|0|"")
+       VERBOSE=0
+       exec > /dev/null
+       ;;
+[Yy]|[Yy][Ee][Ss])
+       VERBOSE=1
+       ;;
+esac
+
+rm -rf "$testsubdir" > /dev/null 2>&1
+mkdir -p "$testsubdir"
+CURDIR=$(pwd)
+cd "$testsubdir" \
+   || { echo "Cannot make or change into $testsubdir"; exit 1; }
+
+echo "=== Running test $progname"
+
+CMP="${CMP-cmp}"
+
+use_valgrind=${USE_VALGRIND-1}
+valgrind_path=$(which valgrind 2> /dev/null)
+if [ -z "${valgrind_path}" -o ! -x "${valgrind_path}" ] ; then
+       use_valgrind=0
+fi
+
+#
+# This is a common function to check the results of a test program
+# that is intended to generate consistent output across runs.
+#
+# ${top_builddir} must be set to the top level build directory.
+#
+# Output will be written to the current directory.
+#
+# It must be passed the name of the test command to run, which must be present
+#  in the ${top_builddir} directory.
+#
+# It will compare the output of running that against <name of command>.expected
+#
+run_output_test()
+{
+       if [ "$1" = "-o" ] ; then
+               TEST_OUTPUT="$2"
+               shift
+               shift
+       fi
+       TEST_COMMAND="$1"
+       shift
+       if [ -z "${TEST_OUTPUT}" ] ; then       
+               TEST_OUTPUT=${TEST_COMMAND}
+       fi
+
+       REDIR_OUTPUT="> \"${TEST_OUTPUT}.out\""
+       if [ $VERBOSE -gt 1 ] ; then
+               REDIR_OUTPUT="| tee \"${TEST_OUTPUT}.out\""
+       fi
+
+       if [ $use_valgrind -eq 1 ] ; then
+               eval valgrind --tool=memcheck \
+                       --trace-children=yes \
+                       --demangle=yes \
+                       --log-file="${TEST_OUTPUT}.vg.out" \
+                       --leak-check=full \
+                       --show-reachable=yes \
+                       --run-libc-freeres=yes \
+               "\"${top_builddir}/${TEST_COMMAND}\"" \"\$@\" ${REDIR_OUTPUT}
+               err=$?
+
+       else
+               eval "\"${top_builddir}/${TEST_COMMAND}"\" \"\$@\" ${REDIR_OUTPUT}
+               err=$?
+       fi
+
+       if [ $err -ne 0 ] ; then
+               echo "ERROR: \"${TEST_COMMAND} $@\" exited with non-zero exit status: $err" 1>&2
+       fi
+
+       if [ $use_valgrind -eq 1 ] ; then
+               if ! tail -1 "${TEST_OUTPUT}.vg.out" | grep -q "ERROR SUMMARY: 0 errors" ; then
+                       echo "ERROR: valgrind found errors during execution:" 1>&2
+                       cat "${TEST_OUTPUT}.vg.out"
+                       err=1
+               fi
+       fi
+
+       if ! "$CMP" -s "${top_builddir}/${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
+
+               err=1
+       fi
+
+       return $err
+}
+
+
diff --git a/tests/test1.c b/tests/test1.c
new file mode 100644 (file)
index 0000000..9802eb1
--- /dev/null
@@ -0,0 +1,125 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <assert.h>
+
+#include "json.h"
+#include "parse_flags.h"
+
+static int sort_fn (const void *j1, const void *j2)
+{
+  json_object * const *jso1, * const *jso2;
+  int i1, i2;
+
+  jso1 = j1;
+  jso2 = j2;
+  if (!*jso1 && !*jso2) {
+    return 0;
+  }
+  if (!*jso1) {
+    return -1;
+  }
+  if (!*jso2) {
+    return 1;
+  }
+
+  i1 = json_object_get_int(*jso1);
+  i2 = json_object_get_int(*jso2);
+
+  return i1 - i2;
+}
+
+#ifdef TEST_FORMATTED
+#define json_object_to_json_string(obj) json_object_to_json_string_ext(obj,sflags)
+#else
+/* no special define */
+#endif
+
+int main(int argc, char **argv)
+{
+  json_object *my_string, *my_int, *my_object, *my_array;
+  int i;
+#ifdef TEST_FORMATTED
+       int sflags = 0;
+#endif
+
+  MC_SET_DEBUG(1);
+
+#ifdef TEST_FORMATTED
+       sflags = parse_flags(argc, argv);
+#endif
+
+  my_string = json_object_new_string("\t");
+  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));
+  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));
+  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));
+
+  my_int = json_object_new_int(9);
+  printf("my_int=%d\n", json_object_get_int(my_int));
+  printf("my_int.to_string()=%s\n", json_object_to_json_string(my_int));
+
+  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));
+  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("my_array.to_string()=%s\n", json_object_to_json_string(my_array));    
+
+  json_object_put(my_array);
+
+  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));
+  json_object_array_add(my_array, json_object_new_int(2));
+  json_object_array_put_idx(my_array, 4, json_object_new_int(0));
+  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("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("my_array.to_string()=%s\n", json_object_to_json_string(my_array));    
+
+  my_object = json_object_new_object();
+  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));
+  json_object_object_add(my_object, "bool1", json_object_new_boolean(1));
+  json_object_object_add(my_object, "baz", json_object_new_string("bang"));
+  json_object_object_add(my_object, "baz", json_object_new_string("fark"));
+  json_object_object_del(my_object, "baz");
+  /*json_object_object_add(my_object, "arr", my_array);*/
+  printf("my_object=\n");
+  json_object_object_foreach(my_object, key, val) {
+    printf("\t%s: %s\n", key, json_object_to_json_string(val));
+  }
+  printf("my_object.to_string()=%s\n", json_object_to_json_string(my_object));
+
+  json_object_put(my_string);
+  json_object_put(my_int);
+  json_object_put(my_object);
+  json_object_put(my_array);
+
+  return 0;
+}
diff --git a/tests/test1.expected b/tests/test1.expected
new file mode 100644 (file)
index 0000000..6653fe0
--- /dev/null
@@ -0,0 +1,35 @@
+my_string=     
+my_string.to_string()="\t"
+my_string=\
+my_string.to_string()="\\"
+my_string=foo
+my_string.to_string()="foo"
+my_int=9
+my_int.to_string()=9
+my_array=
+       [0]=1
+       [1]=2
+       [2]=3
+       [3]=null
+       [4]=5
+my_array.to_string()=[ 1, 2, 3, null, 5 ]
+my_array=
+       [0]=3
+       [1]=1
+       [2]=2
+       [3]=null
+       [4]=0
+my_array.to_string()=[ 3, 1, 2, null, 0 ]
+my_array=
+       [0]=null
+       [1]=0
+       [2]=1
+       [3]=2
+       [4]=3
+my_array.to_string()=[ null, 0, 1, 2, 3 ]
+my_object=
+       abc: 12
+       foo: "bar"
+       bool0: false
+       bool1: true
+my_object.to_string()={ "abc": 12, "foo": "bar", "bool0": false, "bool1": true }
diff --git a/tests/test1.test b/tests/test1.test
new file mode 100755 (executable)
index 0000000..79d2e09
--- /dev/null
@@ -0,0 +1,22 @@
+#!/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 test1
+_err=$?
+
+for flag in plain spaced pretty ; do
+       run_output_test -o test1Formatted_${flag} test1Formatted ${flag}
+       _err2=$?
+       if [ $_err -eq 0 ] ; then
+               _err=$_err2
+       fi
+done
+
+exit $_err
diff --git a/tests/test1Formatted_plain.expected b/tests/test1Formatted_plain.expected
new file mode 100644 (file)
index 0000000..65b19ed
--- /dev/null
@@ -0,0 +1,35 @@
+my_string=     
+my_string.to_string()="\t"
+my_string=\
+my_string.to_string()="\\"
+my_string=foo
+my_string.to_string()="foo"
+my_int=9
+my_int.to_string()=9
+my_array=
+       [0]=1
+       [1]=2
+       [2]=3
+       [3]=null
+       [4]=5
+my_array.to_string()=[1,2,3,null,5]
+my_array=
+       [0]=3
+       [1]=1
+       [2]=2
+       [3]=null
+       [4]=0
+my_array.to_string()=[3,1,2,null,0]
+my_array=
+       [0]=null
+       [1]=0
+       [2]=1
+       [3]=2
+       [4]=3
+my_array.to_string()=[null,0,1,2,3]
+my_object=
+       abc: 12
+       foo: "bar"
+       bool0: false
+       bool1: true
+my_object.to_string()={"abc":12,"foo":"bar","bool0":false,"bool1":true}
diff --git a/tests/test1Formatted_pretty.expected b/tests/test1Formatted_pretty.expected
new file mode 100644 (file)
index 0000000..f2334c4
--- /dev/null
@@ -0,0 +1,58 @@
+my_string=     
+my_string.to_string()="\t"
+my_string=\
+my_string.to_string()="\\"
+my_string=foo
+my_string.to_string()="foo"
+my_int=9
+my_int.to_string()=9
+my_array=
+       [0]=1
+       [1]=2
+       [2]=3
+       [3]=null
+       [4]=5
+my_array.to_string()=[
+  1,
+  2,
+  3,
+  null,
+  5
+]
+my_array=
+       [0]=3
+       [1]=1
+       [2]=2
+       [3]=null
+       [4]=0
+my_array.to_string()=[
+  3,
+  1,
+  2,
+  null,
+  0
+]
+my_array=
+       [0]=null
+       [1]=0
+       [2]=1
+       [3]=2
+       [4]=3
+my_array.to_string()=[
+  null,
+  0,
+  1,
+  2,
+  3
+]
+my_object=
+       abc: 12
+       foo: "bar"
+       bool0: false
+       bool1: true
+my_object.to_string()={
+  "abc":12,
+  "foo":"bar",
+  "bool0":false,
+  "bool1":true
+}
diff --git a/tests/test1Formatted_spaced.expected b/tests/test1Formatted_spaced.expected
new file mode 100644 (file)
index 0000000..6653fe0
--- /dev/null
@@ -0,0 +1,35 @@
+my_string=     
+my_string.to_string()="\t"
+my_string=\
+my_string.to_string()="\\"
+my_string=foo
+my_string.to_string()="foo"
+my_int=9
+my_int.to_string()=9
+my_array=
+       [0]=1
+       [1]=2
+       [2]=3
+       [3]=null
+       [4]=5
+my_array.to_string()=[ 1, 2, 3, null, 5 ]
+my_array=
+       [0]=3
+       [1]=1
+       [2]=2
+       [3]=null
+       [4]=0
+my_array.to_string()=[ 3, 1, 2, null, 0 ]
+my_array=
+       [0]=null
+       [1]=0
+       [2]=1
+       [3]=2
+       [4]=3
+my_array.to_string()=[ null, 0, 1, 2, 3 ]
+my_object=
+       abc: 12
+       foo: "bar"
+       bool0: false
+       bool1: true
+my_object.to_string()={ "abc": 12, "foo": "bar", "bool0": false, "bool1": true }
similarity index 73%
rename from test2.c
rename to tests/test2.c
index 5f95565..4a6b660 100644 (file)
--- a/test2.c
@@ -4,14 +4,28 @@
 #include <string.h>
 
 #include "json.h"
+#include "parse_flags.h"
+
+#ifdef TEST_FORMATTED
+#define json_object_to_json_string(obj) json_object_to_json_string_ext(obj,sflags)
+#else
+/* no special define */
+#endif
 
 
 int main(int argc, char **argv)
 {
   json_object *new_obj;
+#ifdef TEST_FORMATTED
+       int sflags = 0;
+#endif
 
   MC_SET_DEBUG(1);
 
+#ifdef TEST_FORMATTED
+       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\"] } ] } } }");
   printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
   json_object_put(new_obj);
diff --git a/tests/test2.expected b/tests/test2.expected
new file mode 100644 (file)
index 0000000..0b740a9
--- /dev/null
@@ -0,0 +1 @@
+new_obj.to_string()={ "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" ] } ] } } }
diff --git a/tests/test2.test b/tests/test2.test
new file mode 100755 (executable)
index 0000000..d4a4e79
--- /dev/null
@@ -0,0 +1,22 @@
+#!/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 test2
+_err=$?
+
+for flag in plain spaced pretty ; do
+       run_output_test -o test2Formatted_${flag} test2Formatted ${flag}
+       _err2=$?
+       if [ $_err -eq 0 ] ; then
+               _err=$_err2
+       fi
+done
+
+exit $_err
diff --git a/tests/test2Formatted_plain.expected b/tests/test2Formatted_plain.expected
new file mode 100644 (file)
index 0000000..cc587e9
--- /dev/null
@@ -0,0 +1 @@
+new_obj.to_string()={"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"]}]}}}
diff --git a/tests/test2Formatted_pretty.expected b/tests/test2Formatted_pretty.expected
new file mode 100644 (file)
index 0000000..8d6d740
--- /dev/null
@@ -0,0 +1,23 @@
+new_obj.to_string()={
+  "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"
+          ]
+        }
+      ]
+    }
+  }
+}
diff --git a/tests/test2Formatted_spaced.expected b/tests/test2Formatted_spaced.expected
new file mode 100644 (file)
index 0000000..0b740a9
--- /dev/null
@@ -0,0 +1 @@
+new_obj.to_string()={ "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" ] } ] } } }
diff --git a/tests/test4.c b/tests/test4.c
new file mode 100644 (file)
index 0000000..555afd1
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * gcc -o utf8 utf8.c -I/home/y/include -L./.libs -ljson
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include "config.h"
+
+#include "json_inttypes.h"
+#include "json_object.h"
+#include "json_tokener.h"
+
+void print_hex( const char* s) {
+        const char *iter = s;
+        unsigned char ch;
+        while ((ch = *iter++) != 0) {
+           if( ',' != ch)
+            printf("%x ", ch);
+           else
+            printf( ",");
+        }
+        printf("\n");
+}
+
+int main() {
+    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);
+    const char *unjson = json_object_get_string(parse_result);
+
+    printf("input: %s\n", input);
+
+    int strings_match = !strcmp( expected, unjson);
+       int retval = 0;
+    if (strings_match) {
+        printf("JSON parse result is correct: %s\n", unjson);
+        printf("PASS\n");
+    } else {
+        printf("JSON parse result doesn't match expected string\n");
+        printf("expected string bytes: ");
+        print_hex( expected);
+        printf("parsed string bytes:   ");
+        print_hex( unjson);
+        printf("FAIL\n");
+        retval = 1;
+    }
+       json_object_put(parse_result);
+       return retval;
+}
diff --git a/tests/test4.expected b/tests/test4.expected
new file mode 100644 (file)
index 0000000..68d4336
--- /dev/null
@@ -0,0 +1,3 @@
+input: "\ud840\udd26,\ud840\udd27,\ud800\udd26,\ud800\udd27"
+JSON parse result is correct: 𠄦,𠄧,𐄦,𐄧
+PASS
diff --git a/tests/test4.test b/tests/test4.test
new file mode 100755 (executable)
index 0000000..8bcc460
--- /dev/null
@@ -0,0 +1,12 @@
+#!/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 $?
diff --git a/tests/test_cast.c b/tests/test_cast.c
new file mode 100644 (file)
index 0000000..aad44d0
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Tests if casting within the json_object_get_* functions work correctly.
+ * Also checks the json_object_get_type and json_object_is_type functions.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "config.h"
+
+#include "json_inttypes.h"
+#include "json_object.h"
+#include "json_tokener.h"
+#include "json_util.h"
+
+static void getit(struct json_object *new_obj, const char *field);
+static void checktype_header(void);
+static void checktype(struct json_object *new_obj, const char *field);
+
+int main(int argc, char **argv)
+{
+       const char *input = "{\n\
+               \"string_of_digits\": \"123\",\n\
+               \"regular_number\": 222,\n\
+               \"decimal_number\": 99.55,\n\
+               \"boolean_true\": true,\n\
+               \"boolean_false\": false,\n\
+               \"big_number\": 2147483649,\n\
+               \"a_null\": null,\n\
+       }";
+       /* Note: 2147483649 = INT_MAX + 2 */
+
+       struct json_object *new_obj;
+
+       new_obj = json_tokener_parse(input);
+       printf("Parsed input: %s\n", input);
+       printf("Result is %s\n", (new_obj == NULL) ? "NULL (error!)" : "not NULL");
+       if (!new_obj)
+               return 1; // oops, we failed.
+
+       getit(new_obj, "string_of_digits");
+       getit(new_obj, "regular_number");
+       getit(new_obj, "decimal_number");
+       getit(new_obj, "boolean_true");
+       getit(new_obj, "boolean_false");
+       getit(new_obj, "big_number");
+       getit(new_obj, "a_null");
+
+       // Now check the behaviour of the json_object_is_type() function.
+       printf("\n================================\n");
+       checktype_header();
+       checktype(new_obj, NULL);
+       checktype(new_obj, "string_of_digits");
+       checktype(new_obj, "regular_number");
+       checktype(new_obj, "decimal_number");
+       checktype(new_obj, "boolean_true");
+       checktype(new_obj, "boolean_false");
+       checktype(new_obj, "big_number");
+       checktype(new_obj, "a_null");
+
+    json_object_put(new_obj);
+
+    return 0;
+}
+
+static void getit(struct json_object *new_obj, const char *field)
+{
+       struct json_object *o = json_object_object_get(new_obj, field);
+
+       enum json_type o_type = json_object_get_type(o);
+       printf("new_obj.%s json_object_get_type()=%s\n", field,
+              json_type_to_name(o_type));
+       printf("new_obj.%s json_object_get_int()=%d\n", field,
+              json_object_get_int(o));
+       printf("new_obj.%s json_object_get_int64()=%" PRId64 "\n", field,
+              json_object_get_int64(o));
+       printf("new_obj.%s json_object_get_boolean()=%d\n", field,
+              json_object_get_boolean(o));
+       printf("new_obj.%s json_object_get_double()=%f\n", field,
+              json_object_get_double(o));
+}
+
+static void checktype_header()
+{
+       printf("json_object_is_type: %s,%s,%s,%s,%s,%s,%s\n",
+               json_type_to_name(json_type_null),
+               json_type_to_name(json_type_boolean),
+               json_type_to_name(json_type_double),
+               json_type_to_name(json_type_int),
+               json_type_to_name(json_type_object),
+               json_type_to_name(json_type_array),
+               json_type_to_name(json_type_string));
+}
+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;
+       printf("new_obj%s%-18s: %d,%d,%d,%d,%d,%d,%d\n",
+               field ? "." : " ", field ? field : "",
+               json_object_is_type(o, json_type_null),
+               json_object_is_type(o, json_type_boolean),
+               json_object_is_type(o, json_type_double),
+               json_object_is_type(o, json_type_int),
+               json_object_is_type(o, json_type_object),
+               json_object_is_type(o, json_type_array),
+               json_object_is_type(o, json_type_string));
+}
diff --git a/tests/test_cast.expected b/tests/test_cast.expected
new file mode 100644 (file)
index 0000000..76ff823
--- /dev/null
@@ -0,0 +1,56 @@
+Parsed input: {
+               "string_of_digits": "123",
+               "regular_number": 222,
+               "decimal_number": 99.55,
+               "boolean_true": true,
+               "boolean_false": false,
+               "big_number": 2147483649,
+               "a_null": null,
+       }
+Result is not NULL
+new_obj.string_of_digits json_object_get_type()=string
+new_obj.string_of_digits json_object_get_int()=123
+new_obj.string_of_digits json_object_get_int64()=123
+new_obj.string_of_digits json_object_get_boolean()=1
+new_obj.string_of_digits json_object_get_double()=123.000000
+new_obj.regular_number json_object_get_type()=int
+new_obj.regular_number json_object_get_int()=222
+new_obj.regular_number json_object_get_int64()=222
+new_obj.regular_number json_object_get_boolean()=1
+new_obj.regular_number json_object_get_double()=222.000000
+new_obj.decimal_number json_object_get_type()=double
+new_obj.decimal_number json_object_get_int()=99
+new_obj.decimal_number json_object_get_int64()=99
+new_obj.decimal_number json_object_get_boolean()=1
+new_obj.decimal_number json_object_get_double()=99.550000
+new_obj.boolean_true json_object_get_type()=boolean
+new_obj.boolean_true json_object_get_int()=1
+new_obj.boolean_true json_object_get_int64()=1
+new_obj.boolean_true json_object_get_boolean()=1
+new_obj.boolean_true json_object_get_double()=1.000000
+new_obj.boolean_false json_object_get_type()=boolean
+new_obj.boolean_false json_object_get_int()=0
+new_obj.boolean_false json_object_get_int64()=0
+new_obj.boolean_false json_object_get_boolean()=0
+new_obj.boolean_false json_object_get_double()=0.000000
+new_obj.big_number json_object_get_type()=int
+new_obj.big_number json_object_get_int()=2147483647
+new_obj.big_number json_object_get_int64()=2147483649
+new_obj.big_number json_object_get_boolean()=1
+new_obj.big_number json_object_get_double()=2147483649.000000
+new_obj.a_null json_object_get_type()=null
+new_obj.a_null json_object_get_int()=0
+new_obj.a_null json_object_get_int64()=0
+new_obj.a_null json_object_get_boolean()=0
+new_obj.a_null json_object_get_double()=0.000000
+
+================================
+json_object_is_type: null,boolean,double,int,object,array,string
+new_obj                   : 0,0,0,0,1,0,0
+new_obj.string_of_digits  : 0,0,0,0,0,0,1
+new_obj.regular_number    : 0,0,0,1,0,0,0
+new_obj.decimal_number    : 0,0,1,0,0,0,0
+new_obj.boolean_true      : 0,1,0,0,0,0,0
+new_obj.boolean_false     : 0,1,0,0,0,0,0
+new_obj.big_number        : 0,0,0,1,0,0,0
+new_obj.a_null            : 1,0,0,0,0,0,0
diff --git a/tests/test_cast.test b/tests/test_cast.test
new file mode 100755 (executable)
index 0000000..2102467
--- /dev/null
@@ -0,0 +1,12 @@
+#!/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 $?
diff --git a/tests/test_null.c b/tests/test_null.c
new file mode 100644 (file)
index 0000000..73729b8
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+* Tests if binary strings are supported.
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include "config.h"
+
+#include "json_inttypes.h"
+#include "json_object.h"
+
+int main() {
+    // 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);
+    const char *json = json_object_to_json_string(string);
+
+    int strings_match =  !strcmp( expected, json);
+    int retval = 0;
+    if (strings_match) {
+        printf("JSON write result is correct: %s\n", json);
+        printf("PASS\n");
+    } else {
+        printf("JSON write result doesn't match expected string\n");
+        printf("expected string: ");
+        printf("%s\n", expected);
+        printf("parsed string:   ");
+        printf("%s\n", json);
+        printf("FAIL\n");
+        retval=1;
+    }
+    json_object_put(string);
+    return retval;
+}
diff --git a/tests/test_null.expected b/tests/test_null.expected
new file mode 100644 (file)
index 0000000..fd7b479
--- /dev/null
@@ -0,0 +1,2 @@
+JSON write result is correct: " \u0000 "
+PASS
diff --git a/tests/test_null.test b/tests/test_null.test
new file mode 100755 (executable)
index 0000000..469ec64
--- /dev/null
@@ -0,0 +1,12 @@
+#!/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 $?
diff --git a/tests/test_parse.c b/tests/test_parse.c
new file mode 100644 (file)
index 0000000..0040760
--- /dev/null
@@ -0,0 +1,270 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <assert.h>
+
+#include "json.h"
+#include "json_tokener.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)
+{
+       MC_SET_DEBUG(1);
+
+       test_basic_parse();
+       printf("==================================\n");
+       test_verbose_parse();
+       printf("==================================\n");
+       test_incremental_parse();
+       printf("==================================\n");
+}
+
+static void test_basic_parse()
+{
+  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("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));
+  json_object_put(new_obj);
+
+  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);
+
+  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 void test_verbose_parse()
+{
+       json_object *new_obj;
+       enum json_tokener_error error = json_tokener_success;
+
+       new_obj = json_tokener_parse_verbose("{ foo }", &error);
+       assert (error == json_tokener_error_parse_object_key_name);
+       assert (new_obj == NULL);
+
+       new_obj = json_tokener_parse("{ foo }");
+       assert (new_obj == NULL);
+
+       new_obj = json_tokener_parse("foo");
+       assert (new_obj == NULL);
+       new_obj = json_tokener_parse_verbose("foo", &error);
+       assert (new_obj == NULL);
+
+       /* 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");
+}
+
+struct incremental_step {
+       const char *string_to_parse;
+       int length;
+       int char_offset;
+       enum json_tokener_error expected_error;
+       int reset_tokener;
+} incremental_steps[] = {
+
+       /* Check that full json messages can be parsed, both w/ and w/o a reset */
+       { "{ \"foo\": 123 }", -1, -1, json_tokener_success,  0 },
+       { "{ \"foo\": 456 }", -1, -1, json_tokener_success,  1 },
+       { "{ \"foo\": 789 }", -1, -1, json_tokener_success,  1 },
+
+       /*  Check a basic incremental parse */
+       { "{ \"foo",          -1, -1, json_tokener_continue, 0 },
+       { "\": {\"bar",       -1, -1, json_tokener_continue, 0 },
+       { "\":13}}",          -1, -1, json_tokener_success,  1 },
+
+       /* Check that json_tokener_reset actually resets */
+       { "{ \"foo",          -1, -1, json_tokener_continue, 1 },
+       { ": \"bar\"}",       -1, 0, json_tokener_error_parse_unexpected, 1 },
+
+       /* Check incremental parsing with trailing characters */
+       { "{ \"foo",          -1, -1, json_tokener_continue, 0 },
+       { "\": {\"bar",       -1, -1, json_tokener_continue, 0 },
+       { "\":13}}XXXX",      10, 6, json_tokener_success,  0 },
+       { "XXXX",              4, 0, json_tokener_error_parse_unexpected, 1 },
+
+       /* Check that trailing characters can change w/o a reset */
+       { "{\"x\": 123 }\"X\"", -1, 11, json_tokener_success, 0 },
+       { "\"Y\"",            -1, -1, json_tokener_success, 1 },
+
+       /* To stop parsing a number we need to reach a non-digit, e.g. a \0 */
+       { "1",                 1, 1, json_tokener_continue, 0 },
+       { "2",                 2, 1, json_tokener_success, 0 },
+
+       /* Strings have a well defined end point, so we can stop at the quote */
+       { "\"blue\"",         -1, -1, json_tokener_success, 0 },
+
+       { "[1,2,3]",          -1, -1, json_tokener_success, 0 },
+
+       /* This behaviour doesn't entirely follow the json spec, but until we have
+          a way to specify how strict to be we follow Postel's Law and be liberal
+          in what we accept (up to a point). */
+       { "[1,2,3,]",         -1, -1, json_tokener_success, 0 },
+       { "[1,2,,3,]",        -1, 5, json_tokener_error_parse_unexpected, 0 },
+
+       { NULL, json_tokener_success },
+};
+
+static void test_incremental_parse()
+{
+       json_object *new_obj;
+       enum json_tokener_error jerr;
+       json_tokener *tok;
+       const char *string_to_parse;
+       int ii;
+       int num_ok, num_error;
+
+       num_ok = 0;
+       num_error = 0;
+
+       printf("Starting incremental tests.\n");
+
+       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");
+
+       /* test incremental parsing in various forms */
+       tok = json_tokener_new();
+       for (ii = 0; incremental_steps[ii].string_to_parse != NULL; ii++)
+       {
+               int this_step_ok = 0;
+               struct incremental_step *step = &incremental_steps[ii];
+               int length = step->length;
+               int expected_char_offset = step->char_offset;
+               if (length == -1)
+                       length = strlen(step->string_to_parse);
+               if (expected_char_offset == -1)
+                       expected_char_offset = length;
+
+               printf("json_tokener_parse_ex(tok, %-12s, %3d) ... ",
+                       step->string_to_parse, length);
+               new_obj = json_tokener_parse_ex(tok, step->string_to_parse, length);
+
+               jerr = json_tokener_get_error(tok);
+               if (step->expected_error != json_tokener_success)
+               {
+                       if (new_obj != NULL)
+                               printf("ERROR: invalid object returned: %s\n",
+                                       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));
+                       else if (tok->char_offset != expected_char_offset)
+                               printf("ERROR: wrong char_offset %d != expected %d\n",
+                                       tok->char_offset,
+                                       expected_char_offset);
+                       else
+                       {
+                               printf("OK: got correct error: %s\n", json_tokener_error_desc(jerr));
+                               this_step_ok = 1;
+                       }
+               }
+               else
+               {
+                       if (new_obj == NULL)
+                               printf("ERROR: expected valid object, instead: %s\n",
+                                       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);
+                       else
+                       {
+                               printf("OK: got object of type [%s]: %s\n",
+                                       json_type_to_name(json_object_get_type(new_obj)),
+                                       json_object_to_json_string(new_obj));
+                               this_step_ok = 1;
+                       }
+               }
+
+               if (new_obj)
+                       json_object_put(new_obj);
+
+               if (step->reset_tokener)
+                       json_tokener_reset(tok);
+
+               if (this_step_ok)
+                       num_ok++;
+               else
+                       num_error++;
+       }
+
+       json_tokener_free(tok);
+
+       printf("End Incremental Tests OK=%d ERROR=%d\n", num_ok, num_error);
+
+       return;
+}
diff --git a/tests/test_parse.expected b/tests/test_parse.expected
new file mode 100644 (file)
index 0000000..2481bde
--- /dev/null
@@ -0,0 +1,46 @@
+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()=true
+new_obj.to_string()=12
+new_obj.to_string()=12.300000
+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 ] }
+==================================
+json_tokener_parse_versbose() OK
+==================================
+Starting incremental tests.
+json_tokener_parse({ "foo) ... got error as expected
+json_tokener_parse_ex(tok, { "foo": 123 },  14) ... OK: got object of type [object]: { "foo": 123 }
+json_tokener_parse_ex(tok, { "foo": 456 },  14) ... OK: got object of type [object]: { "foo": 456 }
+json_tokener_parse_ex(tok, { "foo": 789 },  14) ... OK: got object of type [object]: { "foo": 789 }
+json_tokener_parse_ex(tok, { "foo      ,   6) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, ": {"bar    ,   8) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, ":13}}      ,   6) ... OK: got object of type [object]: { "foo": { "bar": 13 } }
+json_tokener_parse_ex(tok, { "foo      ,   6) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, : "bar"}    ,   8) ... OK: got correct error: unexpected character
+json_tokener_parse_ex(tok, { "foo      ,   6) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, ": {"bar    ,   8) ... OK: got correct error: continue
+json_tokener_parse_ex(tok, ":13}}XXXX  ,  10) ... OK: got object of type [object]: { "foo": { "bar": 13 } }
+json_tokener_parse_ex(tok, XXXX        ,   4) ... OK: got correct error: unexpected character
+json_tokener_parse_ex(tok, {"x": 123 }"X",  14) ... OK: got object of type [object]: { "x": 123 }
+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, "blue"      ,   6) ... OK: got object of type [string]: "blue"
+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
+End Incremental Tests OK=20 ERROR=0
+==================================
diff --git a/tests/test_parse.test b/tests/test_parse.test
new file mode 100755 (executable)
index 0000000..70d1c82
--- /dev/null
@@ -0,0 +1,12 @@
+#!/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 $?
diff --git a/tests/test_parse_int64.c b/tests/test_parse_int64.c
new file mode 100644 (file)
index 0000000..0893356
--- /dev/null
@@ -0,0 +1,105 @@
+
+#include <stdio.h>
+#include <string.h>
+
+#include "config.h"
+
+#include "json_inttypes.h"
+#include "json_util.h"
+
+void checkit(const char *buf)
+{
+       int64_t cint64 = -666;
+
+       int retval = json_parse_int64(buf, &cint64);
+       printf("buf=%s parseit=%d, value=%" PRId64 " \n", buf, retval, cint64);
+}
+
+/**
+ * This test calls json_parse_int64 with a variety of different strings.
+ * It's purpose is to ensure that the results are consistent across all
+ * different environments that it might be executed in.
+ *
+ * This always exits with a 0 exit value.  The output should be compared
+ * against previously saved expected output.
+ */
+int main()
+{
+       char buf[100];
+
+       checkit("x");
+
+       checkit("0");
+       checkit("-0");
+
+       checkit("00000000");
+       checkit("-00000000");
+
+       checkit("1");
+
+       strcpy(buf, "2147483647"); // aka INT32_MAX
+       checkit(buf);
+
+       strcpy(buf, "-1");
+       checkit(buf);
+
+       strcpy(buf, "   -1");
+       checkit(buf);
+
+       strcpy(buf, "00001234");
+       checkit(buf);
+
+       strcpy(buf, "0001234x");
+       checkit(buf);
+
+       strcpy(buf, "-00001234");
+       checkit(buf);
+
+       strcpy(buf, "-00001234x");
+       checkit(buf);
+
+       strcpy(buf, "4294967295"); // aka UINT32_MAX
+
+       sprintf(buf, "4294967296");  // aka UINT32_MAX + 1
+
+       strcpy(buf, "21474836470"); // INT32_MAX * 10
+       checkit(buf);
+
+       strcpy(buf, "31474836470"); // INT32_MAX * 10 + a bunch
+       checkit(buf);
+
+       strcpy(buf, "-2147483647"); // INT32_MIN + 1
+       checkit(buf);
+
+       strcpy(buf, "-2147483648"); // INT32_MIN
+       checkit(buf);
+
+       strcpy(buf, "-2147483649"); // INT32_MIN - 1
+       checkit(buf);
+
+       strcpy(buf, "-21474836480"); // INT32_MIN * 10
+       checkit(buf);
+
+       strcpy(buf, "9223372036854775807"); // INT64_MAX
+       checkit(buf);
+
+       strcpy(buf, "9223372036854775808"); // INT64_MAX + 1
+       checkit(buf);
+
+       strcpy(buf, "-9223372036854775808"); // INT64_MIN
+       checkit(buf);
+
+       strcpy(buf, "-9223372036854775809"); // INT64_MIN - 1
+       checkit(buf);
+
+       strcpy(buf, "18446744073709551615"); // UINT64_MAX
+       checkit(buf);
+
+       strcpy(buf, "18446744073709551616"); // UINT64_MAX + 1
+       checkit(buf);
+
+       strcpy(buf, "-18446744073709551616"); // -UINT64_MAX
+       checkit(buf);
+
+       return 0;
+}
diff --git a/tests/test_parse_int64.expected b/tests/test_parse_int64.expected
new file mode 100644 (file)
index 0000000..23a9803
--- /dev/null
@@ -0,0 +1,26 @@
+buf=x parseit=1, value=-666 
+buf=0 parseit=0, value=0 
+buf=-0 parseit=0, value=0 
+buf=00000000 parseit=0, value=0 
+buf=-00000000 parseit=0, value=0 
+buf=1 parseit=0, value=1 
+buf=2147483647 parseit=0, value=2147483647 
+buf=-1 parseit=0, value=-1 
+buf=   -1 parseit=0, value=-1 
+buf=00001234 parseit=0, value=1234 
+buf=0001234x parseit=0, value=1234 
+buf=-00001234 parseit=0, value=-1234 
+buf=-00001234x parseit=0, value=-1234 
+buf=21474836470 parseit=0, value=21474836470 
+buf=31474836470 parseit=0, value=31474836470 
+buf=-2147483647 parseit=0, value=-2147483647 
+buf=-2147483648 parseit=0, value=-2147483648 
+buf=-2147483649 parseit=0, value=-2147483649 
+buf=-21474836480 parseit=0, value=-21474836480 
+buf=9223372036854775807 parseit=0, value=9223372036854775807 
+buf=9223372036854775808 parseit=0, value=9223372036854775807 
+buf=-9223372036854775808 parseit=0, value=-9223372036854775808 
+buf=-9223372036854775809 parseit=0, value=-9223372036854775808 
+buf=18446744073709551615 parseit=0, value=9223372036854775807 
+buf=18446744073709551616 parseit=0, value=9223372036854775807 
+buf=-18446744073709551616 parseit=0, value=-9223372036854775808 
diff --git a/tests/test_printbuf.c b/tests/test_printbuf.c
new file mode 100644 (file)
index 0000000..3676b54
--- /dev/null
@@ -0,0 +1,165 @@
+#include <assert.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include "debug.h"
+#include "printbuf.h"
+
+static void test_basic_printbuf_memset(void);
+static void test_printbuf_memset_length(void);
+
+static void test_basic_printbuf_memset()
+{
+       struct printbuf *pb;
+       
+       printf("%s: starting test\n", __func__);
+       pb = printbuf_new();
+       sprintbuf(pb, "blue:%d", 1);
+       printbuf_memset(pb, -1, 'x', 52);
+       printf("Buffer contents:%.*s\n", printbuf_length(pb), pb->buf);
+       printbuf_free(pb);
+       printf("%s: end test\n", __func__);
+}
+
+static void test_printbuf_memset_length()
+{
+       struct printbuf *pb;
+
+       printf("%s: starting test\n", __func__);
+       pb = printbuf_new();
+       printbuf_memset(pb, -1, ' ', 0);
+       printbuf_memset(pb, -1, ' ', 0);
+       printbuf_memset(pb, -1, ' ', 0);
+       printbuf_memset(pb, -1, ' ', 0);
+       printbuf_memset(pb, -1, ' ', 0);
+       printf("Buffer length: %d\n", printbuf_length(pb));
+       printbuf_memset(pb, -1, ' ', 2);
+       printbuf_memset(pb, -1, ' ', 4);
+       printbuf_memset(pb, -1, ' ', 6);
+       printf("Buffer length: %d\n", printbuf_length(pb));
+       printbuf_memset(pb, -1, ' ', 6);
+       printf("Buffer length: %d\n", printbuf_length(pb));
+       printbuf_memset(pb, -1, ' ', 8);
+       printbuf_memset(pb, -1, ' ', 10);
+       printbuf_memset(pb, -1, ' ', 10);
+       printbuf_memset(pb, -1, ' ', 10);
+       printbuf_memset(pb, -1, ' ', 20);
+       printf("Buffer length: %d\n", printbuf_length(pb));
+
+       // No length change should occur
+       printbuf_memset(pb, 0, 'x', 30);
+       printf("Buffer length: %d\n", printbuf_length(pb));
+
+       // This should extend it by one.
+       printbuf_memset(pb, 0, 'x', printbuf_length(pb) + 1);
+       printf("Buffer length: %d\n", printbuf_length(pb));
+
+       printbuf_free(pb);
+       printf("%s: end test\n", __func__);
+}
+
+static void test_printbuf_memappend(int *before_resize);
+static void test_printbuf_memappend(int *before_resize)
+{
+       struct printbuf *pb;
+       int initial_size;
+
+       printf("%s: starting test\n", __func__);
+       pb = printbuf_new();
+       printf("Buffer length: %d\n", printbuf_length(pb));
+
+       initial_size = pb->size;
+
+       while(pb->size == initial_size)
+       {
+               printbuf_memappend_fast(pb, "x", 1);
+       }
+       *before_resize = printbuf_length(pb) - 1;
+       printf("Appended %d bytes for resize: [%s]\n", *before_resize + 1, pb->buf);
+
+       printbuf_reset(pb);
+       printbuf_memappend_fast(pb, "bluexyz123", 3);
+       printf("Partial append: %d, [%s]\n", printbuf_length(pb), pb->buf);
+
+       char with_nulls[] = { 'a', 'b', '\0', 'c' };
+       printbuf_reset(pb);
+       printbuf_memappend_fast(pb, with_nulls, sizeof(with_nulls));
+       printf("With embedded \\0 character: %d, [%s]\n", printbuf_length(pb), pb->buf);
+
+       printbuf_free(pb);
+       pb = printbuf_new();
+       char *data = malloc(*before_resize);
+       memset(data, 'X', *before_resize);
+       printbuf_memappend_fast(pb, data, *before_resize);
+       printf("Append to just before resize: %d, [%s]\n", printbuf_length(pb), pb->buf);
+
+       free(data);
+       printbuf_free(pb);
+
+       pb = printbuf_new();
+       data = malloc(*before_resize + 1);
+       memset(data, 'X', *before_resize + 1);
+       printbuf_memappend_fast(pb, data, *before_resize + 1);
+       printf("Append to just after resize: %d, [%s]\n", printbuf_length(pb), pb->buf);
+       
+       free(data);
+
+       printbuf_free(pb);
+       printf("%s: end test\n", __func__);
+}
+
+static void test_sprintbuf(int before_resize);
+static void test_sprintbuf(int before_resize)
+{
+       struct printbuf *pb;
+
+       printf("%s: starting test\n", __func__);
+       pb = printbuf_new();
+       printf("Buffer length: %d\n", printbuf_length(pb));
+
+       char *data = malloc(before_resize + 1 + 1);
+       memset(data, 'X', before_resize + 1 + 1);
+       data[before_resize + 1] = '\0';
+       sprintbuf(pb, "%s", data);
+       printf("sprintbuf to just after resize(%d+1): %d, [%s], strlen(buf)=%d\n", before_resize, printbuf_length(pb), pb->buf, strlen(pb->buf));
+
+       printbuf_reset(pb);
+       sprintbuf(pb, "plain");
+       printf("%d, [%s]\n", printbuf_length(pb), pb->buf);
+
+       sprintbuf(pb, "%d", 1);
+       printf("%d, [%s]\n", printbuf_length(pb), pb->buf);
+
+       sprintbuf(pb, "%d", INT_MAX);
+       printf("%d, [%s]\n", printbuf_length(pb), pb->buf);
+
+       sprintbuf(pb, "%d", INT_MIN);
+       printf("%d, [%s]\n", printbuf_length(pb), pb->buf);
+
+       sprintbuf(pb, "%s", "%s");
+       printf("%d, [%s]\n", printbuf_length(pb), pb->buf);
+
+       printbuf_free(pb);
+       printf("%s: end test\n", __func__);
+}
+
+int main(int argc, char **argv)
+{
+       int before_resize = 0;
+
+       mc_set_debug(1);
+
+       test_basic_printbuf_memset();
+       printf("========================================\n");
+       test_printbuf_memset_length();
+       printf("========================================\n");
+       test_printbuf_memappend(&before_resize);
+       printf("========================================\n");
+       test_sprintbuf(before_resize);
+       printf("========================================\n");
+
+       return 0;
+}
diff --git a/tests/test_printbuf.expected b/tests/test_printbuf.expected
new file mode 100644 (file)
index 0000000..142db0b
--- /dev/null
@@ -0,0 +1,32 @@
+test_basic_printbuf_memset: starting test
+Buffer contents:blue:1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+test_basic_printbuf_memset: end test
+========================================
+test_printbuf_memset_length: starting test
+Buffer length: 0
+Buffer length: 12
+Buffer length: 18
+Buffer length: 76
+Buffer length: 76
+Buffer length: 77
+test_printbuf_memset_length: end test
+========================================
+test_printbuf_memappend: starting test
+Buffer length: 0
+Appended 32 bytes for resize: [xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]
+Partial append: 3, [blu]
+With embedded \0 character: 4, [ab]
+Append to just before resize: 31, [XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
+Append to just after resize: 32, [XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
+test_printbuf_memappend: end test
+========================================
+test_sprintbuf: starting test
+Buffer length: 0
+sprintbuf to just after resize(31+1): 32, [XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX], strlen(buf)=32
+5, [plain]
+6, [plain1]
+16, [plain12147483647]
+27, [plain12147483647-2147483648]
+29, [plain12147483647-2147483648%s]
+test_sprintbuf: end test
+========================================
diff --git a/tests/test_printbuf.test b/tests/test_printbuf.test
new file mode 100755 (executable)
index 0000000..09d27c2
--- /dev/null
@@ -0,0 +1,12 @@
+#!/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 $?