8 static ID id_start_stream;
9 static ID id_end_stream;
10 static ID id_start_document;
11 static ID id_end_document;
14 static ID id_start_sequence;
15 static ID id_end_sequence;
16 static ID id_start_mapping;
17 static ID id_end_mapping;
18 static ID id_event_location;
20 #define PSYCH_TRANSCODE(_str, _yaml_enc, _internal_enc) \
22 rb_enc_associate_index((_str), (_yaml_enc)); \
24 (_str) = rb_str_export_to_enc((_str), (_internal_enc)); \
27 static int io_reader(
void * data,
unsigned char *
buf,
size_t size,
size_t *
read)
43 static void dealloc(
void *
ptr)
45 yaml_parser_t * parser;
47 parser = (yaml_parser_t *)
ptr;
48 yaml_parser_delete(parser);
53 static size_t memsize(
const void *
ptr)
55 const yaml_parser_t *parser =
ptr;
65 #ifdef RUBY_TYPED_FREE_IMMEDIATELY
72 yaml_parser_t * parser;
75 yaml_parser_initialize(parser);
83 VALUE ePsychSyntaxError;
85 line = parser->context_mark.line + 1;
86 column = parser->context_mark.column + 1;
94 INT2NUM(parser->problem_offset),
99 static VALUE transcode_string(
VALUE src,
int * parser_encoding)
106 if (source_encoding == utf8) {
107 *parser_encoding = YAML_UTF8_ENCODING;
111 if (source_encoding == utf16le) {
112 *parser_encoding = YAML_UTF16LE_ENCODING;
116 if (source_encoding == utf16be) {
117 *parser_encoding = YAML_UTF16BE_ENCODING;
124 *parser_encoding = YAML_UTF8_ENCODING;
130 VALUE io_external_encoding;
131 int io_external_enc_index;
136 if (
NIL_P(io_external_encoding)) {
144 *parser_encoding = YAML_UTF8_ENCODING;
149 *parser_encoding = YAML_UTF8_ENCODING;
154 *parser_encoding = YAML_UTF16LE_ENCODING;
159 *parser_encoding = YAML_UTF16BE_ENCODING;
165 *parser_encoding = YAML_ANY_ENCODING;
171 *parser_encoding = YAML_ANY_ENCODING;
176 static VALUE protected_start_stream(
VALUE pointer)
179 return rb_funcall(args[0], id_start_stream, 1, args[1]);
182 static VALUE protected_start_document(
VALUE pointer)
185 return rb_funcall3(args[0], id_start_document, 3, args + 1);
188 static VALUE protected_end_document(
VALUE pointer)
191 return rb_funcall(args[0], id_end_document, 1, args[1]);
203 return rb_funcall3(args[0], id_scalar, 6, args + 1);
206 static VALUE protected_start_sequence(
VALUE pointer)
209 return rb_funcall3(args[0], id_start_sequence, 4, args + 1);
212 static VALUE protected_end_sequence(
VALUE handler)
214 return rb_funcall(handler, id_end_sequence, 0);
217 static VALUE protected_start_mapping(
VALUE pointer)
220 return rb_funcall3(args[0], id_start_mapping, 4, args + 1);
223 static VALUE protected_end_mapping(
VALUE handler)
225 return rb_funcall(handler, id_end_mapping, 0);
233 static VALUE protected_end_stream(
VALUE handler)
238 static VALUE protected_event_location(
VALUE pointer)
241 return rb_funcall3(args[0], id_event_location, 4, args + 1);
256 yaml_parser_t * parser;
260 int parser_encoding = YAML_ANY_ENCODING;
274 yaml_parser_delete(parser);
275 yaml_parser_initialize(parser);
278 yaml = transcode_io(yaml, &parser_encoding);
279 yaml_parser_set_encoding(parser, parser_encoding);
280 yaml_parser_set_input(parser, io_reader, (
void *)yaml);
283 yaml = transcode_string(yaml, &parser_encoding);
284 yaml_parser_set_encoding(parser, parser_encoding);
285 yaml_parser_set_input_string(
294 VALUE start_line, start_column, end_line, end_column;
296 if(!yaml_parser_parse(parser, &event)) {
299 exception = make_exception(parser,
path);
300 yaml_parser_delete(parser);
301 yaml_parser_initialize(parser);
306 start_line =
INT2NUM((
long)event.start_mark.line);
307 start_column =
INT2NUM((
long)event.start_mark.column);
308 end_line =
INT2NUM((
long)event.end_mark.line);
309 end_column =
INT2NUM((
long)event.end_mark.column);
311 event_args[0] = handler;
312 event_args[1] = start_line;
313 event_args[2] = start_column;
314 event_args[3] = end_line;
315 event_args[4] = end_column;
319 case YAML_STREAM_START_EVENT:
324 args[1] =
INT2NUM((
long)event.data.stream_start.encoding);
328 case YAML_DOCUMENT_START_EVENT:
334 VALUE version =
event.data.document_start.version_directive ?
337 INT2NUM((
long)event.data.document_start.version_directive->major),
338 INT2NUM((
long)event.data.document_start.version_directive->minor)
341 if(event.data.document_start.tag_directives.start) {
342 yaml_tag_directive_t *start =
343 event.data.document_start.tag_directives.start;
344 yaml_tag_directive_t *end =
345 event.data.document_start.tag_directives.end;
346 for(; start != end; start++) {
364 args[2] = tag_directives;
365 args[3] =
event.data.document_start.implicit == 1 ?
Qtrue :
Qfalse;
369 case YAML_DOCUMENT_END_EVENT:
374 args[1] =
event.data.document_end.implicit == 1 ?
Qtrue :
Qfalse;
378 case YAML_ALIAS_EVENT:
382 if(event.data.alias.anchor) {
392 case YAML_SCALAR_EVENT:
397 VALUE plain_implicit, quoted_implicit, style;
399 (
const char *)event.data.scalar.value,
400 (
long)event.data.scalar.length
405 if(event.data.scalar.anchor) {
406 anchor =
rb_str_new2((
const char *)event.data.scalar.anchor);
410 if(event.data.scalar.tag) {
411 tag =
rb_str_new2((
const char *)event.data.scalar.tag);
416 event.data.scalar.plain_implicit == 0 ?
Qfalse :
Qtrue;
419 event.data.scalar.quoted_implicit == 0 ?
Qfalse :
Qtrue;
421 style =
INT2NUM((
long)event.data.scalar.style);
427 args[4] = plain_implicit;
428 args[5] = quoted_implicit;
433 case YAML_SEQUENCE_START_EVENT:
438 VALUE implicit, style;
439 if(event.data.sequence_start.anchor) {
440 anchor =
rb_str_new2((
const char *)event.data.sequence_start.anchor);
445 if(event.data.sequence_start.tag) {
446 tag =
rb_str_new2((
const char *)event.data.sequence_start.tag);
451 event.data.sequence_start.implicit == 0 ?
Qfalse :
Qtrue;
453 style =
INT2NUM((
long)event.data.sequence_start.style);
464 case YAML_SEQUENCE_END_EVENT:
465 rb_protect(protected_end_sequence, handler, &state);
467 case YAML_MAPPING_START_EVENT:
472 VALUE implicit, style;
473 if(event.data.mapping_start.anchor) {
474 anchor =
rb_str_new2((
const char *)event.data.mapping_start.anchor);
478 if(event.data.mapping_start.tag) {
479 tag =
rb_str_new2((
const char *)event.data.mapping_start.tag);
484 event.data.mapping_start.implicit == 0 ?
Qfalse :
Qtrue;
486 style =
INT2NUM((
long)event.data.mapping_start.style);
497 case YAML_MAPPING_END_EVENT:
498 rb_protect(protected_end_mapping, handler, &state);
503 case YAML_STREAM_END_EVENT:
504 rb_protect(protected_end_stream, handler, &state);
508 yaml_event_delete(&event);
526 yaml_parser_t * parser;
530 args[0] =
INT2NUM(parser->mark.index);
531 args[1] =
INT2NUM(parser->mark.line);
532 args[2] =
INT2NUM(parser->mark.column);
567 id_start_stream =
rb_intern(
"start_stream");
569 id_start_document =
rb_intern(
"start_document");
570 id_end_document =
rb_intern(
"end_document");
573 id_start_sequence =
rb_intern(
"start_sequence");
574 id_end_sequence =
rb_intern(
"end_sequence");
575 id_start_mapping =
rb_intern(
"start_mapping");
576 id_end_mapping =
rb_intern(
"end_mapping");
577 id_event_location =
rb_intern(
"event_location");