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)); \
37 memcpy(buf, str, *read);
45 yaml_parser_t * parser;
47 parser = (yaml_parser_t *)ptr;
48 yaml_parser_delete(parser);
54 yaml_parser_t * parser;
56 parser =
xmalloc(
sizeof(yaml_parser_t));
57 yaml_parser_initialize(parser);
66 line = parser->context_mark.line + 1;
67 column = parser->context_mark.column + 1;
73 INT2NUM(parser->problem_offset),
78 #ifdef HAVE_RUBY_ENCODING_H
79 static VALUE transcode_string(
VALUE src,
int * parser_encoding)
86 if (source_encoding == utf8) {
87 *parser_encoding = YAML_UTF8_ENCODING;
91 if (source_encoding == utf16le) {
92 *parser_encoding = YAML_UTF16LE_ENCODING;
96 if (source_encoding == utf16be) {
97 *parser_encoding = YAML_UTF16BE_ENCODING;
104 *parser_encoding = YAML_UTF8_ENCODING;
108 static VALUE transcode_io(
VALUE src,
int * parser_encoding)
110 VALUE io_external_encoding;
111 int io_external_enc_index;
116 if (
NIL_P(io_external_encoding)) {
124 *parser_encoding = YAML_UTF8_ENCODING;
129 *parser_encoding = YAML_UTF8_ENCODING;
134 *parser_encoding = YAML_UTF16LE_ENCODING;
139 *parser_encoding = YAML_UTF16BE_ENCODING;
145 *parser_encoding = YAML_ANY_ENCODING;
151 *parser_encoding = YAML_ANY_ENCODING;
232 yaml_parser_t * parser;
237 int parser_encoding = YAML_ANY_ENCODING;
238 #ifdef HAVE_RUBY_ENCODING_H
244 if (
rb_scan_args(argc, argv,
"11", &yaml, &path) == 1) {
253 yaml_parser_delete(parser);
254 yaml_parser_initialize(parser);
259 #ifdef HAVE_RUBY_ENCODING_H
260 yaml = transcode_io(yaml, &parser_encoding);
261 yaml_parser_set_encoding(parser, parser_encoding);
263 yaml_parser_set_input(parser,
io_reader, (
void *)yaml);
267 #ifdef HAVE_RUBY_ENCODING_H
268 yaml = transcode_string(yaml, &parser_encoding);
269 yaml_parser_set_encoding(parser, parser_encoding);
271 yaml_parser_set_input_string(
279 if(!yaml_parser_parse(parser, &event)) {
283 yaml_parser_delete(parser);
284 yaml_parser_initialize(parser);
290 case YAML_STREAM_START_EVENT:
295 args[1] =
INT2NUM((
long)event.data.stream_start.encoding);
299 case YAML_DOCUMENT_START_EVENT:
305 VALUE version =
event.data.document_start.version_directive ?
308 INT2NUM((
long)event.data.document_start.version_directive->major),
309 INT2NUM((
long)event.data.document_start.version_directive->minor)
312 if(event.data.document_start.tag_directives.start) {
313 yaml_tag_directive_t *start =
314 event.data.document_start.tag_directives.start;
315 yaml_tag_directive_t *end =
316 event.data.document_start.tag_directives.end;
317 for(; start != end; start++) {
323 #ifdef HAVE_RUBY_ENCODING_H
331 #ifdef HAVE_RUBY_ENCODING_H
341 args[2] = tag_directives;
342 args[3] =
event.data.document_start.implicit == 1 ?
Qtrue :
Qfalse;
346 case YAML_DOCUMENT_END_EVENT:
351 args[1] =
event.data.document_end.implicit == 1 ?
Qtrue :
Qfalse;
355 case YAML_ALIAS_EVENT:
359 if(event.data.alias.anchor) {
360 alias =
rb_str_new2((
const char *)event.data.alias.anchor);
362 #ifdef HAVE_RUBY_ENCODING_H
372 case YAML_SCALAR_EVENT:
377 VALUE plain_implicit, quoted_implicit, style;
379 (
const char *)event.data.scalar.value,
380 (
long)event.data.scalar.length
384 #ifdef HAVE_RUBY_ENCODING_H
388 if(event.data.scalar.anchor) {
389 anchor =
rb_str_new2((
const char *)event.data.scalar.anchor);
391 #ifdef HAVE_RUBY_ENCODING_H
396 if(event.data.scalar.tag) {
397 tag =
rb_str_new2((
const char *)event.data.scalar.tag);
399 #ifdef HAVE_RUBY_ENCODING_H
405 event.data.scalar.plain_implicit == 0 ?
Qfalse :
Qtrue;
408 event.data.scalar.quoted_implicit == 0 ?
Qfalse :
Qtrue;
410 style =
INT2NUM((
long)event.data.scalar.style);
416 args[4] = plain_implicit;
417 args[5] = quoted_implicit;
422 case YAML_SEQUENCE_START_EVENT:
427 VALUE implicit, style;
428 if(event.data.sequence_start.anchor) {
429 anchor =
rb_str_new2((
const char *)event.data.sequence_start.anchor);
431 #ifdef HAVE_RUBY_ENCODING_H
437 if(event.data.sequence_start.tag) {
438 tag =
rb_str_new2((
const char *)event.data.sequence_start.tag);
440 #ifdef HAVE_RUBY_ENCODING_H
446 event.data.sequence_start.implicit == 0 ?
Qfalse :
Qtrue;
448 style =
INT2NUM((
long)event.data.sequence_start.style);
459 case YAML_SEQUENCE_END_EVENT:
462 case YAML_MAPPING_START_EVENT:
467 VALUE implicit, style;
468 if(event.data.mapping_start.anchor) {
469 anchor =
rb_str_new2((
const char *)event.data.mapping_start.anchor);
471 #ifdef HAVE_RUBY_ENCODING_H
476 if(event.data.mapping_start.tag) {
477 tag =
rb_str_new2((
const char *)event.data.mapping_start.tag);
479 #ifdef HAVE_RUBY_ENCODING_H
485 event.data.mapping_start.implicit == 0 ?
Qfalse :
Qtrue;
487 style =
INT2NUM((
long)event.data.mapping_start.style);
498 case YAML_MAPPING_END_EVENT:
504 case YAML_STREAM_END_EVENT:
509 yaml_event_delete(&event);
527 yaml_parser_t * parser;
531 args[0] =
INT2NUM(parser->mark.index);
532 args[1] =
INT2NUM(parser->mark.line);
533 args[2] =
INT2NUM(parser->mark.column);