static VALUE get_node(rb_yaml_parser_t *parser) { VALUE node; NEXT_EVENT(); switch (parser->event.type) { case YAML_DOCUMENT_END_EVENT: case YAML_MAPPING_END_EVENT: case YAML_SEQUENCE_END_EVENT: case YAML_STREAM_END_EVENT: return Qundef; case YAML_MAPPING_START_EVENT: node = handle_mapping(parser); break; case YAML_SEQUENCE_START_EVENT: node = handle_sequence(parser); break; case YAML_SCALAR_EVENT: node = handle_scalar(parser); break; case YAML_ALIAS_EVENT: // ignoring alias node = Qundef; break; default: rb_raise(rb_eArgError, "Invalid event %d at top level", (int)parser->event.type); } return node; }
int stage1_parse(struct streamstate* stp, FILE* file, int verbose) { int rc = 0; int done = 0; int error = 0; rc = yaml_parser_initialize(&stp->parser); if (! rc) return error_parser_initialize_failed(stp); yaml_parser_set_input_file(&stp->parser, file); while (!done) { rc = yaml_parser_parse(&stp->parser, &stp->event); if (!rc) { error = error_parser_parse_failed(stp); break; } if (verbose) debug_event_type(&stp->event); rc = 0; switch (stp->event.type) { case YAML_STREAM_START_EVENT: if (stp->stream_start) rc = error_invalid_stream_start(stp); else stp->stream_start = 1; break; case YAML_DOCUMENT_START_EVENT: if (stp->document_start) rc = error_invalid_document_start(stp); else stp->document_start = 1; break; case YAML_MAPPING_START_EVENT: if (! stp->stream_start) rc = error_stream_not_started(stp, "mapping_start_event"); else if (! stp->document_start) rc = error_document_not_started(stp, "mapping_start_event"); else rc = handle_mapping_start(stp); break; case YAML_MAPPING_END_EVENT: if (! stp->stream_start) rc = error_stream_not_started(stp, "mapping_end_event"); else if (! stp->document_start) rc = error_document_not_started(stp, "mapping_end_event"); else if (stp->curmap == NULL) rc = error_no_current_mapping(stp, "mapping_end_event"); else rc = handle_mapping_end(stp); break; case YAML_SCALAR_EVENT: if (! stp->stream_start) rc = error_stream_not_started(stp, "scalar_event"); else if (! stp->document_start) rc = error_document_not_started(stp, "scalar_event"); else if (stp->curmap == NULL) rc = error_no_current_mapping(stp, "scalar_event"); else rc = handle_scalar(stp); break; case YAML_DOCUMENT_END_EVENT: if (! stp->stream_start) rc = error_stream_not_started(stp, "document_end_event"); else if (! stp->document_start) rc = error_document_not_started(stp, "document_end_event"); else stp->document_start = 0; break; case YAML_STREAM_END_EVENT: if (! stp->stream_start) rc = error_stream_not_started(stp, "stream_end_event"); else { stp->stream_start = 0; done = 1; } break; default: rc = unexpected_event(stp); break; } yaml_event_delete(&stp->event); if (rc) { error = 1; break; } } yaml_parser_delete(&stp->parser); return error; }