fizx-ordered_json 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. data/.gitignore +29 -0
  2. data/CHANGELOG +22 -0
  3. data/README +4 -0
  4. data/Rakefile +35 -0
  5. data/ext/Makefile +149 -0
  6. data/ext/json-c-0.8/AUTHORS +2 -0
  7. data/ext/json-c-0.8/COPYING +19 -0
  8. data/ext/json-c-0.8/ChangeLog +73 -0
  9. data/ext/json-c-0.8/INSTALL +229 -0
  10. data/ext/json-c-0.8/Makefile.am +43 -0
  11. data/ext/json-c-0.8/Makefile.in +734 -0
  12. data/ext/json-c-0.8/NEWS +1 -0
  13. data/ext/json-c-0.8/README +20 -0
  14. data/ext/json-c-0.8/aclocal.m4 +8794 -0
  15. data/ext/json-c-0.8/arraylist.c +93 -0
  16. data/ext/json-c-0.8/arraylist.h +45 -0
  17. data/ext/json-c-0.8/bits.h +27 -0
  18. data/ext/json-c-0.8/config.guess +1526 -0
  19. data/ext/json-c-0.8/config.h.in +121 -0
  20. data/ext/json-c-0.8/config.sub +1658 -0
  21. data/ext/json-c-0.8/configure +14243 -0
  22. data/ext/json-c-0.8/configure.in +33 -0
  23. data/ext/json-c-0.8/debug.c +98 -0
  24. data/ext/json-c-0.8/debug.h +42 -0
  25. data/ext/json-c-0.8/depcomp +530 -0
  26. data/ext/json-c-0.8/doc/html/annotated.html +40 -0
  27. data/ext/json-c-0.8/doc/html/arraylist_8h.html +234 -0
  28. data/ext/json-c-0.8/doc/html/bits_8h.html +144 -0
  29. data/ext/json-c-0.8/doc/html/config_8h.html +606 -0
  30. data/ext/json-c-0.8/doc/html/debug_8h.html +386 -0
  31. data/ext/json-c-0.8/doc/html/doxygen.css +473 -0
  32. data/ext/json-c-0.8/doc/html/doxygen.png +0 -0
  33. data/ext/json-c-0.8/doc/html/files.html +42 -0
  34. data/ext/json-c-0.8/doc/html/functions.html +206 -0
  35. data/ext/json-c-0.8/doc/html/functions_vars.html +206 -0
  36. data/ext/json-c-0.8/doc/html/globals.html +445 -0
  37. data/ext/json-c-0.8/doc/html/globals_defs.html +200 -0
  38. data/ext/json-c-0.8/doc/html/globals_enum.html +50 -0
  39. data/ext/json-c-0.8/doc/html/globals_eval.html +135 -0
  40. data/ext/json-c-0.8/doc/html/globals_func.html +194 -0
  41. data/ext/json-c-0.8/doc/html/globals_type.html +58 -0
  42. data/ext/json-c-0.8/doc/html/globals_vars.html +50 -0
  43. data/ext/json-c-0.8/doc/html/index.html +25 -0
  44. data/ext/json-c-0.8/doc/html/json_8h.html +26 -0
  45. data/ext/json-c-0.8/doc/html/json__object_8h.html +1042 -0
  46. data/ext/json-c-0.8/doc/html/json__object__private_8h.html +69 -0
  47. data/ext/json-c-0.8/doc/html/json__tokener_8h.html +360 -0
  48. data/ext/json-c-0.8/doc/html/json__util_8h.html +100 -0
  49. data/ext/json-c-0.8/doc/html/linkhash_8h.html +734 -0
  50. data/ext/json-c-0.8/doc/html/printbuf_8h.html +171 -0
  51. data/ext/json-c-0.8/doc/html/structarray__list.html +104 -0
  52. data/ext/json-c-0.8/doc/html/structjson__object.html +141 -0
  53. data/ext/json-c-0.8/doc/html/structjson__object__iter.html +87 -0
  54. data/ext/json-c-0.8/doc/html/structjson__tokener.html +206 -0
  55. data/ext/json-c-0.8/doc/html/structjson__tokener__srec.html +104 -0
  56. data/ext/json-c-0.8/doc/html/structlh__entry.html +105 -0
  57. data/ext/json-c-0.8/doc/html/structlh__table.html +275 -0
  58. data/ext/json-c-0.8/doc/html/structprintbuf.html +87 -0
  59. data/ext/json-c-0.8/doc/html/tab_b.gif +0 -0
  60. data/ext/json-c-0.8/doc/html/tab_l.gif +0 -0
  61. data/ext/json-c-0.8/doc/html/tab_r.gif +0 -0
  62. data/ext/json-c-0.8/doc/html/tabs.css +102 -0
  63. data/ext/json-c-0.8/doc/html/unionjson__object_1_1data.html +140 -0
  64. data/ext/json-c-0.8/install-sh +519 -0
  65. data/ext/json-c-0.8/json.h +31 -0
  66. data/ext/json-c-0.8/json.pc.in +11 -0
  67. data/ext/json-c-0.8/json_object.c +511 -0
  68. data/ext/json-c-0.8/json_object.h +310 -0
  69. data/ext/json-c-0.8/json_object_private.h +44 -0
  70. data/ext/json-c-0.8/json_tokener.c +517 -0
  71. data/ext/json-c-0.8/json_tokener.h +90 -0
  72. data/ext/json-c-0.8/json_util.c +122 -0
  73. data/ext/json-c-0.8/json_util.h +23 -0
  74. data/ext/json-c-0.8/linkhash.c +218 -0
  75. data/ext/json-c-0.8/linkhash.h +264 -0
  76. data/ext/json-c-0.8/ltmain.sh +7880 -0
  77. data/ext/json-c-0.8/missing +360 -0
  78. data/ext/json-c-0.8/printbuf.c +145 -0
  79. data/ext/json-c-0.8/printbuf.h +38 -0
  80. data/ext/json-c-0.8/test1.c +164 -0
  81. data/ext/json-c-0.8/test2.c +20 -0
  82. data/ext/json-c-0.8/test3.c +22 -0
  83. data/ext/ordered_json_c.c +199 -0
  84. data/lib/ordered_json.rb +26 -0
  85. data/ordered_json.gemspec +102 -0
  86. data/test/crashing_example.rb +1 -0
  87. data/test/ordered_json_test.rb +86 -0
  88. data/test/pretty.json +11 -0
  89. metadata +91 -50
@@ -0,0 +1,360 @@
1
+ #! /bin/sh
2
+ # Common stub for a few missing GNU programs while installing.
3
+
4
+ scriptversion=2005-06-08.21
5
+
6
+ # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
7
+ # Free Software Foundation, Inc.
8
+ # Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
9
+
10
+ # This program is free software; you can redistribute it and/or modify
11
+ # it under the terms of the GNU General Public License as published by
12
+ # the Free Software Foundation; either version 2, or (at your option)
13
+ # any later version.
14
+
15
+ # This program is distributed in the hope that it will be useful,
16
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ # GNU General Public License for more details.
19
+
20
+ # You should have received a copy of the GNU General Public License
21
+ # along with this program; if not, write to the Free Software
22
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23
+ # 02110-1301, USA.
24
+
25
+ # As a special exception to the GNU General Public License, if you
26
+ # distribute this file as part of a program that contains a
27
+ # configuration script generated by Autoconf, you may include it under
28
+ # the same distribution terms that you use for the rest of that program.
29
+
30
+ if test $# -eq 0; then
31
+ echo 1>&2 "Try \`$0 --help' for more information"
32
+ exit 1
33
+ fi
34
+
35
+ run=:
36
+
37
+ # In the cases where this matters, `missing' is being run in the
38
+ # srcdir already.
39
+ if test -f configure.ac; then
40
+ configure_ac=configure.ac
41
+ else
42
+ configure_ac=configure.in
43
+ fi
44
+
45
+ msg="missing on your system"
46
+
47
+ case "$1" in
48
+ --run)
49
+ # Try to run requested program, and just exit if it succeeds.
50
+ run=
51
+ shift
52
+ "$@" && exit 0
53
+ # Exit code 63 means version mismatch. This often happens
54
+ # when the user try to use an ancient version of a tool on
55
+ # a file that requires a minimum version. In this case we
56
+ # we should proceed has if the program had been absent, or
57
+ # if --run hadn't been passed.
58
+ if test $? = 63; then
59
+ run=:
60
+ msg="probably too old"
61
+ fi
62
+ ;;
63
+
64
+ -h|--h|--he|--hel|--help)
65
+ echo "\
66
+ $0 [OPTION]... PROGRAM [ARGUMENT]...
67
+
68
+ Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
69
+ error status if there is no known handling for PROGRAM.
70
+
71
+ Options:
72
+ -h, --help display this help and exit
73
+ -v, --version output version information and exit
74
+ --run try to run the given command, and emulate it if it fails
75
+
76
+ Supported PROGRAM values:
77
+ aclocal touch file \`aclocal.m4'
78
+ autoconf touch file \`configure'
79
+ autoheader touch file \`config.h.in'
80
+ automake touch all \`Makefile.in' files
81
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
82
+ flex create \`lex.yy.c', if possible, from existing .c
83
+ help2man touch the output file
84
+ lex create \`lex.yy.c', if possible, from existing .c
85
+ makeinfo touch the output file
86
+ tar try tar, gnutar, gtar, then tar without non-portable flags
87
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
88
+
89
+ Send bug reports to <bug-automake@gnu.org>."
90
+ exit $?
91
+ ;;
92
+
93
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
94
+ echo "missing $scriptversion (GNU Automake)"
95
+ exit $?
96
+ ;;
97
+
98
+ -*)
99
+ echo 1>&2 "$0: Unknown \`$1' option"
100
+ echo 1>&2 "Try \`$0 --help' for more information"
101
+ exit 1
102
+ ;;
103
+
104
+ esac
105
+
106
+ # Now exit if we have it, but it failed. Also exit now if we
107
+ # don't have it and --version was passed (most likely to detect
108
+ # the program).
109
+ case "$1" in
110
+ lex|yacc)
111
+ # Not GNU programs, they don't have --version.
112
+ ;;
113
+
114
+ tar)
115
+ if test -n "$run"; then
116
+ echo 1>&2 "ERROR: \`tar' requires --run"
117
+ exit 1
118
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
119
+ exit 1
120
+ fi
121
+ ;;
122
+
123
+ *)
124
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
125
+ # We have it, but it failed.
126
+ exit 1
127
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
128
+ # Could not run --version or --help. This is probably someone
129
+ # running `$TOOL --version' or `$TOOL --help' to check whether
130
+ # $TOOL exists and not knowing $TOOL uses missing.
131
+ exit 1
132
+ fi
133
+ ;;
134
+ esac
135
+
136
+ # If it does not exist, or fails to run (possibly an outdated version),
137
+ # try to emulate it.
138
+ case "$1" in
139
+ aclocal*)
140
+ echo 1>&2 "\
141
+ WARNING: \`$1' is $msg. You should only need it if
142
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
143
+ to install the \`Automake' and \`Perl' packages. Grab them from
144
+ any GNU archive site."
145
+ touch aclocal.m4
146
+ ;;
147
+
148
+ autoconf)
149
+ echo 1>&2 "\
150
+ WARNING: \`$1' is $msg. You should only need it if
151
+ you modified \`${configure_ac}'. You might want to install the
152
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
153
+ archive site."
154
+ touch configure
155
+ ;;
156
+
157
+ autoheader)
158
+ echo 1>&2 "\
159
+ WARNING: \`$1' is $msg. You should only need it if
160
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
161
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
162
+ from any GNU archive site."
163
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
164
+ test -z "$files" && files="config.h"
165
+ touch_files=
166
+ for f in $files; do
167
+ case "$f" in
168
+ *:*) touch_files="$touch_files "`echo "$f" |
169
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
170
+ *) touch_files="$touch_files $f.in";;
171
+ esac
172
+ done
173
+ touch $touch_files
174
+ ;;
175
+
176
+ automake*)
177
+ echo 1>&2 "\
178
+ WARNING: \`$1' is $msg. You should only need it if
179
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
180
+ You might want to install the \`Automake' and \`Perl' packages.
181
+ Grab them from any GNU archive site."
182
+ find . -type f -name Makefile.am -print |
183
+ sed 's/\.am$/.in/' |
184
+ while read f; do touch "$f"; done
185
+ ;;
186
+
187
+ autom4te)
188
+ echo 1>&2 "\
189
+ WARNING: \`$1' is needed, but is $msg.
190
+ You might have modified some files without having the
191
+ proper tools for further handling them.
192
+ You can get \`$1' as part of \`Autoconf' from any GNU
193
+ archive site."
194
+
195
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
196
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
197
+ if test -f "$file"; then
198
+ touch $file
199
+ else
200
+ test -z "$file" || exec >$file
201
+ echo "#! /bin/sh"
202
+ echo "# Created by GNU Automake missing as a replacement of"
203
+ echo "# $ $@"
204
+ echo "exit 0"
205
+ chmod +x $file
206
+ exit 1
207
+ fi
208
+ ;;
209
+
210
+ bison|yacc)
211
+ echo 1>&2 "\
212
+ WARNING: \`$1' $msg. You should only need it if
213
+ you modified a \`.y' file. You may need the \`Bison' package
214
+ in order for those modifications to take effect. You can get
215
+ \`Bison' from any GNU archive site."
216
+ rm -f y.tab.c y.tab.h
217
+ if [ $# -ne 1 ]; then
218
+ eval LASTARG="\${$#}"
219
+ case "$LASTARG" in
220
+ *.y)
221
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
222
+ if [ -f "$SRCFILE" ]; then
223
+ cp "$SRCFILE" y.tab.c
224
+ fi
225
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
226
+ if [ -f "$SRCFILE" ]; then
227
+ cp "$SRCFILE" y.tab.h
228
+ fi
229
+ ;;
230
+ esac
231
+ fi
232
+ if [ ! -f y.tab.h ]; then
233
+ echo >y.tab.h
234
+ fi
235
+ if [ ! -f y.tab.c ]; then
236
+ echo 'main() { return 0; }' >y.tab.c
237
+ fi
238
+ ;;
239
+
240
+ lex|flex)
241
+ echo 1>&2 "\
242
+ WARNING: \`$1' is $msg. You should only need it if
243
+ you modified a \`.l' file. You may need the \`Flex' package
244
+ in order for those modifications to take effect. You can get
245
+ \`Flex' from any GNU archive site."
246
+ rm -f lex.yy.c
247
+ if [ $# -ne 1 ]; then
248
+ eval LASTARG="\${$#}"
249
+ case "$LASTARG" in
250
+ *.l)
251
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
252
+ if [ -f "$SRCFILE" ]; then
253
+ cp "$SRCFILE" lex.yy.c
254
+ fi
255
+ ;;
256
+ esac
257
+ fi
258
+ if [ ! -f lex.yy.c ]; then
259
+ echo 'main() { return 0; }' >lex.yy.c
260
+ fi
261
+ ;;
262
+
263
+ help2man)
264
+ echo 1>&2 "\
265
+ WARNING: \`$1' is $msg. You should only need it if
266
+ you modified a dependency of a manual page. You may need the
267
+ \`Help2man' package in order for those modifications to take
268
+ effect. You can get \`Help2man' from any GNU archive site."
269
+
270
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
271
+ if test -z "$file"; then
272
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
273
+ fi
274
+ if [ -f "$file" ]; then
275
+ touch $file
276
+ else
277
+ test -z "$file" || exec >$file
278
+ echo ".ab help2man is required to generate this page"
279
+ exit 1
280
+ fi
281
+ ;;
282
+
283
+ makeinfo)
284
+ echo 1>&2 "\
285
+ WARNING: \`$1' is $msg. You should only need it if
286
+ you modified a \`.texi' or \`.texinfo' file, or any other file
287
+ indirectly affecting the aspect of the manual. The spurious
288
+ call might also be the consequence of using a buggy \`make' (AIX,
289
+ DU, IRIX). You might want to install the \`Texinfo' package or
290
+ the \`GNU make' package. Grab either from any GNU archive site."
291
+ # The file to touch is that specified with -o ...
292
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
293
+ if test -z "$file"; then
294
+ # ... or it is the one specified with @setfilename ...
295
+ infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
296
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
297
+ # ... or it is derived from the source name (dir/f.texi becomes f.info)
298
+ test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
299
+ fi
300
+ # If the file does not exist, the user really needs makeinfo;
301
+ # let's fail without touching anything.
302
+ test -f $file || exit 1
303
+ touch $file
304
+ ;;
305
+
306
+ tar)
307
+ shift
308
+
309
+ # We have already tried tar in the generic part.
310
+ # Look for gnutar/gtar before invocation to avoid ugly error
311
+ # messages.
312
+ if (gnutar --version > /dev/null 2>&1); then
313
+ gnutar "$@" && exit 0
314
+ fi
315
+ if (gtar --version > /dev/null 2>&1); then
316
+ gtar "$@" && exit 0
317
+ fi
318
+ firstarg="$1"
319
+ if shift; then
320
+ case "$firstarg" in
321
+ *o*)
322
+ firstarg=`echo "$firstarg" | sed s/o//`
323
+ tar "$firstarg" "$@" && exit 0
324
+ ;;
325
+ esac
326
+ case "$firstarg" in
327
+ *h*)
328
+ firstarg=`echo "$firstarg" | sed s/h//`
329
+ tar "$firstarg" "$@" && exit 0
330
+ ;;
331
+ esac
332
+ fi
333
+
334
+ echo 1>&2 "\
335
+ WARNING: I can't seem to be able to run \`tar' with the given arguments.
336
+ You may want to install GNU tar or Free paxutils, or check the
337
+ command line arguments."
338
+ exit 1
339
+ ;;
340
+
341
+ *)
342
+ echo 1>&2 "\
343
+ WARNING: \`$1' is needed, and is $msg.
344
+ You might have modified some files without having the
345
+ proper tools for further handling them. Check the \`README' file,
346
+ it often tells you about the needed prerequisites for installing
347
+ this package. You may also peek at any GNU archive site, in case
348
+ some other package would contain this missing \`$1' program."
349
+ exit 1
350
+ ;;
351
+ esac
352
+
353
+ exit 0
354
+
355
+ # Local variables:
356
+ # eval: (add-hook 'write-file-hooks 'time-stamp)
357
+ # time-stamp-start: "scriptversion="
358
+ # time-stamp-format: "%:y-%02m-%02d.%02H"
359
+ # time-stamp-end: "$"
360
+ # End:
@@ -0,0 +1,145 @@
1
+ /*
2
+ * $Id: printbuf.c,v 1.5 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
+ #include "config.h"
13
+
14
+ #include <stdio.h>
15
+ #include <stdlib.h>
16
+ #include <string.h>
17
+
18
+ #if HAVE_STDARG_H
19
+ # include <stdarg.h>
20
+ #else /* !HAVE_STDARG_H */
21
+ # error Not enough var arg support!
22
+ #endif /* HAVE_STDARG_H */
23
+
24
+ #include "bits.h"
25
+ #include "debug.h"
26
+ #include "printbuf.h"
27
+
28
+ struct printbuf* printbuf_new()
29
+ {
30
+ struct printbuf *p;
31
+
32
+ if(!(p = calloc(1, sizeof(struct printbuf)))) return NULL;
33
+ p->size = 32;
34
+ p->bpos = 0;
35
+ if(!(p->buf = malloc(p->size))) {
36
+ free(p);
37
+ return NULL;
38
+ }
39
+ return p;
40
+ }
41
+
42
+
43
+ int printbuf_memappend(struct printbuf *p, char *buf, int size)
44
+ {
45
+ char *t;
46
+ if(p->size - p->bpos <= size) {
47
+ int new_size = max(p->size * 2, p->bpos + size + 8);
48
+ #ifdef PRINTBUF_DEBUG
49
+ MC_DEBUG("printbuf_memappend: realloc "
50
+ "bpos=%d wrsize=%d old_size=%d new_size=%d\n",
51
+ p->bpos, size, p->size, new_size);
52
+ #endif /* PRINTBUF_DEBUG */
53
+ if(!(t = realloc(p->buf, new_size))) return -1;
54
+ p->size = new_size;
55
+ p->buf = t;
56
+ }
57
+ memcpy(p->buf + p->bpos, buf, size);
58
+ p->bpos += size;
59
+ p->buf[p->bpos]= '\0';
60
+ return size;
61
+ }
62
+
63
+ #if !HAVE_VSNPRINTF && defined(WIN32)
64
+ # define vsnprintf _vsnprintf
65
+ #elif !HAVE_VSNPRINTF /* !HAVE_VSNPRINTF */
66
+ # error Need vsnprintf!
67
+ #endif /* !HAVE_VSNPRINTF && defined(WIN32) */
68
+
69
+ #if !HAVE_VASPRINTF
70
+ /* CAW: compliant version of vasprintf */
71
+ static int vasprintf(char **buf, const char *fmt, va_list ap)
72
+ {
73
+ #ifndef WIN32
74
+ static char _T_emptybuffer = '\0';
75
+ #endif /* !defined(WIN32) */
76
+ int chars;
77
+ char *b;
78
+
79
+ if(!buf) { return -1; }
80
+
81
+ #ifdef WIN32
82
+ chars = _vscprintf(fmt, ap)+1;
83
+ #else /* !defined(WIN32) */
84
+ /* CAW: RAWR! We have to hope to god here that vsnprintf doesn't overwrite
85
+ our buffer like on some 64bit sun systems.... but hey, its time to move on */
86
+ chars = vsnprintf(&_T_emptybuffer, 0, fmt, ap)+1;
87
+ if(chars < 0) { chars *= -1; } /* CAW: old glibc versions have this problem */
88
+ #endif /* defined(WIN32) */
89
+
90
+ b = (char*)malloc(sizeof(char)*chars);
91
+ if(!b) { return -1; }
92
+
93
+ if((chars = vsprintf(b, fmt, ap)) < 0)
94
+ {
95
+ free(b);
96
+ } else {
97
+ *buf = b;
98
+ }
99
+
100
+ return chars;
101
+ }
102
+ #endif /* !HAVE_VASPRINTF */
103
+
104
+ int sprintbuf(struct printbuf *p, const char *msg, ...)
105
+ {
106
+ va_list ap;
107
+ char *t;
108
+ int size;
109
+ char buf[128];
110
+
111
+ /* user stack buffer first */
112
+ va_start(ap, msg);
113
+ size = vsnprintf(buf, 128, msg, ap);
114
+ va_end(ap);
115
+ /* if string is greater than stack buffer, then use dynamic string
116
+ with vasprintf. Note: some implementation of vsnprintf return -1
117
+ if output is truncated whereas some return the number of bytes that
118
+ would have been writen - this code handles both cases. */
119
+ if(size == -1 || size > 127) {
120
+ int ret;
121
+ va_start(ap, msg);
122
+ size = vasprintf(&t, msg, ap);
123
+ va_end(ap);
124
+ if(size == -1) return -1;
125
+ ret = printbuf_memappend(p, t, size);
126
+ free(t);
127
+ return ret;
128
+ } else {
129
+ return printbuf_memappend(p, buf, size);
130
+ }
131
+ }
132
+
133
+ void printbuf_reset(struct printbuf *p)
134
+ {
135
+ p->buf[0] = '\0';
136
+ p->bpos = 0;
137
+ }
138
+
139
+ void printbuf_free(struct printbuf *p)
140
+ {
141
+ if(p) {
142
+ free(p->buf);
143
+ free(p);
144
+ }
145
+ }
@@ -0,0 +1,38 @@
1
+ /*
2
+ * $Id: printbuf.h,v 1.4 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 _printbuf_h_
13
+ #define _printbuf_h_
14
+
15
+ #undef PRINTBUF_DEBUG
16
+
17
+ struct printbuf {
18
+ char *buf;
19
+ int bpos;
20
+ int size;
21
+ };
22
+
23
+ extern struct printbuf*
24
+ printbuf_new(void);
25
+
26
+ extern int
27
+ printbuf_memappend(struct printbuf *p, char *buf, int size);
28
+
29
+ extern int
30
+ sprintbuf(struct printbuf *p, const char *msg, ...);
31
+
32
+ extern void
33
+ printbuf_reset(struct printbuf *p);
34
+
35
+ extern void
36
+ printbuf_free(struct printbuf *p);
37
+
38
+ #endif
@@ -0,0 +1,164 @@
1
+ #include <stdio.h>
2
+ #include <stdlib.h>
3
+ #include <stddef.h>
4
+ #include <string.h>
5
+
6
+ #include "json.h"
7
+
8
+ int main(int argc, char **argv)
9
+ {
10
+ struct json_tokener *tok;
11
+ struct json_object *my_string, *my_int, *my_object, *my_array;
12
+ struct json_object *new_obj;
13
+ int i;
14
+
15
+ MC_SET_DEBUG(1);
16
+
17
+ my_string = json_object_new_string("\t");
18
+ printf("my_string=%s\n", json_object_get_string(my_string));
19
+ printf("my_string.to_string()=%s\n", json_object_to_json_string(my_string));
20
+ json_object_put(my_string);
21
+
22
+ my_string = json_object_new_string("\\");
23
+ printf("my_string=%s\n", json_object_get_string(my_string));
24
+ printf("my_string.to_string()=%s\n", json_object_to_json_string(my_string));
25
+ json_object_put(my_string);
26
+
27
+ my_string = json_object_new_string("foo");
28
+ printf("my_string=%s\n", json_object_get_string(my_string));
29
+ printf("my_string.to_string()=%s\n", json_object_to_json_string(my_string));
30
+
31
+ my_int = json_object_new_int(9);
32
+ printf("my_int=%d\n", json_object_get_int(my_int));
33
+ printf("my_int.to_string()=%s\n", json_object_to_json_string(my_int));
34
+
35
+ my_array = json_object_new_array();
36
+ json_object_array_add(my_array, json_object_new_int(1));
37
+ json_object_array_add(my_array, json_object_new_int(2));
38
+ json_object_array_add(my_array, json_object_new_int(3));
39
+ json_object_array_put_idx(my_array, 4, json_object_new_int(5));
40
+ printf("my_array=\n");
41
+ for(i=0; i < json_object_array_length(my_array); i++) {
42
+ struct json_object *obj = json_object_array_get_idx(my_array, i);
43
+ printf("\t[%d]=%s\n", i, json_object_to_json_string(obj));
44
+ }
45
+ printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array));
46
+
47
+ my_object = json_object_new_object();
48
+ json_object_object_add(my_object, "abc", json_object_new_int(12));
49
+ json_object_object_add(my_object, "foo", json_object_new_string("bar"));
50
+ json_object_object_add(my_object, "bool0", json_object_new_boolean(0));
51
+ json_object_object_add(my_object, "bool1", json_object_new_boolean(1));
52
+ json_object_object_add(my_object, "baz", json_object_new_string("bang"));
53
+ json_object_object_add(my_object, "baz", json_object_new_string("fark"));
54
+ json_object_object_del(my_object, "baz");
55
+ /*json_object_object_add(my_object, "arr", my_array);*/
56
+ printf("my_object=\n");
57
+ json_object_object_foreach(my_object, key, val) {
58
+ printf("\t%s: %s\n", key, json_object_to_json_string(val));
59
+ }
60
+ printf("my_object.to_string()=%s\n", json_object_to_json_string(my_object));
61
+
62
+ new_obj = json_tokener_parse("\"\003\"");
63
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
64
+ json_object_put(new_obj);
65
+
66
+ new_obj = json_tokener_parse("/* hello */\"foo\"");
67
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
68
+ json_object_put(new_obj);
69
+
70
+ new_obj = json_tokener_parse("// hello\n\"foo\"");
71
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
72
+ json_object_put(new_obj);
73
+
74
+ new_obj = json_tokener_parse("\"\\u0041\\u0042\\u0043\"");
75
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
76
+ json_object_put(new_obj);
77
+
78
+ new_obj = json_tokener_parse("null");
79
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
80
+ json_object_put(new_obj);
81
+
82
+ new_obj = json_tokener_parse("True");
83
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
84
+ json_object_put(new_obj);
85
+
86
+ new_obj = json_tokener_parse("12");
87
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
88
+ json_object_put(new_obj);
89
+
90
+ new_obj = json_tokener_parse("12.3");
91
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
92
+ json_object_put(new_obj);
93
+
94
+ new_obj = json_tokener_parse("[\"\\n\"]");
95
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
96
+ json_object_put(new_obj);
97
+
98
+ new_obj = json_tokener_parse("[\"\\nabc\\n\"]");
99
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
100
+ json_object_put(new_obj);
101
+
102
+ new_obj = json_tokener_parse("[null]");
103
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
104
+ json_object_put(new_obj);
105
+
106
+ new_obj = json_tokener_parse("[]");
107
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
108
+ json_object_put(new_obj);
109
+
110
+ new_obj = json_tokener_parse("[false]");
111
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
112
+ json_object_put(new_obj);
113
+
114
+ new_obj = json_tokener_parse("[\"abc\",null,\"def\",12]");
115
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
116
+ json_object_put(new_obj);
117
+
118
+ new_obj = json_tokener_parse("{}");
119
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
120
+ json_object_put(new_obj);
121
+
122
+ new_obj = json_tokener_parse("{ \"foo\": \"bar\" }");
123
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
124
+ json_object_put(new_obj);
125
+
126
+ new_obj = json_tokener_parse("{ \"foo\": \"bar\", \"baz\": null, \"bool0\": true }");
127
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
128
+ json_object_put(new_obj);
129
+
130
+ new_obj = json_tokener_parse("{ \"foo\": [null, \"foo\"] }");
131
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
132
+ json_object_put(new_obj);
133
+
134
+ new_obj = json_tokener_parse("{ \"abc\": 12, \"foo\": \"bar\", \"bool0\": false, \"bool1\": true, \"arr\": [ 1, 2, 3, null, 5 ] }");
135
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
136
+ json_object_put(new_obj);
137
+
138
+ new_obj = json_tokener_parse("{ foo }");
139
+ if(is_error(new_obj)) printf("got error as expected\n");
140
+
141
+ new_obj = json_tokener_parse("foo");
142
+ if(is_error(new_obj)) printf("got error as expected\n");
143
+
144
+ new_obj = json_tokener_parse("{ \"foo");
145
+ if(is_error(new_obj)) printf("got error as expected\n");
146
+
147
+ /* test incremental parsing */
148
+ tok = json_tokener_new();
149
+ new_obj = json_tokener_parse_ex(tok, "{ \"foo", 6);
150
+ if(is_error(new_obj)) printf("got error as expected\n");
151
+ new_obj = json_tokener_parse_ex(tok, "\": {\"bar", 8);
152
+ if(is_error(new_obj)) printf("got error as expected\n");
153
+ new_obj = json_tokener_parse_ex(tok, "\":13}}", 6);
154
+ printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
155
+ json_object_put(new_obj);
156
+ json_tokener_free(tok);
157
+
158
+ json_object_put(my_string);
159
+ json_object_put(my_int);
160
+ json_object_put(my_object);
161
+ //json_object_put(my_array);
162
+
163
+ return 0;
164
+ }