Ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c52d4d35cc6a173c89eda98ceffa2dcf)
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, char escape_slash);
53static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char escape_slash);
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;
76 long depth;
79
80#define GET_STATE_TO(self, state) \
81 TypedData_Get_Struct(self, JSON_Generator_State, &JSON_Generator_State_type, state)
82
83#define GET_STATE(self) \
84 JSON_Generator_State *state; \
85 GET_STATE_TO(self, state)
86
87#define GENERATE_JSON(type) \
88 FBuffer *buffer; \
89 VALUE Vstate; \
90 JSON_Generator_State *state; \
91 \
92 rb_scan_args(argc, argv, "01", &Vstate); \
93 Vstate = cState_from_state_s(cState, Vstate); \
94 TypedData_Get_Struct(Vstate, JSON_Generator_State, &JSON_Generator_State_type, state); \
95 buffer = cState_prepare_buffer(Vstate); \
96 generate_json_##type(buffer, Vstate, state, self); \
97 return fbuffer_to_s(buffer)
98
99static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self);
100static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self);
101#ifdef RUBY_INTEGER_UNIFICATION
102static VALUE mInteger_to_json(int argc, VALUE *argv, VALUE self);
103#else
104static VALUE mFixnum_to_json(int argc, VALUE *argv, VALUE self);
105static VALUE mBignum_to_json(int argc, VALUE *argv, VALUE self);
106#endif
107static VALUE mFloat_to_json(int argc, VALUE *argv, VALUE self);
108static VALUE mString_included_s(VALUE self, VALUE modul);
109static VALUE mString_to_json(int argc, VALUE *argv, VALUE self);
110static VALUE mString_to_json_raw_object(VALUE self);
111static VALUE mString_to_json_raw(int argc, VALUE *argv, VALUE self);
112static VALUE mString_Extend_json_create(VALUE self, VALUE o);
113static VALUE mTrueClass_to_json(int argc, VALUE *argv, VALUE self);
114static VALUE mFalseClass_to_json(int argc, VALUE *argv, VALUE self);
115static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self);
116static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self);
117static void State_free(void *state);
118static VALUE cState_s_allocate(VALUE klass);
119static VALUE cState_configure(VALUE self, VALUE opts);
120static VALUE cState_to_h(VALUE self);
121static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
122static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
123static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
124static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
125static void generate_json_null(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
126static void generate_json_false(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
127static void generate_json_true(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
128#ifdef RUBY_INTEGER_UNIFICATION
129static void generate_json_integer(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
130#endif
131static void generate_json_fixnum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
132static void generate_json_bignum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
133static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
134static VALUE cState_partial_generate(VALUE self, VALUE obj);
135static VALUE cState_generate(VALUE self, VALUE obj);
136static VALUE cState_initialize(int argc, VALUE *argv, VALUE self);
137static VALUE cState_from_state_s(VALUE self, VALUE opts);
138static VALUE cState_indent(VALUE self);
139static VALUE cState_indent_set(VALUE self, VALUE indent);
140static VALUE cState_space(VALUE self);
141static VALUE cState_space_set(VALUE self, VALUE space);
142static VALUE cState_space_before(VALUE self);
143static VALUE cState_space_before_set(VALUE self, VALUE space_before);
144static VALUE cState_object_nl(VALUE self);
145static VALUE cState_object_nl_set(VALUE self, VALUE object_nl);
146static VALUE cState_array_nl(VALUE self);
147static VALUE cState_array_nl_set(VALUE self, VALUE array_nl);
148static VALUE cState_max_nesting(VALUE self);
149static VALUE cState_max_nesting_set(VALUE self, VALUE depth);
150static VALUE cState_allow_nan_p(VALUE self);
151static VALUE cState_ascii_only_p(VALUE self);
152static VALUE cState_depth(VALUE self);
153static VALUE cState_depth_set(VALUE self, VALUE depth);
154static VALUE cState_escape_slash(VALUE self);
155static VALUE cState_escape_slash_set(VALUE self, VALUE depth);
156static FBuffer *cState_prepare_buffer(VALUE self);
157#ifndef ZALLOC
158#define ZALLOC(type) ((type *)ruby_zalloc(sizeof(type)))
159static inline void *ruby_zalloc(size_t n)
160{
161 void *p = ruby_xmalloc(n);
162 memset(p, 0, n);
163 return p;
164}
165#endif
166#ifdef TypedData_Make_Struct
167static const rb_data_type_t JSON_Generator_State_type;
168#define NEW_TYPEDDATA_WRAPPER 1
169#else
170#define TypedData_Make_Struct(klass, type, ignore, json) Data_Make_Struct(klass, type, NULL, State_free, json)
171#define TypedData_Get_Struct(self, JSON_Generator_State, ignore, json) Data_Get_Struct(self, JSON_Generator_State, json)
172#endif
173
174#endif
Our own, locale independent, character handling routines.
struct RIMemo * ptr
Definition: debug.c:88
uint8_t len
Definition: escape.c:17
void * ruby_xmalloc(size_t size)
Allocates a storage instance.
Definition: gc.c:12795
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
Internal header for Regexp.
voidpf void * buf
Definition: ioapi.h:138
Internal header for Math.
int argc
Definition: ruby.c:240
char ** argv
Definition: ruby.c:241
Definition: blast.c:41
unsigned long VALUE
Definition: value.h:38