libyajl2 0.1.4 → 0.1.5

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.
@@ -0,0 +1,186 @@
1
+ /*
2
+ * Copyright (c) 2010-2011 Florian Forster <ff at octo.it>
3
+ *
4
+ * Permission to use, copy, modify, and/or distribute this software for any
5
+ * purpose with or without fee is hereby granted, provided that the above
6
+ * copyright notice and this permission notice appear in all copies.
7
+ *
8
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+ */
16
+
17
+ /**
18
+ * \file yajl_tree.h
19
+ *
20
+ * Parses JSON data and returns the data in tree form.
21
+ *
22
+ * \author Florian Forster
23
+ * \date August 2010
24
+ *
25
+ * This interface makes quick parsing and extraction of
26
+ * smallish JSON docs trivial:
27
+ *
28
+ * \include example/parse_config.c
29
+ */
30
+
31
+ #ifndef YAJL_TREE_H
32
+ #define YAJL_TREE_H 1
33
+
34
+ #include <yajl/yajl_common.h>
35
+
36
+ #ifdef __cplusplus
37
+ extern "C" {
38
+ #endif
39
+
40
+ /** possible data types that a yajl_val_s can hold */
41
+ typedef enum {
42
+ yajl_t_string = 1,
43
+ yajl_t_number = 2,
44
+ yajl_t_object = 3,
45
+ yajl_t_array = 4,
46
+ yajl_t_true = 5,
47
+ yajl_t_false = 6,
48
+ yajl_t_null = 7,
49
+ /** The any type isn't valid for yajl_val_s.type, but can be
50
+ * used as an argument to routines like yajl_tree_get().
51
+ */
52
+ yajl_t_any = 8
53
+ } yajl_type;
54
+
55
+ #define YAJL_NUMBER_INT_VALID 0x01
56
+ #define YAJL_NUMBER_DOUBLE_VALID 0x02
57
+
58
+ /** A pointer to a node in the parse tree */
59
+ typedef struct yajl_val_s * yajl_val;
60
+
61
+ /**
62
+ * A JSON value representation capable of holding one of the seven
63
+ * types above. For "string", "number", "object", and "array"
64
+ * additional data is available in the union. The "YAJL_IS_*"
65
+ * and "YAJL_GET_*" macros below allow type checking and convenient
66
+ * value extraction.
67
+ */
68
+ struct yajl_val_s
69
+ {
70
+ /** Type of the value contained. Use the "YAJL_IS_*" macros to check for a
71
+ * specific type. */
72
+ yajl_type type;
73
+ /** Type-specific data. You may use the "YAJL_GET_*" macros to access these
74
+ * members. */
75
+ union
76
+ {
77
+ char * string;
78
+ struct {
79
+ long long i; /*< integer value, if representable. */
80
+ double d; /*< double value, if representable. */
81
+ char *r; /*< unparsed number in string form. */
82
+ /** Signals whether the \em i and \em d members are
83
+ * valid. See \c YAJL_NUMBER_INT_VALID and
84
+ * \c YAJL_NUMBER_DOUBLE_VALID. */
85
+ unsigned int flags;
86
+ } number;
87
+ struct {
88
+ const char **keys; /*< Array of keys */
89
+ yajl_val *values; /*< Array of values. */
90
+ size_t len; /*< Number of key-value-pairs. */
91
+ } object;
92
+ struct {
93
+ yajl_val *values; /*< Array of elements. */
94
+ size_t len; /*< Number of elements. */
95
+ } array;
96
+ } u;
97
+ };
98
+
99
+ /**
100
+ * Parse a string.
101
+ *
102
+ * Parses an null-terminated string containing JSON data and returns a pointer
103
+ * to the top-level value (root of the parse tree).
104
+ *
105
+ * \param input Pointer to a null-terminated utf8 string containing
106
+ * JSON data.
107
+ * \param error_buffer Pointer to a buffer in which an error message will
108
+ * be stored if \em yajl_tree_parse fails, or
109
+ * \c NULL. The buffer will be initialized before
110
+ * parsing, so its content will be destroyed even if
111
+ * \em yajl_tree_parse succeeds.
112
+ * \param error_buffer_size Size of the memory area pointed to by
113
+ * \em error_buffer_size. If \em error_buffer_size is
114
+ * \c NULL, this argument is ignored.
115
+ *
116
+ * \returns Pointer to the top-level value or \c NULL on error. The memory
117
+ * pointed to must be freed using \em yajl_tree_free. In case of an error, a
118
+ * null terminated message describing the error in more detail is stored in
119
+ * \em error_buffer if it is not \c NULL.
120
+ */
121
+ YAJL_API yajl_val yajl_tree_parse (const char *input,
122
+ char *error_buffer, size_t error_buffer_size);
123
+
124
+
125
+ /**
126
+ * Free a parse tree returned by "yajl_tree_parse".
127
+ *
128
+ * \param v Pointer to a JSON value returned by "yajl_tree_parse". Passing NULL
129
+ * is valid and results in a no-op.
130
+ */
131
+ YAJL_API void yajl_tree_free (yajl_val v);
132
+
133
+ /**
134
+ * Access a nested value inside a tree.
135
+ *
136
+ * \param parent the node under which you'd like to extract values.
137
+ * \param path A null terminated array of strings, each the name of an object key
138
+ * \param type the yajl_type of the object you seek, or yajl_t_any if any will do.
139
+ *
140
+ * \returns a pointer to the found value, or NULL if we came up empty.
141
+ *
142
+ * Future Ideas: it'd be nice to move path to a string and implement support for
143
+ * a teeny tiny micro language here, so you can extract array elements, do things
144
+ * like .first and .last, even .length. Inspiration from JSONPath and css selectors?
145
+ * No it wouldn't be fast, but that's not what this API is about.
146
+ */
147
+ YAJL_API yajl_val yajl_tree_get(yajl_val parent, const char ** path, yajl_type type);
148
+
149
+ /* Various convenience macros to check the type of a `yajl_val` */
150
+ #define YAJL_IS_STRING(v) (((v) != NULL) && ((v)->type == yajl_t_string))
151
+ #define YAJL_IS_NUMBER(v) (((v) != NULL) && ((v)->type == yajl_t_number))
152
+ #define YAJL_IS_INTEGER(v) (YAJL_IS_NUMBER(v) && ((v)->u.number.flags & YAJL_NUMBER_INT_VALID))
153
+ #define YAJL_IS_DOUBLE(v) (YAJL_IS_NUMBER(v) && ((v)->u.number.flags & YAJL_NUMBER_DOUBLE_VALID))
154
+ #define YAJL_IS_OBJECT(v) (((v) != NULL) && ((v)->type == yajl_t_object))
155
+ #define YAJL_IS_ARRAY(v) (((v) != NULL) && ((v)->type == yajl_t_array ))
156
+ #define YAJL_IS_TRUE(v) (((v) != NULL) && ((v)->type == yajl_t_true ))
157
+ #define YAJL_IS_FALSE(v) (((v) != NULL) && ((v)->type == yajl_t_false ))
158
+ #define YAJL_IS_NULL(v) (((v) != NULL) && ((v)->type == yajl_t_null ))
159
+
160
+ /** Given a yajl_val_string return a ptr to the bare string it contains,
161
+ * or NULL if the value is not a string. */
162
+ #define YAJL_GET_STRING(v) (YAJL_IS_STRING(v) ? (v)->u.string : NULL)
163
+
164
+ /** Get the string representation of a number. You should check type first,
165
+ * perhaps using YAJL_IS_NUMBER */
166
+ #define YAJL_GET_NUMBER(v) ((v)->u.number.r)
167
+
168
+ /** Get the double representation of a number. You should check type first,
169
+ * perhaps using YAJL_IS_DOUBLE */
170
+ #define YAJL_GET_DOUBLE(v) ((v)->u.number.d)
171
+
172
+ /** Get the 64bit (long long) integer representation of a number. You should
173
+ * check type first, perhaps using YAJL_IS_INTEGER */
174
+ #define YAJL_GET_INTEGER(v) ((v)->u.number.i)
175
+
176
+ /** Get a pointer to a yajl_val_object or NULL if the value is not an object. */
177
+ #define YAJL_GET_OBJECT(v) (YAJL_IS_OBJECT(v) ? &(v)->u.object : NULL)
178
+
179
+ /** Get a pointer to a yajl_val_array or NULL if the value is not an object. */
180
+ #define YAJL_GET_ARRAY(v) (YAJL_IS_ARRAY(v) ? &(v)->u.array : NULL)
181
+
182
+ #ifdef __cplusplus
183
+ }
184
+ #endif
185
+
186
+ #endif /* YAJL_TREE_H */
@@ -0,0 +1,23 @@
1
+ #ifndef YAJL_VERSION_H_
2
+ #define YAJL_VERSION_H_
3
+
4
+ #include <yajl/yajl_common.h>
5
+
6
+ #define YAJL_MAJOR 2
7
+ #define YAJL_MINOR 1
8
+ #define YAJL_MICRO 1
9
+
10
+ #define YAJL_VERSION ((YAJL_MAJOR * 10000) + (YAJL_MINOR * 100) + YAJL_MICRO)
11
+
12
+ #ifdef __cplusplus
13
+ extern "C" {
14
+ #endif
15
+
16
+ extern int YAJL_API yajl_version(void);
17
+
18
+ #ifdef __cplusplus
19
+ }
20
+ #endif
21
+
22
+ #endif /* YAJL_VERSION_H_ */
23
+
@@ -1,7 +1,8 @@
1
1
  exit(0) if ENV["USE_SYSTEM_LIBYAJL2"]
2
2
 
3
3
  require 'rbconfig'
4
- require 'pp'
4
+ require 'fileutils'
5
+ require 'mkmf'
5
6
 
6
7
  module Libyajl2Build
7
8
  class BuildError < StandardError; end
@@ -23,201 +24,47 @@ module Libyajl2Build
23
24
  end
24
25
 
25
26
  def self.setup_env
26
- if config['CC'] =~ /gcc/ || config['CC'] =~ /clang/
27
- config['CFLAGS'] << " -std=c99 -pedantic -Wpointer-arith -Wno-format-y2k -Wstrict-prototypes -Wmissing-declarations -Wnested-externs -Wextra -Wundef -Wwrite-strings -Wold-style-definition -Wredundant-decls -Wno-unused-parameter -Wno-sign-compare -Wmissing-prototypes"
28
- end
29
- end
27
+ RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC'] if ENV['CC']
30
28
 
31
- # for mkmf.rb compat
32
- def self.config
33
- @config ||= RbConfig::MAKEFILE_CONFIG.dup
34
- end
29
+ # set some sane defaults
30
+ if RbConfig::MAKEFILE_CONFIG['CC'] =~ /gcc|clang/
31
+ # magic flags copied from upstream yajl build system (-std=c99 is necessary for older gcc)
32
+ $CFLAGS << " -std=c99 -pedantic -Wpointer-arith -Wno-format-y2k -Wstrict-prototypes -Wmissing-declarations -Wnested-externs -Wextra -Wundef -Wwrite-strings -Wold-style-definition -Wredundant-decls -Wno-unused-parameter -Wno-sign-compare -Wmissing-prototypes"
33
+ $CFLAGS << " -O2" # match what the upstream uses for optimization
35
34
 
36
- def self.mkintpath(path)
37
- case config['build_os']
38
- when 'mingw32'
39
- path = path.dup
40
- path.tr!('\\', '/')
41
- path.sub!(/\A([A-Za-z]):(?=\/)/, '/\1')
42
- path
43
- when 'cygwin'
44
- if config['target_os'] != 'cygwin'
45
- IO.popen(["cygpath", "-u", path], &:read).chomp
46
- else
47
- path
35
+ # create the implib on windows
36
+ if windows?
37
+ $LDFLAGS << " -Wl,--export-all-symbols -Wl,--enable-auto-import -Wl,--out-implib=libyajl.dll.a"
48
38
  end
49
- else
50
- path
51
39
  end
52
- end
53
40
 
54
- def self.system(*args)
55
- print("-> #{args.join(' ')}\n")
56
- super(*args)
57
- end
58
-
59
- # since we're not using cmake we have to mangle up yajl_version.h ourselves
60
- def self.generate_yajl_version
61
- yajl_major = yajl_minor = yajl_micro = nil
62
- File.open("#{libyajl2_vendor_dir}/CMakeLists.txt").each do |line|
63
- if m = line.match(/YAJL_MAJOR (\d+)/)
64
- yajl_major = m[1]
65
- end
66
- if m = line.match(/YAJL_MINOR (\d+)/)
67
- yajl_minor = m[1]
68
- end
69
- if m = line.match(/YAJL_MICRO (\d+)/)
70
- yajl_micro = m[1]
71
- end
72
- end
73
- File.open("#{libyajl2_vendor_dir}/src/api/yajl_version.h", "w+") do |out|
74
- File.open("#{libyajl2_vendor_dir}/src/api/yajl_version.h.cmake").each do |line|
75
- line.gsub!(/\$\{YAJL_MAJOR\}/, yajl_major)
76
- line.gsub!(/\$\{YAJL_MINOR\}/, yajl_minor)
77
- line.gsub!(/\$\{YAJL_MICRO\}/, yajl_micro)
78
- out.write(line)
79
- end
80
- end
81
- end
41
+ $CFLAGS << " -DNDEBUG"
82
42
 
83
- def self.yajl_makefile
84
- File.open("Makefile", "w+") do |f|
85
- f.write <<EOF
86
- SHELL = /bin/sh
87
-
88
- # V=0 quiet, V=1 verbose. other values don't work.
89
- V = 0
90
- Q1 = $(V:1=)
91
- Q = $(Q1:0=@)
92
- ECHO1 = $(V:1=@:)
93
- ECHO = $(ECHO1:0=@echo)
94
-
95
- #### Start of system configuration section. ####
96
-
97
- srcdir = .
98
- prefix = #{mkintpath(config['prefix'])}
99
- rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
100
- exec_prefix = $(prefix)
101
- sitearchdir = $(sitelibdir)/$(sitearch)
102
- sitelibdir = $(sitedir)/$(ruby_version)
103
- sitedir = $(rubylibprefix)/site_ruby
104
- libdir = $(exec_prefix)/lib
105
-
106
- CC = #{config['CC']}
107
- COUTFLAG = '-o'
108
-
109
- cflags = #{config['cflags']}
110
- optflags = #{config['optflags']}
111
- debugflags = #{config['debugflags']}
112
- warnflags = #{config['warnflags']}
113
- CCDLFLAGS = #{config['CCDLFLAGS']}
114
- CFLAGS = $(CCDLFLAGS) -I#{libyajl2_vendor_dir}/src/api -I. #{config['CFLAGS']} $(ARCH_FLAG)
115
- INCFLAGS = -I. -I$(srcdir)
116
- DEFS = #{config['DEFS']}
117
- CPPFLAGS = #{config['CPPFLAGS']} $(cppflags)
118
- ldflags = #{config['LDFLAGS']}
119
- #dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress
120
- dldflags = #{config['DLDFLAGS']} #{config['EXTDLDFLAGS']}
121
- ARCH_FLAG = #{config['ARCH_FLAG']}
122
- DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG)
123
- LDSHARED = #{config['LDSHARED']}
124
-
125
- RUBY_INSTALL_NAME = #{config['RUBY_INSTALL_NAME']}
126
- RUBY_SO_NAME = #{config['RUBY_SO_NAME']}
127
- RUBYW_INSTALL_NAME = #{config['RUBYW_INSTALL_NAME']}
128
- RUBY_VERSION_NAME = #{config['RUBY_VERSION_NAME']}
129
- RUBYW_BASE_NAME = #{config['RUBYW_BASE_NAME']}
130
- RUBY_BASE_NAME = #{config['RUBY_BASE_NAME']}
131
-
132
- arch = #{config['arch']}
133
- sitearch = #{config['sitearch']}
134
- ruby_version = #{RbConfig::CONFIG['ruby_version']}
135
- ruby = #{File.join(RbConfig::CONFIG["bindir"], config["ruby_install_name"])}
136
- RUBY = $(ruby)
137
-
138
- RM = $(RUBY) -run -e rm -- -f
139
- MAKEDIRS = $(RUBY) -run -e mkdir -- -p
140
- INSTALL = $(RUBY) -run -e install -- -vp
141
- INSTALL_PROG = $(INSTALL) -m 0755
142
- TOUCH = exit >
143
-
144
- #### End of system configuration section. ####
145
-
146
- libpath = . $(libdir)
147
- LIBPATH = -L. -L$(libdir)
148
-
149
- CLEANFILES = mkmf.log
150
-
151
- target_prefix =
152
- LIBS = #{config['LIBS']} #{config['DLDLIBS']}
153
- ORIG_SRCS = yajl.c yajl_alloc.c yajl_buf.c yajl_encode.c yajl_gen.c yajl_lex.c yajl_parser.c yajl_tree.c yajl_version.c
154
- SRCS = $(ORIG_SRCS)
155
- OBJS = yajl.o yajl_alloc.o yajl_buf.o yajl_encode.o yajl_gen.o yajl_lex.o yajl_parser.o yajl_tree.o yajl_version.o
156
- HDRS = yajl_alloc.h yajl_buf.h yajl_bytestack.h yajl_encode.h yajl_lex.h yajl_parser.h
157
- TARGET = libyajl
158
- DLLIB = $(TARGET).#{config['DLEXT']}
159
43
 
160
- TIMESTAMP_DIR = .
161
- RUBYARCHDIR = $(sitearchdir)$(target_prefix)
162
-
163
- CLEANLIBS = $(TARGET).bundle
164
- CLEANOBJS = *.o *.bak
165
-
166
- all: $(DLLIB)
167
-
168
- clean:
169
- \t-$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time
170
-
171
- install: install-so install-rb
172
-
173
- install-so: $(DLLIB) $(TIMESTAMP_DIR)/.RUBYARCHDIR.time
174
- \t$(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
175
-
176
- install-rb:
177
- \t$(ECHO) installing default libyajl libraries
178
- $(TIMESTAMP_DIR)/.RUBYARCHDIR.time:
179
- \t$(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR)
180
- \t$(Q) $(TOUCH) $@
181
-
182
- .SUFFIXES: .c .o
183
-
184
- .c.o:
185
- \t$(ECHO) compiling $(<)
186
- \t$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
187
-
188
- $(DLLIB): $(OBJS) Makefile
189
- \t$(ECHO) linking shared-object $(DLLIB)
190
- \t-$(Q)$(RM) $(@)
191
- \t$(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LIBS)
192
-
193
- $(OBJS): $(HDRS)
194
- EOF
195
- end
44
+ # ENV vars can override everything
45
+ $CFLAGS = ENV['CFLAGS'] if ENV['CFLAGS']
46
+ $LDFLAGS = ENV['LDFLAGS'] if ENV['LDFLAGS']
196
47
  end
197
48
 
198
49
  def self.makemakefiles
199
50
  setup_env
200
- generate_yajl_version
201
- Dir.chdir("#{libyajl2_vendor_dir}/src") do
202
- # hack to make includes work
203
- system("rm -f api/yajl")
204
- system("ln -s . api/yajl")
205
- yajl_makefile
206
- end
51
+ dir_config("libyajl")
52
+ create_makefile("libyajl")
53
+ # we cheat and build it right away...
54
+ system("make V=1")
55
+ # ...so we can hack up what install does later and copy over the include files
56
+
207
57
  File.open("Makefile", "w+") do |f|
208
58
  f.write <<EOF
209
59
  TARGET = libyajl
210
- DLLIB = $(TARGET).#{config['DLEXT']}
60
+ DLLIB = $(TARGET).#{RbConfig::MAKEFILE_CONFIG['DLEXT']}
211
61
  all:
212
- \tcd #{libyajl2_vendor_dir}/src && make
213
- \tcp #{libyajl2_vendor_dir}/src/$(DLLIB) .
62
+
214
63
  install:
215
64
  \tmkdir -p #{prefix}/lib
216
65
  \tcp $(DLLIB) #{prefix}/lib
217
66
  \tmkdir -p #{prefix}/include/yajl
218
- \tcp #{libyajl2_vendor_dir}/src/api/*.h #{prefix}/include/yajl
219
- clean:
220
- \tcd #{libyajl2_vendor_dir}/src && make clean
67
+ \tcp yajl/*.h #{prefix}/include/yajl
221
68
  EOF
222
69
  end
223
70
  end
@@ -0,0 +1,26 @@
1
+ diff --git a/src/yajl_gen.c b/src/yajl_gen.c
2
+ index 0f5c68e..a86a6ed 100644
3
+ --- a/src/yajl_gen.c
4
+ +++ b/src/yajl_gen.c
5
+ @@ -217,7 +217,7 @@ yajl_gen_integer(yajl_gen g, long long int number)
6
+ return yajl_gen_status_ok;
7
+ }
8
+
9
+ -#if defined(_WIN32) || defined(WIN32)
10
+ +#if ( defined(_WIN32) || defined(WIN32) ) && !defined(__GCC__)
11
+ #include <float.h>
12
+ #define isnan _isnan
13
+ #define isinf !_finite
14
+ diff --git a/src/yajl_tree.c b/src/yajl_tree.c
15
+ index 3d357a3..2b4c183 100644
16
+ --- a/src/yajl_tree.c
17
+ +++ b/src/yajl_tree.c
18
+ @@ -25,7 +25,7 @@
19
+
20
+ #include "yajl_parser.h"
21
+
22
+ -#if defined(_WIN32) || defined(WIN32)
23
+ +#if ( defined(_WIN32) || defined(WIN32) ) && !defined(__GCC__)
24
+ #define snprintf sprintf_s
25
+ #endif
26
+
@@ -0,0 +1,75 @@
1
+ /*
2
+ * Copyright (c) 2007-2014, Lloyd Hilaiel <me@lloyd.io>
3
+ *
4
+ * Permission to use, copy, modify, and/or distribute this software for any
5
+ * purpose with or without fee is hereby granted, provided that the above
6
+ * copyright notice and this permission notice appear in all copies.
7
+ *
8
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+ */
16
+
17
+ #ifndef __YAJL_COMMON_H__
18
+ #define __YAJL_COMMON_H__
19
+
20
+ #include <stddef.h>
21
+
22
+ #ifdef __cplusplus
23
+ extern "C" {
24
+ #endif
25
+
26
+ #define YAJL_MAX_DEPTH 128
27
+
28
+ /* msft dll export gunk. To build a DLL on windows, you
29
+ * must define WIN32, YAJL_SHARED, and YAJL_BUILD. To use a shared
30
+ * DLL, you must define YAJL_SHARED and WIN32 */
31
+ #if (defined(_WIN32) || defined(WIN32)) && defined(YAJL_SHARED)
32
+ # ifdef YAJL_BUILD
33
+ # define YAJL_API __declspec(dllexport)
34
+ # else
35
+ # define YAJL_API __declspec(dllimport)
36
+ # endif
37
+ #else
38
+ # if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303
39
+ # define YAJL_API __attribute__ ((visibility("default")))
40
+ # else
41
+ # define YAJL_API
42
+ # endif
43
+ #endif
44
+
45
+ /** pointer to a malloc function, supporting client overriding memory
46
+ * allocation routines */
47
+ typedef void * (*yajl_malloc_func)(void *ctx, size_t sz);
48
+
49
+ /** pointer to a free function, supporting client overriding memory
50
+ * allocation routines */
51
+ typedef void (*yajl_free_func)(void *ctx, void * ptr);
52
+
53
+ /** pointer to a realloc function which can resize an allocation. */
54
+ typedef void * (*yajl_realloc_func)(void *ctx, void * ptr, size_t sz);
55
+
56
+ /** A structure which can be passed to yajl_*_alloc routines to allow the
57
+ * client to specify memory allocation functions to be used. */
58
+ typedef struct
59
+ {
60
+ /** pointer to a function that can allocate uninitialized memory */
61
+ yajl_malloc_func malloc;
62
+ /** pointer to a function that can resize memory allocations */
63
+ yajl_realloc_func realloc;
64
+ /** pointer to a function that can free memory allocated using
65
+ * reallocFunction or mallocFunction */
66
+ yajl_free_func free;
67
+ /** a context pointer that will be passed to above allocation routines */
68
+ void * ctx;
69
+ } yajl_alloc_funcs;
70
+
71
+ #ifdef __cplusplus
72
+ }
73
+ #endif
74
+
75
+ #endif