gtl-parsley-ruby 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +3 -0
- data/README +32 -0
- data/Rakefile +57 -0
- data/VERSION +1 -0
- data/ext/cparsley.c +152 -0
- data/ext/extconf.rb +82 -0
- data/ext/parsley/.gitignore +32 -0
- data/ext/parsley/AUTHORS +1 -0
- data/ext/parsley/ChangeLog +0 -0
- data/ext/parsley/HACKING +4 -0
- data/ext/parsley/INSTALL +73 -0
- data/ext/parsley/INTRO +84 -0
- data/ext/parsley/Makefile.am +80 -0
- data/ext/parsley/Makefile.in +1009 -0
- data/ext/parsley/NEWS +0 -0
- data/ext/parsley/PAPER +36 -0
- data/ext/parsley/Portfile +18 -0
- data/ext/parsley/Portfile.in +17 -0
- data/ext/parsley/README.C-LANG +92 -0
- data/ext/parsley/README.markdown +1 -0
- data/ext/parsley/TODO +39 -0
- data/ext/parsley/VERSION +1 -0
- data/ext/parsley/aclocal.m4 +8918 -0
- data/ext/parsley/bootstrap.sh +6 -0
- data/ext/parsley/config.guess +1561 -0
- data/ext/parsley/config.sub +1686 -0
- data/ext/parsley/configure +13437 -0
- data/ext/parsley/configure.ac +46 -0
- data/ext/parsley/depcomp +630 -0
- data/ext/parsley/functions.c +368 -0
- data/ext/parsley/functions.h +19 -0
- data/ext/parsley/generate_bisect.sh +12 -0
- data/ext/parsley/hooks/prepare-commit-msg +16 -0
- data/ext/parsley/install-sh +520 -0
- data/ext/parsley/json-c-0.9/AUTHORS +2 -0
- data/ext/parsley/json-c-0.9/COPYING +19 -0
- data/ext/parsley/json-c-0.9/ChangeLog +103 -0
- data/ext/parsley/json-c-0.9/INSTALL +302 -0
- data/ext/parsley/json-c-0.9/Makefile.am +43 -0
- data/ext/parsley/json-c-0.9/Makefile.in +800 -0
- data/ext/parsley/json-c-0.9/NEWS +1 -0
- data/ext/parsley/json-c-0.9/README +20 -0
- data/ext/parsley/json-c-0.9/README-WIN32.html +57 -0
- data/ext/parsley/json-c-0.9/README.html +32 -0
- data/ext/parsley/json-c-0.9/aclocal.m4 +8909 -0
- data/ext/parsley/json-c-0.9/arraylist.c +94 -0
- data/ext/parsley/json-c-0.9/arraylist.h +53 -0
- data/ext/parsley/json-c-0.9/bits.h +27 -0
- data/ext/parsley/json-c-0.9/config.guess +1561 -0
- data/ext/parsley/json-c-0.9/config.h +125 -0
- data/ext/parsley/json-c-0.9/config.h.in +124 -0
- data/ext/parsley/json-c-0.9/config.h.win32 +94 -0
- data/ext/parsley/json-c-0.9/config.sub +1686 -0
- data/ext/parsley/json-c-0.9/configure +13084 -0
- data/ext/parsley/json-c-0.9/configure.in +33 -0
- data/ext/parsley/json-c-0.9/debug.c +98 -0
- data/ext/parsley/json-c-0.9/debug.h +50 -0
- data/ext/parsley/json-c-0.9/depcomp +630 -0
- data/ext/parsley/json-c-0.9/doc/html/annotated.html +40 -0
- data/ext/parsley/json-c-0.9/doc/html/arraylist_8h.html +240 -0
- data/ext/parsley/json-c-0.9/doc/html/bits_8h.html +150 -0
- data/ext/parsley/json-c-0.9/doc/html/classes.html +36 -0
- data/ext/parsley/json-c-0.9/doc/html/config_8h.html +612 -0
- data/ext/parsley/json-c-0.9/doc/html/debug_8h.html +392 -0
- data/ext/parsley/json-c-0.9/doc/html/doxygen.css +441 -0
- data/ext/parsley/json-c-0.9/doc/html/doxygen.png +0 -0
- data/ext/parsley/json-c-0.9/doc/html/files.html +42 -0
- data/ext/parsley/json-c-0.9/doc/html/functions.html +206 -0
- data/ext/parsley/json-c-0.9/doc/html/functions_vars.html +206 -0
- data/ext/parsley/json-c-0.9/doc/html/globals.html +459 -0
- data/ext/parsley/json-c-0.9/doc/html/globals_defs.html +202 -0
- data/ext/parsley/json-c-0.9/doc/html/globals_enum.html +50 -0
- data/ext/parsley/json-c-0.9/doc/html/globals_eval.html +135 -0
- data/ext/parsley/json-c-0.9/doc/html/globals_func.html +194 -0
- data/ext/parsley/json-c-0.9/doc/html/globals_type.html +70 -0
- data/ext/parsley/json-c-0.9/doc/html/globals_vars.html +50 -0
- data/ext/parsley/json-c-0.9/doc/html/index.html +25 -0
- data/ext/parsley/json-c-0.9/doc/html/json_8h.html +32 -0
- data/ext/parsley/json-c-0.9/doc/html/json__object_8h.html +1150 -0
- data/ext/parsley/json-c-0.9/doc/html/json__object__private_8h.html +75 -0
- data/ext/parsley/json-c-0.9/doc/html/json__tokener_8h.html +366 -0
- data/ext/parsley/json-c-0.9/doc/html/json__util_8h.html +106 -0
- data/ext/parsley/json-c-0.9/doc/html/linkhash_8h.html +740 -0
- data/ext/parsley/json-c-0.9/doc/html/printbuf_8h.html +214 -0
- data/ext/parsley/json-c-0.9/doc/html/structarray__list.html +104 -0
- data/ext/parsley/json-c-0.9/doc/html/structjson__object.html +141 -0
- data/ext/parsley/json-c-0.9/doc/html/structjson__object__iter.html +87 -0
- data/ext/parsley/json-c-0.9/doc/html/structjson__tokener.html +206 -0
- data/ext/parsley/json-c-0.9/doc/html/structjson__tokener__srec.html +104 -0
- data/ext/parsley/json-c-0.9/doc/html/structlh__entry.html +105 -0
- data/ext/parsley/json-c-0.9/doc/html/structlh__table.html +275 -0
- data/ext/parsley/json-c-0.9/doc/html/structprintbuf.html +87 -0
- data/ext/parsley/json-c-0.9/doc/html/tab_b.gif +0 -0
- data/ext/parsley/json-c-0.9/doc/html/tab_l.gif +0 -0
- data/ext/parsley/json-c-0.9/doc/html/tab_r.gif +0 -0
- data/ext/parsley/json-c-0.9/doc/html/tabs.css +105 -0
- data/ext/parsley/json-c-0.9/doc/html/unionjson__object_1_1data.html +140 -0
- data/ext/parsley/json-c-0.9/install-sh +520 -0
- data/ext/parsley/json-c-0.9/json.h +31 -0
- data/ext/parsley/json-c-0.9/json.pc +11 -0
- data/ext/parsley/json-c-0.9/json.pc.in +11 -0
- data/ext/parsley/json-c-0.9/json_object.c +512 -0
- data/ext/parsley/json-c-0.9/json_object.h +319 -0
- data/ext/parsley/json-c-0.9/json_object_private.h +52 -0
- data/ext/parsley/json-c-0.9/json_tokener.c +628 -0
- data/ext/parsley/json-c-0.9/json_tokener.h +98 -0
- data/ext/parsley/json-c-0.9/json_util.c +122 -0
- data/ext/parsley/json-c-0.9/json_util.h +31 -0
- data/ext/parsley/json-c-0.9/libjson.la +41 -0
- data/ext/parsley/json-c-0.9/libtool +8890 -0
- data/ext/parsley/json-c-0.9/linkhash.c +216 -0
- data/ext/parsley/json-c-0.9/linkhash.h +272 -0
- data/ext/parsley/json-c-0.9/ltmain.sh +8406 -0
- data/ext/parsley/json-c-0.9/missing +376 -0
- data/ext/parsley/json-c-0.9/printbuf.c +149 -0
- data/ext/parsley/json-c-0.9/printbuf.h +64 -0
- data/ext/parsley/json-c-0.9/stamp-h1 +1 -0
- data/ext/parsley/json-c-0.9/test1 +130 -0
- data/ext/parsley/json-c-0.9/test1.c +164 -0
- data/ext/parsley/json-c-0.9/test2 +130 -0
- data/ext/parsley/json-c-0.9/test2.c +20 -0
- data/ext/parsley/json-c-0.9/test3 +130 -0
- data/ext/parsley/json-c-0.9/test3.c +23 -0
- data/ext/parsley/libtool +8890 -0
- data/ext/parsley/ltmain.sh +8406 -0
- data/ext/parsley/missing +376 -0
- data/ext/parsley/parsed_xpath.c +168 -0
- data/ext/parsley/parsed_xpath.h +34 -0
- data/ext/parsley/parser.y +631 -0
- data/ext/parsley/parsley.c +793 -0
- data/ext/parsley/parsley.h +87 -0
- data/ext/parsley/parsley_main.c +185 -0
- data/ext/parsley/parsleyc_main.c +108 -0
- data/ext/parsley/regexp.c +359 -0
- data/ext/parsley/regexp.h +36 -0
- data/ext/parsley/scanner.l +221 -0
- data/ext/parsley/test/ambiguous.html +207 -0
- data/ext/parsley/test/ambiguous.json +1 -0
- data/ext/parsley/test/ambiguous.let +6 -0
- data/ext/parsley/test/array-regression.html +5 -0
- data/ext/parsley/test/array-regression.json +1 -0
- data/ext/parsley/test/array-regression.let +10 -0
- data/ext/parsley/test/backslash.html +5 -0
- data/ext/parsley/test/backslash.json +1 -0
- data/ext/parsley/test/backslash.let +3 -0
- data/ext/parsley/test/bang.html +17 -0
- data/ext/parsley/test/bang.json +1 -0
- data/ext/parsley/test/bang.let +6 -0
- data/ext/parsley/test/collate_regression.html +324 -0
- data/ext/parsley/test/collate_regression.json +1 -0
- data/ext/parsley/test/collate_regression.let +9 -0
- data/ext/parsley/test/contains.html +3 -0
- data/ext/parsley/test/contains.json +1 -0
- data/ext/parsley/test/contains.let +3 -0
- data/ext/parsley/test/content.html +13 -0
- data/ext/parsley/test/content.json +1 -0
- data/ext/parsley/test/content.let +7 -0
- data/ext/parsley/test/cool.html +575 -0
- data/ext/parsley/test/cool.json +1 -0
- data/ext/parsley/test/cool.let +9 -0
- data/ext/parsley/test/craigs-simple.html +207 -0
- data/ext/parsley/test/craigs-simple.json +1 -0
- data/ext/parsley/test/craigs-simple.let +6 -0
- data/ext/parsley/test/craigs.html +207 -0
- data/ext/parsley/test/craigs.json +1 -0
- data/ext/parsley/test/craigs.let +9 -0
- data/ext/parsley/test/crash.html +157 -0
- data/ext/parsley/test/crash.json +1 -0
- data/ext/parsley/test/crash.let +1 -0
- data/ext/parsley/test/css_attr.html +3 -0
- data/ext/parsley/test/css_attr.json +1 -0
- data/ext/parsley/test/css_attr.let +3 -0
- data/ext/parsley/test/default-namespace.json +1 -0
- data/ext/parsley/test/default-namespace.let +3 -0
- data/ext/parsley/test/default-namespace.xml +1493 -0
- data/ext/parsley/test/div.html +8 -0
- data/ext/parsley/test/div.json +1 -0
- data/ext/parsley/test/div.let +10 -0
- data/ext/parsley/test/empty.html +3 -0
- data/ext/parsley/test/empty.json +1 -0
- data/ext/parsley/test/empty.let +1 -0
- data/ext/parsley/test/emptyish.html +207 -0
- data/ext/parsley/test/emptyish.let +3 -0
- data/ext/parsley/test/fictional-opt.html +43 -0
- data/ext/parsley/test/fictional-opt.json +1 -0
- data/ext/parsley/test/fictional-opt.let +14 -0
- data/ext/parsley/test/fictional.html +43 -0
- data/ext/parsley/test/fictional.json +1 -0
- data/ext/parsley/test/fictional.let +14 -0
- data/ext/parsley/test/function-magic.html +9 -0
- data/ext/parsley/test/function-magic.json +1 -0
- data/ext/parsley/test/function-magic.let +8 -0
- data/ext/parsley/test/hn.html +32 -0
- data/ext/parsley/test/hn.json +1 -0
- data/ext/parsley/test/hn.let +8 -0
- data/ext/parsley/test/malformed-array.html +2329 -0
- data/ext/parsley/test/malformed-array.json +1 -0
- data/ext/parsley/test/malformed-array.let +22 -0
- data/ext/parsley/test/malformed-expr.html +2329 -0
- data/ext/parsley/test/malformed-expr.json +1 -0
- data/ext/parsley/test/malformed-expr.let +16 -0
- data/ext/parsley/test/malformed-function.html +845 -0
- data/ext/parsley/test/malformed-function.json +197 -0
- data/ext/parsley/test/malformed-function.let +8 -0
- data/ext/parsley/test/malformed-json.html +2329 -0
- data/ext/parsley/test/malformed-json.json +1 -0
- data/ext/parsley/test/malformed-json.let +6 -0
- data/ext/parsley/test/malformed-xpath.html +8 -0
- data/ext/parsley/test/malformed-xpath.json +1 -0
- data/ext/parsley/test/malformed-xpath.let +7 -0
- data/ext/parsley/test/match.json +1 -0
- data/ext/parsley/test/match.let +9 -0
- data/ext/parsley/test/match.xml +11 -0
- data/ext/parsley/test/math_ambiguity.html +9 -0
- data/ext/parsley/test/math_ambiguity.json +1 -0
- data/ext/parsley/test/math_ambiguity.let +5 -0
- data/ext/parsley/test/nth-regression.html +13 -0
- data/ext/parsley/test/nth-regression.json +1 -0
- data/ext/parsley/test/nth-regression.let +3 -0
- data/ext/parsley/test/optional.html +2328 -0
- data/ext/parsley/test/optional.json +1 -0
- data/ext/parsley/test/optional.let +8 -0
- data/ext/parsley/test/outer-xml.html +6 -0
- data/ext/parsley/test/outer-xml.json +1 -0
- data/ext/parsley/test/outer-xml.let +5 -0
- data/ext/parsley/test/position.html +8 -0
- data/ext/parsley/test/position.json +1 -0
- data/ext/parsley/test/position.let +6 -0
- data/ext/parsley/test/question_regressions.html +443 -0
- data/ext/parsley/test/question_regressions.json +1 -0
- data/ext/parsley/test/question_regressions.let +6 -0
- data/ext/parsley/test/quote.json +1 -0
- data/ext/parsley/test/quote.let +8 -0
- data/ext/parsley/test/quote.xml +11 -0
- data/ext/parsley/test/reddit.html +1 -0
- data/ext/parsley/test/reddit.json +1 -0
- data/ext/parsley/test/reddit.let +12 -0
- data/ext/parsley/test/remote-fail.json +1 -0
- data/ext/parsley/test/remote.html +3 -0
- data/ext/parsley/test/remote.json +1 -0
- data/ext/parsley/test/remote.let +4 -0
- data/ext/parsley/test/replace.json +1 -0
- data/ext/parsley/test/replace.let +9 -0
- data/ext/parsley/test/replace.xml +11 -0
- data/ext/parsley/test/scope.html +10 -0
- data/ext/parsley/test/scope.json +1 -0
- data/ext/parsley/test/scope.let +6 -0
- data/ext/parsley/test/segfault.html +5 -0
- data/ext/parsley/test/segfault.json +1 -0
- data/ext/parsley/test/segfault.let +9 -0
- data/ext/parsley/test/sg-wrap.html +5 -0
- data/ext/parsley/test/sg-wrap.json +1 -0
- data/ext/parsley/test/sg-wrap.let +3 -0
- data/ext/parsley/test/sg_off.html +5 -0
- data/ext/parsley/test/sg_off.json +1 -0
- data/ext/parsley/test/sg_off.let +3 -0
- data/ext/parsley/test/test.json +1 -0
- data/ext/parsley/test/test.let +6 -0
- data/ext/parsley/test/test.xml +11 -0
- data/ext/parsley/test/trivial.html +2329 -0
- data/ext/parsley/test/trivial.json +1 -0
- data/ext/parsley/test/trivial.let +4 -0
- data/ext/parsley/test/trivial2.html +2329 -0
- data/ext/parsley/test/trivial2.json +1 -0
- data/ext/parsley/test/trivial2.let +7 -0
- data/ext/parsley/test/unbang.html +17 -0
- data/ext/parsley/test/unbang.json +1 -0
- data/ext/parsley/test/unbang.let +6 -0
- data/ext/parsley/test/unicode.html +3 -0
- data/ext/parsley/test/unicode.json +1 -0
- data/ext/parsley/test/unicode.let +1 -0
- data/ext/parsley/test/whitespace.html +8 -0
- data/ext/parsley/test/whitespace.json +1 -0
- data/ext/parsley/test/whitespace.let +3 -0
- data/ext/parsley/test/whitespace_regression.html +4 -0
- data/ext/parsley/test/whitespace_regression.json +1 -0
- data/ext/parsley/test/whitespace_regression.let +3 -0
- data/ext/parsley/test/yelp-benchmark.rb +53 -0
- data/ext/parsley/test/yelp-home.html +1004 -0
- data/ext/parsley/test/yelp-home.json +1 -0
- data/ext/parsley/test/yelp-home.let +6 -0
- data/ext/parsley/test/yelp.html +2329 -0
- data/ext/parsley/test/yelp.json +1 -0
- data/ext/parsley/test/yelp.let +12 -0
- data/ext/parsley/test/youtube.html +1940 -0
- data/ext/parsley/test/youtube.let +11 -0
- data/ext/parsley/util.c +237 -0
- data/ext/parsley/util.h +34 -0
- data/ext/parsley/xml2json.c +47 -0
- data/ext/parsley/xml2json.h +14 -0
- data/ext/parsley/y.tab.h +222 -0
- data/ext/parsley/ylwrap +222 -0
- data/lib/parsley.rb +84 -0
- data/test/test_parsley.rb +120 -0
- data/test/yelp-benchmark.rb +53 -0
- data/test/yelp-home.html +1004 -0
- data/test/yelp-home.let +6 -0
- data/test/yelp.html +2329 -0
- metadata +366 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* $Id: json.h,v 1.6 2006/01/26 02:16:28 mclark Exp $
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
|
5
|
+
* Michael Clark <michael@metaparadigm.com>
|
|
6
|
+
*
|
|
7
|
+
* This library is free software; you can redistribute it and/or modify
|
|
8
|
+
* it under the terms of the MIT license. See COPYING for details.
|
|
9
|
+
*
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
#ifndef _json_h_
|
|
13
|
+
#define _json_h_
|
|
14
|
+
|
|
15
|
+
#ifdef __cplusplus
|
|
16
|
+
extern "C" {
|
|
17
|
+
#endif
|
|
18
|
+
|
|
19
|
+
#include "bits.h"
|
|
20
|
+
#include "debug.h"
|
|
21
|
+
#include "linkhash.h"
|
|
22
|
+
#include "arraylist.h"
|
|
23
|
+
#include "json_util.h"
|
|
24
|
+
#include "json_object.h"
|
|
25
|
+
#include "json_tokener.h"
|
|
26
|
+
|
|
27
|
+
#ifdef __cplusplus
|
|
28
|
+
}
|
|
29
|
+
#endif
|
|
30
|
+
|
|
31
|
+
#endif
|
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* $Id: json_object.c,v 1.17 2006/07/25 03:24:50 mclark Exp $
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
|
5
|
+
* Michael Clark <michael@metaparadigm.com>
|
|
6
|
+
*
|
|
7
|
+
* This library is free software; you can redistribute it and/or modify
|
|
8
|
+
* it under the terms of the MIT license. See COPYING for details.
|
|
9
|
+
*
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
#include "config.h"
|
|
13
|
+
|
|
14
|
+
#include <stdio.h>
|
|
15
|
+
#include <stdlib.h>
|
|
16
|
+
#include <stddef.h>
|
|
17
|
+
#include <string.h>
|
|
18
|
+
|
|
19
|
+
#include "debug.h"
|
|
20
|
+
#include "printbuf.h"
|
|
21
|
+
#include "linkhash.h"
|
|
22
|
+
#include "arraylist.h"
|
|
23
|
+
#include "json_object.h"
|
|
24
|
+
#include "json_object_private.h"
|
|
25
|
+
|
|
26
|
+
#if !HAVE_STRNDUP
|
|
27
|
+
char* strndup(const char* str, size_t n);
|
|
28
|
+
#endif /* !HAVE_STRNDUP */
|
|
29
|
+
|
|
30
|
+
/* #define REFCOUNT_DEBUG 1 */
|
|
31
|
+
|
|
32
|
+
const char *json_number_chars = "0123456789.+-eE";
|
|
33
|
+
const char *json_hex_chars = "0123456789abcdef";
|
|
34
|
+
|
|
35
|
+
#ifdef REFCOUNT_DEBUG
|
|
36
|
+
static const char* json_type_name[] = {
|
|
37
|
+
"null",
|
|
38
|
+
"boolean",
|
|
39
|
+
"double",
|
|
40
|
+
"int",
|
|
41
|
+
"object",
|
|
42
|
+
"array",
|
|
43
|
+
"string",
|
|
44
|
+
};
|
|
45
|
+
#endif /* REFCOUNT_DEBUG */
|
|
46
|
+
|
|
47
|
+
static void json_object_generic_delete(struct json_object* jso);
|
|
48
|
+
static struct json_object* json_object_new(enum json_type o_type);
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
/* ref count debugging */
|
|
52
|
+
|
|
53
|
+
#ifdef REFCOUNT_DEBUG
|
|
54
|
+
|
|
55
|
+
static struct lh_table *json_object_table;
|
|
56
|
+
|
|
57
|
+
static void json_object_init(void) __attribute__ ((constructor));
|
|
58
|
+
static void json_object_init(void) {
|
|
59
|
+
MC_DEBUG("json_object_init: creating object table\n");
|
|
60
|
+
json_object_table = lh_kptr_table_new(128, "json_object_table", NULL);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
static void json_object_fini(void) __attribute__ ((destructor));
|
|
64
|
+
static void json_object_fini(void) {
|
|
65
|
+
struct lh_entry *ent;
|
|
66
|
+
if(MC_GET_DEBUG()) {
|
|
67
|
+
if (json_object_table->count) {
|
|
68
|
+
MC_DEBUG("json_object_fini: %d referenced objects at exit\n",
|
|
69
|
+
json_object_table->count);
|
|
70
|
+
lh_foreach(json_object_table, ent) {
|
|
71
|
+
struct json_object* obj = (struct json_object*)ent->v;
|
|
72
|
+
MC_DEBUG("\t%s:%p\n", json_type_name[obj->o_type], obj);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
MC_DEBUG("json_object_fini: freeing object table\n");
|
|
77
|
+
lh_table_free(json_object_table);
|
|
78
|
+
}
|
|
79
|
+
#endif /* REFCOUNT_DEBUG */
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
/* string escaping */
|
|
83
|
+
|
|
84
|
+
static int json_escape_str(struct printbuf *pb, char *str)
|
|
85
|
+
{
|
|
86
|
+
int pos = 0, start_offset = 0;
|
|
87
|
+
unsigned char c;
|
|
88
|
+
do {
|
|
89
|
+
c = str[pos];
|
|
90
|
+
switch(c) {
|
|
91
|
+
case '\0':
|
|
92
|
+
break;
|
|
93
|
+
case '\b':
|
|
94
|
+
case '\n':
|
|
95
|
+
case '\r':
|
|
96
|
+
case '\t':
|
|
97
|
+
case '"':
|
|
98
|
+
case '\\':
|
|
99
|
+
case '/':
|
|
100
|
+
if(pos - start_offset > 0)
|
|
101
|
+
printbuf_memappend(pb, str + start_offset, pos - start_offset);
|
|
102
|
+
if(c == '\b') printbuf_memappend(pb, "\\b", 2);
|
|
103
|
+
else if(c == '\n') printbuf_memappend(pb, "\\n", 2);
|
|
104
|
+
else if(c == '\r') printbuf_memappend(pb, "\\r", 2);
|
|
105
|
+
else if(c == '\t') printbuf_memappend(pb, "\\t", 2);
|
|
106
|
+
else if(c == '"') printbuf_memappend(pb, "\\\"", 2);
|
|
107
|
+
else if(c == '\\') printbuf_memappend(pb, "\\\\", 2);
|
|
108
|
+
else if(c == '/') printbuf_memappend(pb, "\\/", 2);
|
|
109
|
+
start_offset = ++pos;
|
|
110
|
+
break;
|
|
111
|
+
default:
|
|
112
|
+
if(c < ' ') {
|
|
113
|
+
if(pos - start_offset > 0)
|
|
114
|
+
printbuf_memappend(pb, str + start_offset, pos - start_offset);
|
|
115
|
+
sprintbuf(pb, "\\u00%c%c",
|
|
116
|
+
json_hex_chars[c >> 4],
|
|
117
|
+
json_hex_chars[c & 0xf]);
|
|
118
|
+
start_offset = ++pos;
|
|
119
|
+
} else pos++;
|
|
120
|
+
}
|
|
121
|
+
} while(c);
|
|
122
|
+
if(pos - start_offset > 0)
|
|
123
|
+
printbuf_memappend(pb, str + start_offset, pos - start_offset);
|
|
124
|
+
return 0;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
/* reference counting */
|
|
129
|
+
|
|
130
|
+
extern struct json_object* json_object_get(struct json_object *jso)
|
|
131
|
+
{
|
|
132
|
+
if(jso) {
|
|
133
|
+
jso->_ref_count++;
|
|
134
|
+
}
|
|
135
|
+
return jso;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
extern void json_object_put(struct json_object *jso)
|
|
139
|
+
{
|
|
140
|
+
if(jso) {
|
|
141
|
+
jso->_ref_count--;
|
|
142
|
+
if(!jso->_ref_count) jso->_delete(jso);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
/* generic object construction and destruction parts */
|
|
148
|
+
|
|
149
|
+
static void json_object_generic_delete(struct json_object* jso)
|
|
150
|
+
{
|
|
151
|
+
#ifdef REFCOUNT_DEBUG
|
|
152
|
+
MC_DEBUG("json_object_delete_%s: %p\n",
|
|
153
|
+
json_type_name[jso->o_type], jso);
|
|
154
|
+
lh_table_delete(json_object_table, jso);
|
|
155
|
+
#endif /* REFCOUNT_DEBUG */
|
|
156
|
+
printbuf_free(jso->_pb);
|
|
157
|
+
free(jso);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
static struct json_object* json_object_new(enum json_type o_type)
|
|
161
|
+
{
|
|
162
|
+
struct json_object *jso;
|
|
163
|
+
|
|
164
|
+
jso = (struct json_object*)calloc(sizeof(struct json_object), 1);
|
|
165
|
+
if(!jso) return NULL;
|
|
166
|
+
jso->o_type = o_type;
|
|
167
|
+
jso->_ref_count = 1;
|
|
168
|
+
jso->_delete = &json_object_generic_delete;
|
|
169
|
+
#ifdef REFCOUNT_DEBUG
|
|
170
|
+
lh_table_insert(json_object_table, jso, jso);
|
|
171
|
+
MC_DEBUG("json_object_new_%s: %p\n", json_type_name[jso->o_type], jso);
|
|
172
|
+
#endif /* REFCOUNT_DEBUG */
|
|
173
|
+
return jso;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
/* type checking functions */
|
|
178
|
+
|
|
179
|
+
int json_object_is_type(struct json_object *jso, enum json_type type)
|
|
180
|
+
{
|
|
181
|
+
return (jso->o_type == type);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
enum json_type json_object_get_type(struct json_object *jso)
|
|
185
|
+
{
|
|
186
|
+
return jso->o_type;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
/* json_object_to_json_string */
|
|
191
|
+
|
|
192
|
+
const char* json_object_to_json_string(struct json_object *jso)
|
|
193
|
+
{
|
|
194
|
+
if(!jso) return "null";
|
|
195
|
+
if(!jso->_pb) {
|
|
196
|
+
if(!(jso->_pb = printbuf_new())) return NULL;
|
|
197
|
+
} else {
|
|
198
|
+
printbuf_reset(jso->_pb);
|
|
199
|
+
}
|
|
200
|
+
if(jso->_to_json_string(jso, jso->_pb) < 0) return NULL;
|
|
201
|
+
return jso->_pb->buf;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
/* json_object_object */
|
|
206
|
+
|
|
207
|
+
static int json_object_object_to_json_string(struct json_object* jso,
|
|
208
|
+
struct printbuf *pb)
|
|
209
|
+
{
|
|
210
|
+
int i=0;
|
|
211
|
+
struct json_object_iter iter;
|
|
212
|
+
sprintbuf(pb, "{");
|
|
213
|
+
|
|
214
|
+
/* CAW: scope operator to make ANSI correctness */
|
|
215
|
+
/* CAW: switched to json_object_object_foreachC which uses an iterator struct */
|
|
216
|
+
json_object_object_foreachC(jso, iter) {
|
|
217
|
+
if(i) sprintbuf(pb, ",");
|
|
218
|
+
sprintbuf(pb, " \"");
|
|
219
|
+
json_escape_str(pb, iter.key);
|
|
220
|
+
sprintbuf(pb, "\": ");
|
|
221
|
+
if(iter.val == NULL) sprintbuf(pb, "null");
|
|
222
|
+
else iter.val->_to_json_string(iter.val, pb);
|
|
223
|
+
i++;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return sprintbuf(pb, " }");
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
static void json_object_lh_entry_free(struct lh_entry *ent)
|
|
230
|
+
{
|
|
231
|
+
free(ent->k);
|
|
232
|
+
json_object_put((struct json_object*)ent->v);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
static void json_object_object_delete(struct json_object* jso)
|
|
236
|
+
{
|
|
237
|
+
lh_table_free(jso->o.c_object);
|
|
238
|
+
json_object_generic_delete(jso);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
struct json_object* json_object_new_object(void)
|
|
242
|
+
{
|
|
243
|
+
struct json_object *jso = json_object_new(json_type_object);
|
|
244
|
+
if(!jso) return NULL;
|
|
245
|
+
jso->_delete = &json_object_object_delete;
|
|
246
|
+
jso->_to_json_string = &json_object_object_to_json_string;
|
|
247
|
+
jso->o.c_object = lh_kchar_table_new(JSON_OBJECT_DEF_HASH_ENTRIES,
|
|
248
|
+
NULL, &json_object_lh_entry_free);
|
|
249
|
+
return jso;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
struct lh_table* json_object_get_object(struct json_object *jso)
|
|
253
|
+
{
|
|
254
|
+
if(!jso) return NULL;
|
|
255
|
+
switch(jso->o_type) {
|
|
256
|
+
case json_type_object:
|
|
257
|
+
return jso->o.c_object;
|
|
258
|
+
default:
|
|
259
|
+
return NULL;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
void json_object_object_add(struct json_object* jso, const char *key,
|
|
264
|
+
struct json_object *val)
|
|
265
|
+
{
|
|
266
|
+
lh_table_delete(jso->o.c_object, key);
|
|
267
|
+
lh_table_insert(jso->o.c_object, strdup(key), val);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
struct json_object* json_object_object_get(struct json_object* jso, const char *key)
|
|
271
|
+
{
|
|
272
|
+
return (struct json_object*) lh_table_lookup(jso->o.c_object, key);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
void json_object_object_del(struct json_object* jso, const char *key)
|
|
276
|
+
{
|
|
277
|
+
lh_table_delete(jso->o.c_object, key);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
/* json_object_boolean */
|
|
282
|
+
|
|
283
|
+
static int json_object_boolean_to_json_string(struct json_object* jso,
|
|
284
|
+
struct printbuf *pb)
|
|
285
|
+
{
|
|
286
|
+
if(jso->o.c_boolean) return sprintbuf(pb, "true");
|
|
287
|
+
else return sprintbuf(pb, "false");
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
struct json_object* json_object_new_boolean(boolean b)
|
|
291
|
+
{
|
|
292
|
+
struct json_object *jso = json_object_new(json_type_boolean);
|
|
293
|
+
if(!jso) return NULL;
|
|
294
|
+
jso->_to_json_string = &json_object_boolean_to_json_string;
|
|
295
|
+
jso->o.c_boolean = b;
|
|
296
|
+
return jso;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
boolean json_object_get_boolean(struct json_object *jso)
|
|
300
|
+
{
|
|
301
|
+
if(!jso) return FALSE;
|
|
302
|
+
switch(jso->o_type) {
|
|
303
|
+
case json_type_boolean:
|
|
304
|
+
return jso->o.c_boolean;
|
|
305
|
+
case json_type_int:
|
|
306
|
+
return (jso->o.c_int != 0);
|
|
307
|
+
case json_type_double:
|
|
308
|
+
return (jso->o.c_double != 0);
|
|
309
|
+
case json_type_string:
|
|
310
|
+
return (strlen(jso->o.c_string) != 0);
|
|
311
|
+
default:
|
|
312
|
+
return FALSE;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
/* json_object_int */
|
|
318
|
+
|
|
319
|
+
static int json_object_int_to_json_string(struct json_object* jso,
|
|
320
|
+
struct printbuf *pb)
|
|
321
|
+
{
|
|
322
|
+
return sprintbuf(pb, "%d", jso->o.c_int);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
struct json_object* json_object_new_int(int i)
|
|
326
|
+
{
|
|
327
|
+
struct json_object *jso = json_object_new(json_type_int);
|
|
328
|
+
if(!jso) return NULL;
|
|
329
|
+
jso->_to_json_string = &json_object_int_to_json_string;
|
|
330
|
+
jso->o.c_int = i;
|
|
331
|
+
return jso;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
int json_object_get_int(struct json_object *jso)
|
|
335
|
+
{
|
|
336
|
+
int cint;
|
|
337
|
+
|
|
338
|
+
if(!jso) return 0;
|
|
339
|
+
switch(jso->o_type) {
|
|
340
|
+
case json_type_int:
|
|
341
|
+
return jso->o.c_int;
|
|
342
|
+
case json_type_double:
|
|
343
|
+
return (int)jso->o.c_double;
|
|
344
|
+
case json_type_boolean:
|
|
345
|
+
return jso->o.c_boolean;
|
|
346
|
+
case json_type_string:
|
|
347
|
+
if(sscanf(jso->o.c_string, "%d", &cint) == 1) return cint;
|
|
348
|
+
default:
|
|
349
|
+
return 0;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
/* json_object_double */
|
|
355
|
+
|
|
356
|
+
static int json_object_double_to_json_string(struct json_object* jso,
|
|
357
|
+
struct printbuf *pb)
|
|
358
|
+
{
|
|
359
|
+
return sprintbuf(pb, "%lf", jso->o.c_double);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
struct json_object* json_object_new_double(double d)
|
|
363
|
+
{
|
|
364
|
+
struct json_object *jso = json_object_new(json_type_double);
|
|
365
|
+
if(!jso) return NULL;
|
|
366
|
+
jso->_to_json_string = &json_object_double_to_json_string;
|
|
367
|
+
jso->o.c_double = d;
|
|
368
|
+
return jso;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
double json_object_get_double(struct json_object *jso)
|
|
372
|
+
{
|
|
373
|
+
double cdouble;
|
|
374
|
+
|
|
375
|
+
if(!jso) return 0.0;
|
|
376
|
+
switch(jso->o_type) {
|
|
377
|
+
case json_type_double:
|
|
378
|
+
return jso->o.c_double;
|
|
379
|
+
case json_type_int:
|
|
380
|
+
return jso->o.c_int;
|
|
381
|
+
case json_type_boolean:
|
|
382
|
+
return jso->o.c_boolean;
|
|
383
|
+
case json_type_string:
|
|
384
|
+
if(sscanf(jso->o.c_string, "%lf", &cdouble) == 1) return cdouble;
|
|
385
|
+
default:
|
|
386
|
+
return 0.0;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
/* json_object_string */
|
|
392
|
+
|
|
393
|
+
static int json_object_string_to_json_string(struct json_object* jso,
|
|
394
|
+
struct printbuf *pb)
|
|
395
|
+
{
|
|
396
|
+
sprintbuf(pb, "\"");
|
|
397
|
+
json_escape_str(pb, jso->o.c_string);
|
|
398
|
+
sprintbuf(pb, "\"");
|
|
399
|
+
return 0;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
static void json_object_string_delete(struct json_object* jso)
|
|
403
|
+
{
|
|
404
|
+
free(jso->o.c_string);
|
|
405
|
+
json_object_generic_delete(jso);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
struct json_object* json_object_new_string(const char *s)
|
|
409
|
+
{
|
|
410
|
+
struct json_object *jso = json_object_new(json_type_string);
|
|
411
|
+
if(!jso) return NULL;
|
|
412
|
+
jso->_delete = &json_object_string_delete;
|
|
413
|
+
jso->_to_json_string = &json_object_string_to_json_string;
|
|
414
|
+
jso->o.c_string = strdup(s);
|
|
415
|
+
return jso;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
struct json_object* json_object_new_string_len(const char *s, int len)
|
|
419
|
+
{
|
|
420
|
+
struct json_object *jso = json_object_new(json_type_string);
|
|
421
|
+
if(!jso) return NULL;
|
|
422
|
+
jso->_delete = &json_object_string_delete;
|
|
423
|
+
jso->_to_json_string = &json_object_string_to_json_string;
|
|
424
|
+
jso->o.c_string = strndup(s, len);
|
|
425
|
+
return jso;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
const char* json_object_get_string(struct json_object *jso)
|
|
429
|
+
{
|
|
430
|
+
if(!jso) return NULL;
|
|
431
|
+
switch(jso->o_type) {
|
|
432
|
+
case json_type_string:
|
|
433
|
+
return jso->o.c_string;
|
|
434
|
+
default:
|
|
435
|
+
return json_object_to_json_string(jso);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
/* json_object_array */
|
|
441
|
+
|
|
442
|
+
static int json_object_array_to_json_string(struct json_object* jso,
|
|
443
|
+
struct printbuf *pb)
|
|
444
|
+
{
|
|
445
|
+
int i;
|
|
446
|
+
sprintbuf(pb, "[");
|
|
447
|
+
for(i=0; i < json_object_array_length(jso); i++) {
|
|
448
|
+
struct json_object *val;
|
|
449
|
+
if(i) { sprintbuf(pb, ", "); }
|
|
450
|
+
else { sprintbuf(pb, " "); }
|
|
451
|
+
|
|
452
|
+
val = json_object_array_get_idx(jso, i);
|
|
453
|
+
if(val == NULL) { sprintbuf(pb, "null"); }
|
|
454
|
+
else { val->_to_json_string(val, pb); }
|
|
455
|
+
}
|
|
456
|
+
return sprintbuf(pb, " ]");
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
static void json_object_array_entry_free(void *data)
|
|
460
|
+
{
|
|
461
|
+
json_object_put((struct json_object*)data);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
static void json_object_array_delete(struct json_object* jso)
|
|
465
|
+
{
|
|
466
|
+
array_list_free(jso->o.c_array);
|
|
467
|
+
json_object_generic_delete(jso);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
struct json_object* json_object_new_array(void)
|
|
471
|
+
{
|
|
472
|
+
struct json_object *jso = json_object_new(json_type_array);
|
|
473
|
+
if(!jso) return NULL;
|
|
474
|
+
jso->_delete = &json_object_array_delete;
|
|
475
|
+
jso->_to_json_string = &json_object_array_to_json_string;
|
|
476
|
+
jso->o.c_array = array_list_new(&json_object_array_entry_free);
|
|
477
|
+
return jso;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
struct array_list* json_object_get_array(struct json_object *jso)
|
|
481
|
+
{
|
|
482
|
+
if(!jso) return NULL;
|
|
483
|
+
switch(jso->o_type) {
|
|
484
|
+
case json_type_array:
|
|
485
|
+
return jso->o.c_array;
|
|
486
|
+
default:
|
|
487
|
+
return NULL;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
int json_object_array_length(struct json_object *jso)
|
|
492
|
+
{
|
|
493
|
+
return array_list_length(jso->o.c_array);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
int json_object_array_add(struct json_object *jso,struct json_object *val)
|
|
497
|
+
{
|
|
498
|
+
return array_list_add(jso->o.c_array, val);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
int json_object_array_put_idx(struct json_object *jso, int idx,
|
|
502
|
+
struct json_object *val)
|
|
503
|
+
{
|
|
504
|
+
return array_list_put_idx(jso->o.c_array, idx, val);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
struct json_object* json_object_array_get_idx(struct json_object *jso,
|
|
508
|
+
int idx)
|
|
509
|
+
{
|
|
510
|
+
return (struct json_object*)array_list_get_idx(jso->o.c_array, idx);
|
|
511
|
+
}
|
|
512
|
+
|