Ruby 2.7.7p221 (2022-11-24 revision 168ec2b1e5ad0e4688e963d9de019557c78feed9)
generator.h
Go to the documentation of this file.
1#ifndef _GENERATOR_H_
2#define _GENERATOR_H_
3
4#include <math.h>
5#include <ctype.h>
6
7#include "ruby.h"
8
9#ifdef HAVE_RUBY_RE_H
10#include "ruby/re.h"
11#else
12#include "re.h"
13#endif
14
15#ifndef rb_intern_str
16#define rb_intern_str(string) SYM2ID(rb_str_intern(string))
17#endif
18
19#ifndef rb_obj_instance_variables
20#define rb_obj_instance_variables(object) rb_funcall(object, rb_intern("instance_variables"), 0)
21#endif
22
23#define option_given_p(opts, key) RTEST(rb_funcall(opts, i_key_p, 1, key))
24
25/* unicode definitions */
26
27#define UNI_STRICT_CONVERSION 1
28
29typedef unsigned long UTF32; /* at least 32 bits */
30typedef unsigned short UTF16; /* at least 16 bits */
31typedef unsigned char UTF8; /* typically 8 bits */
32
33#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD
34#define UNI_MAX_BMP (UTF32)0x0000FFFF
35#define UNI_MAX_UTF16 (UTF32)0x0010FFFF
36#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF
37#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF
38
39#define UNI_SUR_HIGH_START (UTF32)0xD800
40#define UNI_SUR_HIGH_END (UTF32)0xDBFF
41#define UNI_SUR_LOW_START (UTF32)0xDC00
42#define UNI_SUR_LOW_END (UTF32)0xDFFF
43
44static const int halfShift = 10; /* used for shifting by 10 bits */
45
46static const UTF32 halfBase = 0x0010000UL;
47static const UTF32 halfMask = 0x3FFUL;
48
49static unsigned char isLegalUTF8(const UTF8 *source, unsigned long length);
50static void unicode_escape(char *buf, UTF16 character);
51static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16 character);
52static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string);
53static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string);
54static char *fstrndup(const char *ptr, unsigned long len);
55
56/* ruby api and some helpers */
57
59 char *indent;
61 char *space;
65 char *object_nl;
67 char *array_nl;
75 long depth;
78
79#define GET_STATE_TO(self, state) \
80 TypedData_Get_Struct(self, JSON_Generator_State, &JSON_Generator_State_type, state)
81
82#define GET_STATE(self) \
83 JSON_Generator_State *state; \
84 GET_STATE_TO(self, state)
85
86#define GENERATE_JSON(type) \
87 FBuffer *buffer; \
88 VALUE Vstate; \
89 JSON_Generator_State *state; \
90 \
91 rb_scan_args(argc, argv, "01", &Vstate); \
92 Vstate = cState_from_state_s(cState, Vstate); \
93 TypedData_Get_Struct(Vstate, JSON_Generator_State, &JSON_Generator_State_type, state); \
94 buffer = cState_prepare_buffer(Vstate); \
95 generate_json_##type(buffer, Vstate, state, self); \
96 return fbuffer_to_s(buffer)
97
98static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self);
99static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self);
100#ifdef RUBY_INTEGER_UNIFICATION
101static VALUE mInteger_to_json(int argc, VALUE *argv, VALUE self);
102#else
103static VALUE mFixnum_to_json(int argc, VALUE *argv, VALUE self);
104static VALUE mBignum_to_json(int argc, VALUE *argv, VALUE self);
105#endif
106static VALUE mFloat_to_json(int argc, VALUE *argv, VALUE self);
107static VALUE mString_included_s(VALUE self, VALUE modul);
108static VALUE mString_to_json(int argc, VALUE *argv, VALUE self);
109static VALUE mString_to_json_raw_object(VALUE self);
110static VALUE mString_to_json_raw(int argc, VALUE *argv, VALUE self);
111static VALUE mString_Extend_json_create(VALUE self, VALUE o);
112static VALUE mTrueClass_to_json(int argc, VALUE *argv, VALUE self);
113static VALUE mFalseClass_to_json(int argc, VALUE *argv, VALUE self);
114static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self);
115static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self);
116static void State_free(void *state);
117static VALUE cState_s_allocate(VALUE klass);
118static VALUE cState_configure(VALUE self, VALUE opts);
119static VALUE cState_to_h(VALUE self);
120static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
121static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
122static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
123static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
124static void generate_json_null(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
125static void generate_json_false(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
126static void generate_json_true(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
127#ifdef RUBY_INTEGER_UNIFICATION
128static void generate_json_integer(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
129#endif
130static void generate_json_fixnum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
131static void generate_json_bignum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
132static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
133static VALUE cState_partial_generate(VALUE self, VALUE obj);
134static VALUE cState_generate(VALUE self, VALUE obj);
135static VALUE cState_initialize(int argc, VALUE *argv, VALUE self);
136static VALUE cState_from_state_s(VALUE self, VALUE opts);
137static VALUE cState_indent(VALUE self);
138static VALUE cState_indent_set(VALUE self, VALUE indent);
139static VALUE cState_space(VALUE self);
140static VALUE cState_space_set(VALUE self, VALUE space);
141static VALUE cState_space_before(VALUE self);
142static VALUE cState_space_before_set(VALUE self, VALUE space_before);
143static VALUE cState_object_nl(VALUE self);
144static VALUE cState_object_nl_set(VALUE self, VALUE object_nl);
145static VALUE cState_array_nl(VALUE self);
146static VALUE cState_array_nl_set(VALUE self, VALUE array_nl);
147static VALUE cState_max_nesting(VALUE self);
148static VALUE cState_max_nesting_set(VALUE self, VALUE depth);
149static VALUE cState_allow_nan_p(VALUE self);
150static VALUE cState_ascii_only_p(VALUE self);
151static VALUE cState_depth(VALUE self);
152static VALUE cState_depth_set(VALUE self, VALUE depth);
153static FBuffer *cState_prepare_buffer(VALUE self);
154#ifndef ZALLOC
155#define ZALLOC(type) ((type *)ruby_zalloc(sizeof(type)))
156static inline void *ruby_zalloc(size_t n)
157{
158 void *p = ruby_xmalloc(n);
159 memset(p, 0, n);
160 return p;
161}
162#endif
163#ifdef TypedData_Make_Struct
164static const rb_data_type_t JSON_Generator_State_type;
165#define NEW_TYPEDDATA_WRAPPER 1
166#else
167#define TypedData_Make_Struct(klass, type, ignore, json) Data_Make_Struct(klass, type, NULL, State_free, json)
168#define TypedData_Get_Struct(self, JSON_Generator_State, ignore, json) Data_Get_Struct(self, JSON_Generator_State, json)
169#endif
170
171#endif
struct RIMemo * ptr
Definition: debug.c:65
unsigned long UTF32
Definition: generator.h:29
unsigned short UTF16
Definition: generator.h:30
struct JSON_Generator_StateStruct JSON_Generator_State
unsigned char UTF8
Definition: generator.h:31
unsigned char buf[MIME_BUF_SIZE]
Definition: nkf.c:4322
const VALUE VALUE obj
const char size_t n
__inline__ const void *__restrict__ size_t len
void * memset(void *, int, size_t)
const VALUE * argv
void * ruby_xmalloc(size_t) __attribute__((__malloc__)) __attribute__((__returns_nonnull__)) __attribute__((alloc_size(1)))
Definition: gc.c:12008
unsigned long VALUE
Definition: ruby.h:102