Ruby  2.0.0p247(2013-06-27revision41674)
ext/json/generator/generator.h
Go to the documentation of this file.
00001 #ifndef _GENERATOR_H_
00002 #define _GENERATOR_H_
00003 
00004 #include <string.h>
00005 #include <math.h>
00006 #include <ctype.h>
00007 
00008 #include "ruby.h"
00009 
00010 #ifdef HAVE_RUBY_RE_H
00011 #include "ruby/re.h"
00012 #else
00013 #include "re.h"
00014 #endif
00015 
00016 #ifndef rb_intern_str
00017 #define rb_intern_str(string) SYM2ID(rb_str_intern(string))
00018 #endif
00019 
00020 #ifndef rb_obj_instance_variables
00021 #define rb_obj_instance_variables(object) rb_funcall(object, rb_intern("instance_variables"), 0)
00022 #endif
00023 
00024 #define option_given_p(opts, key) RTEST(rb_funcall(opts, i_key_p, 1, key))
00025 
00026 /* unicode defintions */
00027 
00028 #define UNI_STRICT_CONVERSION 1
00029 
00030 typedef unsigned long  UTF32; /* at least 32 bits */
00031 typedef unsigned short UTF16; /* at least 16 bits */
00032 typedef unsigned char  UTF8;  /* typically 8 bits */
00033 
00034 #define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD
00035 #define UNI_MAX_BMP (UTF32)0x0000FFFF
00036 #define UNI_MAX_UTF16 (UTF32)0x0010FFFF
00037 #define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF
00038 #define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF
00039 
00040 #define UNI_SUR_HIGH_START  (UTF32)0xD800
00041 #define UNI_SUR_HIGH_END    (UTF32)0xDBFF
00042 #define UNI_SUR_LOW_START   (UTF32)0xDC00
00043 #define UNI_SUR_LOW_END     (UTF32)0xDFFF
00044 
00045 static const int halfShift  = 10; /* used for shifting by 10 bits */
00046 
00047 static const UTF32 halfBase = 0x0010000UL;
00048 static const UTF32 halfMask = 0x3FFUL;
00049 
00050 static unsigned char isLegalUTF8(const UTF8 *source, unsigned long length);
00051 static void unicode_escape(char *buf, UTF16 character);
00052 static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16 character);
00053 static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string);
00054 static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string);
00055 static char *fstrndup(const char *ptr, unsigned long len);
00056 
00057 /* ruby api and some helpers */
00058 
00059 typedef struct JSON_Generator_StateStruct {
00060     char *indent;
00061     long indent_len;
00062     char *space;
00063     long space_len;
00064     char *space_before;
00065     long space_before_len;
00066     char *object_nl;
00067     long object_nl_len;
00068     char *array_nl;
00069     long array_nl_len;
00070     FBuffer *array_delim;
00071     FBuffer *object_delim;
00072     FBuffer *object_delim2;
00073     long max_nesting;
00074     char allow_nan;
00075     char ascii_only;
00076     char quirks_mode;
00077     long depth;
00078     long buffer_initial_length;
00079 } JSON_Generator_State;
00080 
00081 #define GET_STATE(self)                       \
00082     JSON_Generator_State *state;              \
00083     Data_Get_Struct(self, JSON_Generator_State, state)
00084 
00085 #define GENERATE_JSON(type)                                                                     \
00086     FBuffer *buffer;                                                                            \
00087     VALUE Vstate;                                                                               \
00088     JSON_Generator_State *state;                                                                \
00089                                                                                                 \
00090     rb_scan_args(argc, argv, "01", &Vstate);                                                    \
00091     Vstate = cState_from_state_s(cState, Vstate);                                               \
00092     Data_Get_Struct(Vstate, JSON_Generator_State, state);                                       \
00093     buffer = cState_prepare_buffer(Vstate);                                                     \
00094     generate_json_##type(buffer, Vstate, state, self);                                          \
00095     return fbuffer_to_s(buffer)
00096 
00097 static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self);
00098 static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self);
00099 static VALUE mFixnum_to_json(int argc, VALUE *argv, VALUE self);
00100 static VALUE mBignum_to_json(int argc, VALUE *argv, VALUE self);
00101 static VALUE mFloat_to_json(int argc, VALUE *argv, VALUE self);
00102 static VALUE mString_included_s(VALUE self, VALUE modul);
00103 static VALUE mString_to_json(int argc, VALUE *argv, VALUE self);
00104 static VALUE mString_to_json_raw_object(VALUE self);
00105 static VALUE mString_to_json_raw(int argc, VALUE *argv, VALUE self);
00106 static VALUE mString_Extend_json_create(VALUE self, VALUE o);
00107 static VALUE mTrueClass_to_json(int argc, VALUE *argv, VALUE self);
00108 static VALUE mFalseClass_to_json(int argc, VALUE *argv, VALUE self);
00109 static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self);
00110 static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self);
00111 static void State_free(JSON_Generator_State *state);
00112 static JSON_Generator_State *State_allocate();
00113 static VALUE cState_s_allocate(VALUE klass);
00114 static VALUE cState_configure(VALUE self, VALUE opts);
00115 static VALUE cState_to_h(VALUE self);
00116 static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
00117 static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
00118 static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
00119 static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
00120 static void generate_json_null(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
00121 static void generate_json_false(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
00122 static void generate_json_true(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
00123 static void generate_json_fixnum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
00124 static void generate_json_bignum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
00125 static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
00126 static VALUE cState_partial_generate(VALUE self, VALUE obj);
00127 static VALUE cState_generate(VALUE self, VALUE obj);
00128 static VALUE cState_initialize(int argc, VALUE *argv, VALUE self);
00129 static VALUE cState_from_state_s(VALUE self, VALUE opts);
00130 static VALUE cState_indent(VALUE self);
00131 static VALUE cState_indent_set(VALUE self, VALUE indent);
00132 static VALUE cState_space(VALUE self);
00133 static VALUE cState_space_set(VALUE self, VALUE space);
00134 static VALUE cState_space_before(VALUE self);
00135 static VALUE cState_space_before_set(VALUE self, VALUE space_before);
00136 static VALUE cState_object_nl(VALUE self);
00137 static VALUE cState_object_nl_set(VALUE self, VALUE object_nl);
00138 static VALUE cState_array_nl(VALUE self);
00139 static VALUE cState_array_nl_set(VALUE self, VALUE array_nl);
00140 static VALUE cState_max_nesting(VALUE self);
00141 static VALUE cState_max_nesting_set(VALUE self, VALUE depth);
00142 static VALUE cState_allow_nan_p(VALUE self);
00143 static VALUE cState_ascii_only_p(VALUE self);
00144 static VALUE cState_depth(VALUE self);
00145 static VALUE cState_depth_set(VALUE self, VALUE depth);
00146 static FBuffer *cState_prepare_buffer(VALUE self);
00147 
00148 #endif
00149