1#ifndef _GENERATOR_H_ 2#define _GENERATOR_H_ 3 4#include <string.h> 5#include <math.h> 6#include <ctype.h> 7 8#include "ruby.h" 9 10#ifdef HAVE_RUBY_RE_H 11#include "ruby/re.h" 12#else 13#include "re.h" 14#endif 15 16#ifndef rb_intern_str 17#define rb_intern_str(string) SYM2ID(rb_str_intern(string)) 18#endif 19 20#ifndef rb_obj_instance_variables 21#define rb_obj_instance_variables(object) rb_funcall(object, rb_intern("instance_variables"), 0) 22#endif 23 24#define option_given_p(opts, key) RTEST(rb_funcall(opts, i_key_p, 1, key)) 25 26/* unicode defintions */ 27 28#define UNI_STRICT_CONVERSION 1 29 30typedef unsigned long UTF32; /* at least 32 bits */ 31typedef unsigned short UTF16; /* at least 16 bits */ 32typedef unsigned char UTF8; /* typically 8 bits */ 33 34#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD 35#define UNI_MAX_BMP (UTF32)0x0000FFFF 36#define UNI_MAX_UTF16 (UTF32)0x0010FFFF 37#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF 38#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF 39 40#define UNI_SUR_HIGH_START (UTF32)0xD800 41#define UNI_SUR_HIGH_END (UTF32)0xDBFF 42#define UNI_SUR_LOW_START (UTF32)0xDC00 43#define UNI_SUR_LOW_END (UTF32)0xDFFF 44 45static const int halfShift = 10; /* used for shifting by 10 bits */ 46 47static const UTF32 halfBase = 0x0010000UL; 48static const UTF32 halfMask = 0x3FFUL; 49 50static unsigned char isLegalUTF8(const UTF8 *source, unsigned long length); 51static void unicode_escape(char *buf, UTF16 character); 52static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16 character); 53static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string); 54static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string); 55static char *fstrndup(const char *ptr, unsigned long len); 56 57/* ruby api and some helpers */ 58 59typedef struct JSON_Generator_StateStruct { 60 char *indent; 61 long indent_len; 62 char *space; 63 long space_len; 64 char *space_before; 65 long space_before_len; 66 char *object_nl; 67 long object_nl_len; 68 char *array_nl; 69 long array_nl_len; 70 FBuffer *array_delim; 71 FBuffer *object_delim; 72 FBuffer *object_delim2; 73 long max_nesting; 74 char allow_nan; 75 char ascii_only; 76 char quirks_mode; 77 long depth; 78 long buffer_initial_length; 79} JSON_Generator_State; 80 81#define GET_STATE(self) \ 82 JSON_Generator_State *state; \ 83 Data_Get_Struct(self, JSON_Generator_State, state) 84 85#define GENERATE_JSON(type) \ 86 FBuffer *buffer; \ 87 VALUE Vstate; \ 88 JSON_Generator_State *state; \ 89 \ 90 rb_scan_args(argc, argv, "01", &Vstate); \ 91 Vstate = cState_from_state_s(cState, Vstate); \ 92 Data_Get_Struct(Vstate, JSON_Generator_State, state); \ 93 buffer = cState_prepare_buffer(Vstate); \ 94 generate_json_##type(buffer, Vstate, state, self); \ 95 return fbuffer_to_s(buffer) 96 97static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self); 98static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self); 99static VALUE mFixnum_to_json(int argc, VALUE *argv, VALUE self); 100static VALUE mBignum_to_json(int argc, VALUE *argv, VALUE self); 101static VALUE mFloat_to_json(int argc, VALUE *argv, VALUE self); 102static VALUE mString_included_s(VALUE self, VALUE modul); 103static VALUE mString_to_json(int argc, VALUE *argv, VALUE self); 104static VALUE mString_to_json_raw_object(VALUE self); 105static VALUE mString_to_json_raw(int argc, VALUE *argv, VALUE self); 106static VALUE mString_Extend_json_create(VALUE self, VALUE o); 107static VALUE mTrueClass_to_json(int argc, VALUE *argv, VALUE self); 108static VALUE mFalseClass_to_json(int argc, VALUE *argv, VALUE self); 109static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self); 110static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self); 111static void State_free(JSON_Generator_State *state); 112static JSON_Generator_State *State_allocate(); 113static VALUE cState_s_allocate(VALUE klass); 114static VALUE cState_configure(VALUE self, VALUE opts); 115static VALUE cState_to_h(VALUE self); 116static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); 117static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); 118static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); 119static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); 120static void generate_json_null(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); 121static void generate_json_false(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); 122static void generate_json_true(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); 123static void generate_json_fixnum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); 124static void generate_json_bignum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); 125static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); 126static VALUE cState_partial_generate(VALUE self, VALUE obj); 127static VALUE cState_generate(VALUE self, VALUE obj); 128static VALUE cState_initialize(int argc, VALUE *argv, VALUE self); 129static VALUE cState_from_state_s(VALUE self, VALUE opts); 130static VALUE cState_indent(VALUE self); 131static VALUE cState_indent_set(VALUE self, VALUE indent); 132static VALUE cState_space(VALUE self); 133static VALUE cState_space_set(VALUE self, VALUE space); 134static VALUE cState_space_before(VALUE self); 135static VALUE cState_space_before_set(VALUE self, VALUE space_before); 136static VALUE cState_object_nl(VALUE self); 137static VALUE cState_object_nl_set(VALUE self, VALUE object_nl); 138static VALUE cState_array_nl(VALUE self); 139static VALUE cState_array_nl_set(VALUE self, VALUE array_nl); 140static VALUE cState_max_nesting(VALUE self); 141static VALUE cState_max_nesting_set(VALUE self, VALUE depth); 142static VALUE cState_allow_nan_p(VALUE self); 143static VALUE cState_ascii_only_p(VALUE self); 144static VALUE cState_depth(VALUE self); 145static VALUE cState_depth_set(VALUE self, VALUE depth); 146static FBuffer *cState_prepare_buffer(VALUE self); 147 148#endif 149