void eol_config_parse_sequence(yaml_parser_t *parser, eolKeychain *chain) { int done = 0; eolKeychain *next = NULL; yaml_event_t event; /* First element must be a variable, or we'll change states to SEQ */ int state = KEY; do { yaml_parser_parse(parser, &event); switch(event.type) { case YAML_MAPPING_START_EVENT: next = eol_keychain_new_hash(); eol_keychain_list_append(chain,next); state ^= VAL; eol_config_parse_tier(parser, next); break; case YAML_SEQUENCE_END_EVENT: case YAML_MAPPING_END_EVENT: case YAML_STREAM_END_EVENT: done = 1; /* terminate the while loop, see below */ break; default: fprintf(stderr,"eol_config_parse_sequence: unhandled event\n"); } if(parser->error != YAML_NO_ERROR) { fprintf(stderr,"eol_config_parse_sequence: unhandled event\n"); return; } yaml_event_delete(&event); }while (!done); }
bool YamlDocument::load(char *fname) { FILE *fh = fopen(fname, "rb"); if(fh == NULL){ std::cerr << "Fail to open file: " << fname << std::endl; return false; } if(!yaml_parser_initialize(&parser)){ std::cerr << "Fail to initialize parser." << std::endl; fclose(fh); return false; } yaml_parser_set_input_file(&parser, fh); do{ yaml_parser_parse(&parser, &event); switch(event.type){ case YAML_STREAM_START_EVENT: break; case YAML_STREAM_END_EVENT: break; case YAML_DOCUMENT_START_EVENT: root = ParseYamlDoc(); break; case YAML_DOCUMENT_END_EVENT: break; default: std::cerr << "YAML Format error." << std::endl; break; } if(event.type != YAML_STREAM_END_EVENT){ yaml_event_delete(&event); } }while(event.type != YAML_STREAM_END_EVENT); yaml_event_delete(&event); yaml_parser_delete(&parser); fclose(fh); return (root != NULL); }
static void conf_event_done(struct conf *cf) { if (cf->valid_event) { yaml_event_delete(&cf->event); cf->valid_event = 0; } }
static void parser_delete_event (lyaml_parser *parser) { if (parser->validevent) { yaml_event_delete (&parser->event); parser->validevent = 0; } }
YamlNode_t *moloch_rules_parse_yaml(char *filename, YamlNode_t *parent, yaml_parser_t *parser, gboolean sequence) { char *key = NULL; YamlNode_t *node; int done = 0; while (!done) { yaml_event_t event; if (!yaml_parser_parse(parser, &event)) LOGEXIT("%s:%zu - Parse error '%s'", filename, parser->problem_mark.line, parser->problem); #ifdef RULES_DEBUG LOG("%s %d", yaml_names[event.type], event.type); #endif switch(event.type) { case YAML_NO_EVENT: done = 1; break; case YAML_SCALAR_EVENT: #ifdef RULES_DEBUG LOG("SCALAR_EVENT: %s => %s", key, event.data.scalar.value); #endif if (sequence) { moloch_rules_add_node(parent, g_strdup((gchar *)event.data.scalar.value), YAML_NODE_SEQUENCE_VALUE); } else if (key) { moloch_rules_add_node(parent, key, g_strdup((gchar *)event.data.scalar.value)); key = NULL; } else { key = g_strdup((gchar *)event.data.scalar.value); } break; case YAML_SEQUENCE_START_EVENT: case YAML_MAPPING_START_EVENT: if (parent == NULL) { parent = node = moloch_rules_add_node(NULL, g_strdup("root"), NULL); } else { node = moloch_rules_add_node(parent, key, NULL); } key = NULL; if (moloch_rules_parse_yaml(filename, node, parser, event.type == YAML_SEQUENCE_START_EVENT) == NULL) return NULL; break; case YAML_MAPPING_END_EVENT: case YAML_SEQUENCE_END_EVENT: done = 1; default: ; } yaml_event_delete(&event); } return parent; }
SEXP processYAMLStream(yaml_parser_t *parser, int simplify, SEXP nullValue, int simplifyWithNames, cetype_t charEncoding) { SEXP ans = R_NilValue; int done = 0; yaml_event_t event; while (!done) { /* Get the next event. */ if (!yaml_parser_parse(parser, &event)) { return(NULL); } fprintf(stderr, "type -> %d\n", (int) event.type); /* Process the event */ switch(event.type) { case YAML_STREAM_START_EVENT: break; case YAML_STREAM_END_EVENT: break; case YAML_DOCUMENT_START_EVENT: break; case YAML_DOCUMENT_END_EVENT: break; case YAML_ALIAS_EVENT: break; case YAML_SCALAR_EVENT: break; case YAML_SEQUENCE_START_EVENT: break; case YAML_SEQUENCE_END_EVENT: break; case YAML_MAPPING_START_EVENT: break; case YAML_MAPPING_END_EVENT: break; case YAML_NO_EVENT: break; } /* Are we finished? */ done = (event.type == YAML_STREAM_END_EVENT); /* The application is responsible for destroying the event object. */ yaml_event_delete(&event); } ans = R_NilValue; return(ans); }
void yamlBeginMap(yaml_emitter_t *emitter) { yaml_event_t event; if (!yaml_mapping_start_event_initialize( &event, NULL, NULL, 1, YAML_ANY_MAPPING_STYLE)) { throw YamlException(); } yamlTryEmit(emitter, &event); yaml_event_delete(&event); }
static void free_events(events_t **events) { yaml_event_t *event = NULL; if (events) { while (*events) { event = hd(events); if (event) { yaml_event_delete(event); enif_free(event); } } } }
static bool wb_expect_sequence(wb_config_parser_state *state) { bool result = true; if (!yaml_parser_parse(&(state->parser), &(state->event))) { state->done = true; return true; } if (state->event.type != YAML_SEQUENCE_START_EVENT) result = false; yaml_event_delete(&(state->event)); return result; }
static char* wb_read_string(wb_config_parser_state *state) { char *result; if (!yaml_parser_parse(&(state->parser), &(state->event))) { state->done = true; return 0; } if (state->event.type != YAML_SCALAR_EVENT) error("Unexpected event type while parsing YAML"); else result = wb_str_value(state); yaml_event_delete(&(state->event)); return result; }
void FinishEvent(ctr_yaml_context *ctx) { if(ctx->event.type == YAML_SCALAR_EVENT) { if(!ctx->IsSequence){ ctx->IsKey = !ctx->IsKey; //if(!ctx->IsKey)ctx->IsKey = true; //else ctx->IsKey = false; } if(ctx->string){ free(ctx->string); ctx->string = NULL; } } ctx->prev_event = ctx->event.type; yaml_event_delete(&ctx->event); }
static int wb_read_int(wb_config_parser_state *state) { int result; if (!yaml_parser_parse(&(state->parser), &(state->event))) { state->done = true; return 0; } if (state->event.type != YAML_SCALAR_EVENT) error("Unexpected event type while parsing YAML"); else if (!wb_int_value(state, &result)) error("Invalid format for integer: '%s'", wb_str_value(state)); yaml_event_delete(&(state->event)); return result; }
static char* wb_read_key(wb_config_parser_state *state) { char *result; if (!yaml_parser_parse(&(state->parser), &(state->event))) { state->done = true; return NULL; } if (state->event.type == YAML_MAPPING_END_EVENT) result = NULL; else if (state->event.type != YAML_SCALAR_EVENT) error("Unexpected event type %d while parsing YAML", state->event.type); else result = wb_str_value(state); yaml_event_delete(&(state->event)); return result; }
static bool yaml_next_event(rb_yaml_parser_t *parser) { if (NIL_P(parser->input)) { rb_raise(rb_eRuntimeError, "input needed"); } if (parser->event_valid) { yaml_event_delete(&parser->event); parser->event_valid = false; } if (yaml_parser_parse(&parser->parser, &parser->event) == 0) { rb_exc_raise(rb_yaml_parser_generate_error(&parser->parser)); parser->event_valid = false; } else { parser->event_valid = true; } return parser->event_valid; }
int emit(yaml_emitter_t *emitter, const config_t conf) { int r = CONF_OK; yaml_event_t evt; //doc start yaml_document_start_event_initialize(&evt, NULL, NULL, NULL, CONF_F); yaml_emitter_emit(emitter, &evt); // log_yml_event(evt); yaml_mapping_start_event_initialize(&evt, NULL, NULL, CONF_F, YAML_BLOCK_MAPPING_STYLE); yaml_emitter_emit(emitter, &evt); // log_yml_event(evt); entry_t iter = conf->map[0]; int i = 0; while(i < conf->size) { if(iter){ emit_entry(iter, emitter); } iter = conf->map[++i]; } //mapping end yaml_mapping_end_event_initialize(&evt); yaml_emitter_emit(emitter, &evt); //log_yml_event(evt); //doc end yaml_document_end_event_initialize(&evt,CONF_F); yaml_emitter_emit(emitter, &evt); //log_yml_event(evt); yaml_event_delete(&evt); return r; }
static bool wb_expect_mapping_file(wb_config_parser_state *state) { bool keep_scanning = true; bool result = true; while (keep_scanning) { if (!yaml_parser_parse(&(state->parser), &(state->event))) { state->done = true; return true; } keep_scanning = (state->event.type == YAML_STREAM_START_EVENT || state->event.type == YAML_DOCUMENT_START_EVENT); result = (state->event.type == YAML_MAPPING_START_EVENT); yaml_event_delete(&(state->event)); } return result; }
static bool wb_sequence_of_mappings(wb_config_parser_state *state) { bool result; if (!yaml_parser_parse(&(state->parser), &(state->event))) { state->done = true; return true; } if (state->event.type == YAML_MAPPING_START_EVENT) result = true; else if (state->event.type == YAML_SEQUENCE_END_EVENT) result = false; else error("Items of sequence must be mappings, %d", state->event.type ); //log_debug2("Sequence of mappings, with %d, result %d", state->event.type, result); yaml_event_delete(&(state->event)); return result; }
static void wb_read_list_of_string(wb_config_parser_state *state, char ***list, int *n) { bool done = false; if (!wb_expect_sequence(state)) error("Expecting a sequence of strings"); *n = 0; while (!done) { if (!yaml_parser_parse(&(state->parser), &(state->event))) { state->done = true; return; } if (state->event.type == YAML_SCALAR_EVENT) { if (*n) { *n += 1; *list = rewballoc(*list, sizeof(char**)*(*n)); } else { *n = 1; *list = wballoc(sizeof(char**)); } (*list)[*n-1] = wb_str_value(state); } else if (state->event.type == YAML_SEQUENCE_END_EVENT) { done = true; } else error("Invalid value for a list of strings"); yaml_event_delete(&(state->event)); } }
yaml_emitter_delete(yaml_emitter_t *emitter) { assert(emitter); /* Non-NULL emitter object expected. */ BUFFER_DEL(emitter, emitter->buffer); BUFFER_DEL(emitter, emitter->raw_buffer); STACK_DEL(emitter, emitter->states); while (!QUEUE_EMPTY(emitter, emitter->events)) { yaml_event_delete(&DEQUEUE(emitter, emitter->events)); } QUEUE_DEL(emitter, emitter->events); STACK_DEL(emitter, emitter->indents); while (!STACK_EMPTY(empty, emitter->tag_directives)) { yaml_tag_directive_t tag_directive = POP(emitter, emitter->tag_directives); yaml_free(tag_directive.handle); yaml_free(tag_directive.prefix); } STACK_DEL(emitter, emitter->tag_directives); yaml_free(emitter->anchors); memset(emitter, 0, sizeof(yaml_emitter_t)); }
bool DataLoader::load(const char* name, IObject* receiver) { bool r = true; clearCurrentName(); yaml_parser_initialize(&parser); FILE *input = fopen(name, "rb"); yaml_parser_set_input_file(&parser, input); int done = 0; while (!done) { if (!yaml_parser_parse(&parser, &event)) { r = false; } if (!notify(receiver)) { r = false; } if (!r) break; done = (event.type == YAML_STREAM_END_EVENT); yaml_event_delete(&event); } yaml_parser_delete(&parser); fclose(input); return r; }
MapObject MapObject::processYaml(FILE* fh) { int debug = 0; #ifdef DEBUG debug = 0; #endif MapObject yamlMap; if (fh == NULL) { yamlMap._type = MapObject::MAP_OBJ_FAILED; if (debug) fputs("Failed to open file!\n", stderr); return yamlMap; } yaml_parser_t parser; yaml_event_t event; if (! yaml_parser_initialize(&parser)) { yamlMap._type = MapObject::MAP_OBJ_FAILED; if (debug) fputs("Failed to initialize parser!\n", stderr); return yamlMap; } yaml_parser_set_input_file(&parser, fh); hardcoreYamlProcess(&yamlMap, &parser, &event); yaml_event_delete(&event); yaml_parser_delete(&parser); fclose(fh); return yamlMap; }
YamlMapping * YamlDocument::ParseYamlMapping() { YamlMapping *ret= new YamlMapping(); int key=0; char * keyVal; yaml_event_delete(&event); do{ yaml_parser_parse(&parser, &event); switch(event.type) { case YAML_SEQUENCE_START_EVENT: { if(key == 0){ std::cerr << "Format ERROR: Invalid KEY" << std::endl; } YamlSequence *v; v=ParseYamlSequence(); ret->insertValue(keyVal, reinterpret_cast<YamlNode *>(v)); key = 0; } break; case YAML_MAPPING_START_EVENT: { if(key == 0){ std::cerr << "Format ERROR: Invalid KEY" << std::endl; return ret; } YamlMapping *v; v = ParseYamlMapping(); ret->insertValue(keyVal, reinterpret_cast<YamlNode *>(v)); key = 0; } break; case YAML_MAPPING_END_EVENT: break; case YAML_SCALAR_EVENT: if(key == 0){ keyVal = (char *)strdup((char *)event.data.scalar.value); key = 1; }else{ YamlScalar *v= new YamlScalar((char *)event.data.scalar.value); ret->insertValue(keyVal, reinterpret_cast<YamlNode *>(v)); key = 0; } break; default: break; } if(event.type != YAML_MAPPING_END_EVENT){ yaml_event_delete(&event); } }while(event.type != YAML_MAPPING_END_EVENT); yaml_event_delete(&event); return ret; }
/* * call-seq: * parser.parse(yaml) * * Parse the YAML document contained in +yaml+. Events will be called on * the handler set on the parser instance. * * See Psych::Parser and Psych::Parser#handler */ static VALUE parse(int argc, VALUE *argv, VALUE self) { VALUE yaml, path; yaml_parser_t * parser; yaml_event_t event; int done = 0; int tainted = 0; #ifdef HAVE_RUBY_ENCODING_H int encoding = rb_utf8_encindex(); rb_encoding * internal_enc = rb_default_internal_encoding(); #endif VALUE handler = rb_iv_get(self, "@handler"); if (rb_scan_args(argc, argv, "11", &yaml, &path) == 1) { if(rb_respond_to(yaml, id_path)) path = rb_funcall(yaml, id_path, 0); else path = rb_str_new2("<unknown>"); } Data_Get_Struct(self, yaml_parser_t, parser); if (OBJ_TAINTED(yaml)) tainted = 1; if(rb_respond_to(yaml, id_read)) { yaml_parser_set_input(parser, io_reader, (void *)yaml); if (RTEST(rb_obj_is_kind_of(yaml, rb_cIO))) tainted = 1; } else { StringValue(yaml); yaml_parser_set_input_string( parser, (const unsigned char *)RSTRING_PTR(yaml), (size_t)RSTRING_LEN(yaml) ); } while(!done) { if(!yaml_parser_parse(parser, &event)) { VALUE exception; exception = make_exception(parser, path); yaml_parser_delete(parser); yaml_parser_initialize(parser); rb_exc_raise(exception); } switch(event.type) { case YAML_STREAM_START_EVENT: rb_funcall(handler, id_start_stream, 1, INT2NUM((long)event.data.stream_start.encoding) ); break; case YAML_DOCUMENT_START_EVENT: { /* Get a list of tag directives (if any) */ VALUE tag_directives = rb_ary_new(); /* Grab the document version */ VALUE version = event.data.document_start.version_directive ? rb_ary_new3( (long)2, INT2NUM((long)event.data.document_start.version_directive->major), INT2NUM((long)event.data.document_start.version_directive->minor) ) : rb_ary_new(); if(event.data.document_start.tag_directives.start) { yaml_tag_directive_t *start = event.data.document_start.tag_directives.start; yaml_tag_directive_t *end = event.data.document_start.tag_directives.end; for(; start != end; start++) { VALUE handle = Qnil; VALUE prefix = Qnil; if(start->handle) { handle = rb_str_new2((const char *)start->handle); if (tainted) OBJ_TAINT(handle); #ifdef HAVE_RUBY_ENCODING_H PSYCH_TRANSCODE(handle, encoding, internal_enc); #endif } if(start->prefix) { prefix = rb_str_new2((const char *)start->prefix); if (tainted) OBJ_TAINT(prefix); #ifdef HAVE_RUBY_ENCODING_H PSYCH_TRANSCODE(prefix, encoding, internal_enc); #endif } rb_ary_push(tag_directives, rb_ary_new3((long)2, handle, prefix)); } } rb_funcall(handler, id_start_document, 3, version, tag_directives, event.data.document_start.implicit == 1 ? Qtrue : Qfalse ); } break; case YAML_DOCUMENT_END_EVENT: rb_funcall(handler, id_end_document, 1, event.data.document_end.implicit == 1 ? Qtrue : Qfalse ); break; case YAML_ALIAS_EVENT: { VALUE alias = Qnil; if(event.data.alias.anchor) { alias = rb_str_new2((const char *)event.data.alias.anchor); if (tainted) OBJ_TAINT(alias); #ifdef HAVE_RUBY_ENCODING_H PSYCH_TRANSCODE(alias, encoding, internal_enc); #endif } rb_funcall(handler, id_alias, 1, alias); } break; case YAML_SCALAR_EVENT: { VALUE anchor = Qnil; VALUE tag = Qnil; VALUE plain_implicit, quoted_implicit, style; VALUE val = rb_str_new( (const char *)event.data.scalar.value, (long)event.data.scalar.length ); if (tainted) OBJ_TAINT(val); #ifdef HAVE_RUBY_ENCODING_H PSYCH_TRANSCODE(val, encoding, internal_enc); #endif if(event.data.scalar.anchor) { anchor = rb_str_new2((const char *)event.data.scalar.anchor); if (tainted) OBJ_TAINT(anchor); #ifdef HAVE_RUBY_ENCODING_H PSYCH_TRANSCODE(anchor, encoding, internal_enc); #endif } if(event.data.scalar.tag) { tag = rb_str_new2((const char *)event.data.scalar.tag); if (tainted) OBJ_TAINT(tag); #ifdef HAVE_RUBY_ENCODING_H PSYCH_TRANSCODE(tag, encoding, internal_enc); #endif } plain_implicit = event.data.scalar.plain_implicit == 0 ? Qfalse : Qtrue; quoted_implicit = event.data.scalar.quoted_implicit == 0 ? Qfalse : Qtrue; style = INT2NUM((long)event.data.scalar.style); rb_funcall(handler, id_scalar, 6, val, anchor, tag, plain_implicit, quoted_implicit, style); } break; case YAML_SEQUENCE_START_EVENT: { VALUE anchor = Qnil; VALUE tag = Qnil; VALUE implicit, style; if(event.data.sequence_start.anchor) { anchor = rb_str_new2((const char *)event.data.sequence_start.anchor); if (tainted) OBJ_TAINT(anchor); #ifdef HAVE_RUBY_ENCODING_H PSYCH_TRANSCODE(anchor, encoding, internal_enc); #endif } tag = Qnil; if(event.data.sequence_start.tag) { tag = rb_str_new2((const char *)event.data.sequence_start.tag); if (tainted) OBJ_TAINT(tag); #ifdef HAVE_RUBY_ENCODING_H PSYCH_TRANSCODE(tag, encoding, internal_enc); #endif } implicit = event.data.sequence_start.implicit == 0 ? Qfalse : Qtrue; style = INT2NUM((long)event.data.sequence_start.style); rb_funcall(handler, id_start_sequence, 4, anchor, tag, implicit, style); } break; case YAML_SEQUENCE_END_EVENT: rb_funcall(handler, id_end_sequence, 0); break; case YAML_MAPPING_START_EVENT: { VALUE anchor = Qnil; VALUE tag = Qnil; VALUE implicit, style; if(event.data.mapping_start.anchor) { anchor = rb_str_new2((const char *)event.data.mapping_start.anchor); if (tainted) OBJ_TAINT(anchor); #ifdef HAVE_RUBY_ENCODING_H PSYCH_TRANSCODE(anchor, encoding, internal_enc); #endif } if(event.data.mapping_start.tag) { tag = rb_str_new2((const char *)event.data.mapping_start.tag); if (tainted) OBJ_TAINT(tag); #ifdef HAVE_RUBY_ENCODING_H PSYCH_TRANSCODE(tag, encoding, internal_enc); #endif } implicit = event.data.mapping_start.implicit == 0 ? Qfalse : Qtrue; style = INT2NUM((long)event.data.mapping_start.style); rb_funcall(handler, id_start_mapping, 4, anchor, tag, implicit, style); } break; case YAML_MAPPING_END_EVENT: rb_funcall(handler, id_end_mapping, 0); break; case YAML_NO_EVENT: rb_funcall(handler, id_empty, 0); break; case YAML_STREAM_END_EVENT: rb_funcall(handler, id_end_stream, 0); done = 1; break; } yaml_event_delete(&event); } return self; }
int main(int argc, char *argv[]) { int help = 0; int canonical = 0; int unicode = 0; int k; int done = 0; yaml_parser_t parser; yaml_emitter_t emitter; yaml_event_t input_event; yaml_document_t output_document; int root; /* Clear the objects. */ memset(&parser, 0, sizeof(parser)); memset(&emitter, 0, sizeof(emitter)); memset(&input_event, 0, sizeof(input_event)); memset(&output_document, 0, sizeof(output_document)); /* Analyze command line options. */ for (k = 1; k < argc; k ++) { if (strcmp(argv[k], "-h") == 0 || strcmp(argv[k], "--help") == 0) { help = 1; } else if (strcmp(argv[k], "-c") == 0 || strcmp(argv[k], "--canonical") == 0) { canonical = 1; } else if (strcmp(argv[k], "-u") == 0 || strcmp(argv[k], "--unicode") == 0) { unicode = 1; } else { fprintf(stderr, "Unrecognized option: %s\n" "Try `%s --help` for more information.\n", argv[k], argv[0]); return 1; } } /* Display the help string. */ if (help) { printf("%s <input\n" "or\n%s -h | --help\nDeconstruct a YAML stream\n\nOptions:\n" "-h, --help\t\tdisplay this help and exit\n" "-c, --canonical\t\toutput in the canonical YAML format\n" "-u, --unicode\t\toutput unescaped non-ASCII characters\n", argv[0], argv[0]); return 0; } /* Initialize the parser and emitter objects. */ if (!yaml_parser_initialize(&parser)) { fprintf(stderr, "Could not initialize the parser object\n"); return 1; } if (!yaml_emitter_initialize(&emitter)) { yaml_parser_delete(&parser); fprintf(stderr, "Could not inialize the emitter object\n"); return 1; } /* Set the parser parameters. */ yaml_parser_set_input_file(&parser, stdin); /* Set the emitter parameters. */ yaml_emitter_set_output_file(&emitter, stdout); yaml_emitter_set_canonical(&emitter, canonical); yaml_emitter_set_unicode(&emitter, unicode); /* Create and emit the STREAM-START event. */ if (!yaml_emitter_open(&emitter)) goto emitter_error; /* Create a output_document object. */ if (!yaml_document_initialize(&output_document, NULL, NULL, NULL, 0, 0)) goto document_error; /* Create the root sequence. */ root = yaml_document_add_sequence(&output_document, NULL, YAML_BLOCK_SEQUENCE_STYLE); if (!root) goto document_error; /* Loop through the input events. */ while (!done) { int properties, key, value, map, seq; /* Get the next event. */ if (!yaml_parser_parse(&parser, &input_event)) goto parser_error; /* Check if this is the stream end. */ if (input_event.type == YAML_STREAM_END_EVENT) { done = 1; } /* Create a mapping node and attach it to the root sequence. */ properties = yaml_document_add_mapping(&output_document, NULL, YAML_BLOCK_MAPPING_STYLE); if (!properties) goto document_error; if (!yaml_document_append_sequence_item(&output_document, root, properties)) goto document_error; /* Analyze the event. */ switch (input_event.type) { case YAML_STREAM_START_EVENT: /* Add 'type': 'STREAM-START'. */ key = yaml_document_add_scalar(&output_document, NULL, "type", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, "STREAM-START", -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; /* Add 'encoding': <encoding>. */ if (input_event.data.stream_start.encoding) { yaml_encoding_t encoding = input_event.data.stream_start.encoding; key = yaml_document_add_scalar(&output_document, NULL, "encoding", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, (encoding == YAML_UTF8_ENCODING ? "utf-8" : encoding == YAML_UTF16LE_ENCODING ? "utf-16-le" : encoding == YAML_UTF16BE_ENCODING ? "utf-16-be" : "unknown"), -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; } break; case YAML_STREAM_END_EVENT: /* Add 'type': 'STREAM-END'. */ key = yaml_document_add_scalar(&output_document, NULL, "type", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, "STREAM-END", -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; break; case YAML_DOCUMENT_START_EVENT: /* Add 'type': 'DOCUMENT-START'. */ key = yaml_document_add_scalar(&output_document, NULL, "type", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, "DOCUMENT-START", -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; /* Display the output_document version numbers. */ if (input_event.data.document_start.version_directive) { yaml_version_directive_t *version = input_event.data.document_start.version_directive; char number[64]; /* Add 'version': {}. */ key = yaml_document_add_scalar(&output_document, NULL, "version", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; map = yaml_document_add_mapping(&output_document, NULL, YAML_FLOW_MAPPING_STYLE); if (!map) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, map)) goto document_error; /* Add 'major': <number>. */ key = yaml_document_add_scalar(&output_document, NULL, "major", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; sprintf(number, "%d", version->major); value = yaml_document_add_scalar(&output_document, YAML_INT_TAG, number, -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, map, key, value)) goto document_error; /* Add 'minor': <number>. */ key = yaml_document_add_scalar(&output_document, NULL, "minor", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; sprintf(number, "%d", version->minor); value = yaml_document_add_scalar(&output_document, YAML_INT_TAG, number, -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, map, key, value)) goto document_error; } /* Display the output_document tag directives. */ if (input_event.data.document_start.tag_directives.start != input_event.data.document_start.tag_directives.end) { yaml_tag_directive_t *tag; /* Add 'tags': []. */ key = yaml_document_add_scalar(&output_document, NULL, "tags", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; seq = yaml_document_add_sequence(&output_document, NULL, YAML_BLOCK_SEQUENCE_STYLE); if (!seq) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, seq)) goto document_error; for (tag = input_event.data.document_start.tag_directives.start; tag != input_event.data.document_start.tag_directives.end; tag ++) { /* Add {}. */ map = yaml_document_add_mapping(&output_document, NULL, YAML_FLOW_MAPPING_STYLE); if (!map) goto document_error; if (!yaml_document_append_sequence_item(&output_document, seq, map)) goto document_error; /* Add 'handle': <handle>. */ key = yaml_document_add_scalar(&output_document, NULL, "handle", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, tag->handle, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, map, key, value)) goto document_error; /* Add 'prefix': <prefix>. */ key = yaml_document_add_scalar(&output_document, NULL, "prefix", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, tag->prefix, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, map, key, value)) goto document_error; } } /* Add 'implicit': <flag>. */ key = yaml_document_add_scalar(&output_document, NULL, "implicit", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, YAML_BOOL_TAG, (input_event.data.document_start.implicit ? "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; break; case YAML_DOCUMENT_END_EVENT: /* Add 'type': 'DOCUMENT-END'. */ key = yaml_document_add_scalar(&output_document, NULL, "type", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, "DOCUMENT-END", -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; /* Add 'implicit': <flag>. */ key = yaml_document_add_scalar(&output_document, NULL, "implicit", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, YAML_BOOL_TAG, (input_event.data.document_end.implicit ? "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; break; case YAML_ALIAS_EVENT: /* Add 'type': 'ALIAS'. */ key = yaml_document_add_scalar(&output_document, NULL, "type", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, "ALIAS", -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; /* Add 'anchor': <anchor>. */ key = yaml_document_add_scalar(&output_document, NULL, "anchor", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, input_event.data.alias.anchor, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; break; case YAML_SCALAR_EVENT: /* Add 'type': 'SCALAR'. */ key = yaml_document_add_scalar(&output_document, NULL, "type", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, "SCALAR", -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; /* Add 'anchor': <anchor>. */ if (input_event.data.scalar.anchor) { key = yaml_document_add_scalar(&output_document, NULL, "anchor", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, input_event.data.scalar.anchor, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; } /* Add 'tag': <tag>. */ if (input_event.data.scalar.tag) { key = yaml_document_add_scalar(&output_document, NULL, "tag", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, input_event.data.scalar.tag, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; } /* Add 'value': <value>. */ key = yaml_document_add_scalar(&output_document, NULL, "value", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, input_event.data.scalar.value, input_event.data.scalar.length, YAML_DOUBLE_QUOTED_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; /* Display if the scalar tag is implicit. */ /* Add 'implicit': {} */ key = yaml_document_add_scalar(&output_document, NULL, "version", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; map = yaml_document_add_mapping(&output_document, NULL, YAML_FLOW_MAPPING_STYLE); if (!map) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, map)) goto document_error; /* Add 'plain': <flag>. */ key = yaml_document_add_scalar(&output_document, NULL, "plain", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, YAML_BOOL_TAG, (input_event.data.scalar.plain_implicit ? "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, map, key, value)) goto document_error; /* Add 'quoted': <flag>. */ key = yaml_document_add_scalar(&output_document, NULL, "quoted", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, YAML_BOOL_TAG, (input_event.data.scalar.quoted_implicit ? "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, map, key, value)) goto document_error; /* Display the style information. */ if (input_event.data.scalar.style) { yaml_scalar_style_t style = input_event.data.scalar.style; /* Add 'style': <style>. */ key = yaml_document_add_scalar(&output_document, NULL, "style", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, (style == YAML_PLAIN_SCALAR_STYLE ? "plain" : style == YAML_SINGLE_QUOTED_SCALAR_STYLE ? "single-quoted" : style == YAML_DOUBLE_QUOTED_SCALAR_STYLE ? "double-quoted" : style == YAML_LITERAL_SCALAR_STYLE ? "literal" : style == YAML_FOLDED_SCALAR_STYLE ? "folded" : "unknown"), -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; } break; case YAML_SEQUENCE_START_EVENT: /* Add 'type': 'SEQUENCE-START'. */ key = yaml_document_add_scalar(&output_document, NULL, "type", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, "SEQUENCE-START", -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; /* Add 'anchor': <anchor>. */ if (input_event.data.sequence_start.anchor) { key = yaml_document_add_scalar(&output_document, NULL, "anchor", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, input_event.data.sequence_start.anchor, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; } /* Add 'tag': <tag>. */ if (input_event.data.sequence_start.tag) { key = yaml_document_add_scalar(&output_document, NULL, "tag", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, input_event.data.sequence_start.tag, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; } /* Add 'implicit': <flag>. */ key = yaml_document_add_scalar(&output_document, NULL, "implicit", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, YAML_BOOL_TAG, (input_event.data.sequence_start.implicit ? "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; /* Display the style information. */ if (input_event.data.sequence_start.style) { yaml_sequence_style_t style = input_event.data.sequence_start.style; /* Add 'style': <style>. */ key = yaml_document_add_scalar(&output_document, NULL, "style", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, (style == YAML_BLOCK_SEQUENCE_STYLE ? "block" : style == YAML_FLOW_SEQUENCE_STYLE ? "flow" : "unknown"), -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; } break; case YAML_SEQUENCE_END_EVENT: /* Add 'type': 'SEQUENCE-END'. */ key = yaml_document_add_scalar(&output_document, NULL, "type", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, "SEQUENCE-END", -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; break; case YAML_MAPPING_START_EVENT: /* Add 'type': 'MAPPING-START'. */ key = yaml_document_add_scalar(&output_document, NULL, "type", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, "MAPPING-START", -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; /* Add 'anchor': <anchor>. */ if (input_event.data.mapping_start.anchor) { key = yaml_document_add_scalar(&output_document, NULL, "anchor", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, input_event.data.mapping_start.anchor, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; } /* Add 'tag': <tag>. */ if (input_event.data.mapping_start.tag) { key = yaml_document_add_scalar(&output_document, NULL, "tag", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, input_event.data.mapping_start.tag, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; } /* Add 'implicit': <flag>. */ key = yaml_document_add_scalar(&output_document, NULL, "implicit", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, YAML_BOOL_TAG, (input_event.data.mapping_start.implicit ? "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; /* Display the style information. */ if (input_event.data.sequence_start.style) { yaml_sequence_style_t style = input_event.data.mapping_start.style; /* Add 'style': <style>. */ key = yaml_document_add_scalar(&output_document, NULL, "style", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, (style == YAML_BLOCK_MAPPING_STYLE ? "block" : style == YAML_FLOW_MAPPING_STYLE ? "flow" : "unknown"), -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; } break; case YAML_MAPPING_END_EVENT: /* Add 'type': 'MAPPING-END'. */ key = yaml_document_add_scalar(&output_document, NULL, "type", -1, YAML_PLAIN_SCALAR_STYLE); if (!key) goto document_error; value = yaml_document_add_scalar(&output_document, NULL, "MAPPING-END", -1, YAML_PLAIN_SCALAR_STYLE); if (!value) goto document_error; if (!yaml_document_append_mapping_pair(&output_document, properties, key, value)) goto document_error; break; default: /* It couldn't really happen. */ break; } /* Delete the event object. */ yaml_event_delete(&input_event); } if (!yaml_emitter_dump(&emitter, &output_document)) goto emitter_error; if (!yaml_emitter_close(&emitter)) goto emitter_error; yaml_parser_delete(&parser); yaml_emitter_delete(&emitter); return 0; parser_error: /* Display a parser error message. */ switch (parser.error) { case YAML_MEMORY_ERROR: fprintf(stderr, "Memory error: Not enough memory for parsing\n"); break; case YAML_READER_ERROR: if (parser.problem_value != -1) { fprintf(stderr, "Reader error: %s: #%X at %zd\n", parser.problem, parser.problem_value, parser.problem_offset); } else { fprintf(stderr, "Reader error: %s at %zd\n", parser.problem, parser.problem_offset); } break; case YAML_SCANNER_ERROR: if (parser.context) { fprintf(stderr, "Scanner error: %s at line %lu, column %lu\n" "%s at line %lu, column %lu\n", parser.context, parser.context_mark.line+1, parser.context_mark.column+1, parser.problem, parser.problem_mark.line+1, parser.problem_mark.column+1); } else { fprintf(stderr, "Scanner error: %s at line %lu, column %lu\n", parser.problem, parser.problem_mark.line+1, parser.problem_mark.column+1); } break; case YAML_PARSER_ERROR: if (parser.context) { fprintf(stderr, "Parser error: %s at line %lu, column %lu\n" "%s at line %lu, column %lu\n", parser.context, parser.context_mark.line+1, parser.context_mark.column+1, parser.problem, parser.problem_mark.line+1, parser.problem_mark.column+1); } else { fprintf(stderr, "Parser error: %s at line %lu, column %lu\n", parser.problem, parser.problem_mark.line+1, parser.problem_mark.column+1); } break; default: /* Couldn't happen. */ fprintf(stderr, "Internal error\n"); break; } yaml_event_delete(&input_event); yaml_document_delete(&output_document); yaml_parser_delete(&parser); yaml_emitter_delete(&emitter); return 1; emitter_error: /* Display an emitter error message. */ switch (emitter.error) { case YAML_MEMORY_ERROR: fprintf(stderr, "Memory error: Not enough memory for emitting\n"); break; case YAML_WRITER_ERROR: fprintf(stderr, "Writer error: %s\n", emitter.problem); break; case YAML_EMITTER_ERROR: fprintf(stderr, "Emitter error: %s\n", emitter.problem); break; default: /* Couldn't happen. */ fprintf(stderr, "Internal error\n"); break; } yaml_event_delete(&input_event); yaml_document_delete(&output_document); yaml_parser_delete(&parser); yaml_emitter_delete(&emitter); return 1; document_error: fprintf(stderr, "Memory error: Not enough memory for creating a document\n"); yaml_event_delete(&input_event); yaml_document_delete(&output_document); yaml_parser_delete(&parser); yaml_emitter_delete(&emitter); return 1; }
int main(int argc, char *argv[]) { int help = 0; int canonical = 0; int unicode = 0; int k; int done = 0; yaml_parser_t parser; yaml_emitter_t emitter; yaml_event_t input_event; yaml_event_t output_event; /* Clear the objects. */ memset(&parser, 0, sizeof(parser)); memset(&emitter, 0, sizeof(emitter)); memset(&input_event, 0, sizeof(input_event)); memset(&output_event, 0, sizeof(output_event)); /* Analyze command line options. */ for (k = 1; k < argc; k ++) { if (strcmp(argv[k], "-h") == 0 || strcmp(argv[k], "--help") == 0) { help = 1; } else if (strcmp(argv[k], "-c") == 0 || strcmp(argv[k], "--canonical") == 0) { canonical = 1; } else if (strcmp(argv[k], "-u") == 0 || strcmp(argv[k], "--unicode") == 0) { unicode = 1; } else { fprintf(stderr, "Unrecognized option: %s\n" "Try `%s --help` for more information.\n", argv[k], argv[0]); return 1; } } /* Display the help string. */ if (help) { printf("%s <input\n" "or\n%s -h | --help\nDeconstruct a YAML stream\n\nOptions:\n" "-h, --help\t\tdisplay this help and exit\n" "-c, --canonical\t\toutput in the canonical YAML format\n" "-u, --unicode\t\toutput unescaped non-ASCII characters\n", argv[0], argv[0]); return 0; } /* Initialize the parser and emitter objects. */ if (!yaml_parser_initialize(&parser)) { fprintf(stderr, "Could not initialize the parser object\n"); return 1; } if (!yaml_emitter_initialize(&emitter)) { yaml_parser_delete(&parser); fprintf(stderr, "Could not inialize the emitter object\n"); return 1; } /* Set the parser parameters. */ yaml_parser_set_input_file(&parser, stdin); /* Set the emitter parameters. */ yaml_emitter_set_output_file(&emitter, stdout); yaml_emitter_set_canonical(&emitter, canonical); yaml_emitter_set_unicode(&emitter, unicode); /* Create and emit the STREAM-START event. */ if (!yaml_stream_start_event_initialize(&output_event, YAML_UTF8_ENCODING)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Create and emit the DOCUMENT-START event. */ if (!yaml_document_start_event_initialize(&output_event, NULL, NULL, NULL, 0)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Create and emit the SEQUENCE-START event. */ if (!yaml_sequence_start_event_initialize(&output_event, NULL, "tag:yaml.org,2002:seq", 1, YAML_BLOCK_SEQUENCE_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Loop through the input events. */ while (!done) { /* Get the next event. */ if (!yaml_parser_parse(&parser, &input_event)) goto parser_error; /* Check if this is the stream end. */ if (input_event.type == YAML_STREAM_END_EVENT) { done = 1; } /* Create and emit a MAPPING-START event. */ if (!yaml_mapping_start_event_initialize(&output_event, NULL, "tag:yaml.org,2002:map", 1, YAML_BLOCK_MAPPING_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Analyze the event. */ switch (input_event.type) { case YAML_STREAM_START_EVENT: /* Write 'type'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "type", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'STREAM-START'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "STREAM-START", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Display encoding information. */ if (input_event.data.stream_start.encoding) { yaml_encoding_t encoding = input_event.data.stream_start.encoding; /* Write 'encoding'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "encoding", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write the stream encoding. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", (encoding == YAML_UTF8_ENCODING ? "utf-8" : encoding == YAML_UTF16LE_ENCODING ? "utf-16-le" : encoding == YAML_UTF16BE_ENCODING ? "utf-16-be" : "unknown"), -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; } break; case YAML_STREAM_END_EVENT: /* Write 'type'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "type", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'STREAM-END'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "STREAM-END", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; break; case YAML_DOCUMENT_START_EVENT: /* Write 'type'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "type", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'DOCUMENT-START'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "DOCUMENT-START", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Display the document version numbers. */ if (input_event.data.document_start.version_directive) { yaml_version_directive_t *version = input_event.data.document_start.version_directive; char number[64]; /* Write 'version'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "version", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write '{'. */ if (!yaml_mapping_start_event_initialize(&output_event, NULL, "tag:yaml.org,2002:map", 1, YAML_FLOW_MAPPING_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'major'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "major", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write a number. */ sprintf(number, "%d", version->major); if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:int", number, -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'minor'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "minor", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write a number. */ sprintf(number, "%d", version->minor); if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:int", number, -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write '}'. */ if (!yaml_mapping_end_event_initialize(&output_event)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; } /* Display the document tag directives. */ if (input_event.data.document_start.tag_directives.start != input_event.data.document_start.tag_directives.end) { yaml_tag_directive_t *tag; /* Write 'tags'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "tags", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Start a block sequence. */ if (!yaml_sequence_start_event_initialize(&output_event, NULL, "tag:yaml.org,2002:seq", 1, YAML_BLOCK_SEQUENCE_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; for (tag = input_event.data.document_start.tag_directives.start; tag != input_event.data.document_start.tag_directives.end; tag ++) { /* Write '{'. */ if (!yaml_mapping_start_event_initialize(&output_event, NULL, "tag:yaml.org,2002:map", 1, YAML_FLOW_MAPPING_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'handle'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "handle", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write the tag directive handle. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", tag->handle, -1, 0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'prefix'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "prefix", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write the tag directive prefix. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", tag->prefix, -1, 0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write '}'. */ if (!yaml_mapping_end_event_initialize(&output_event)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; } /* End a block sequence. */ if (!yaml_sequence_end_event_initialize(&output_event)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; } /* Write 'implicit'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "implicit", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write if the document is implicit. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:bool", (input_event.data.document_start.implicit ? "true" : "false"), -1, 1, 0, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; break; case YAML_DOCUMENT_END_EVENT: /* Write 'type'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "type", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'DOCUMENT-END'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "DOCUMENT-END", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'implicit'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "implicit", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write if the document is implicit. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:bool", (input_event.data.document_end.implicit ? "true" : "false"), -1, 1, 0, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; break; case YAML_ALIAS_EVENT: /* Write 'type'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "type", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'ALIAS'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "ALIAS", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'anchor'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "anchor", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write the alias anchor. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", input_event.data.alias.anchor, -1, 0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; break; case YAML_SCALAR_EVENT: /* Write 'type'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "type", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'SCALAR'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "SCALAR", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Display the scalar anchor. */ if (input_event.data.scalar.anchor) { /* Write 'anchor'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "anchor", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write the scalar anchor. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", input_event.data.scalar.anchor, -1, 0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; } /* Display the scalar tag. */ if (input_event.data.scalar.tag) { /* Write 'tag'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "tag", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write the scalar tag. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", input_event.data.scalar.tag, -1, 0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; } /* Display the scalar value. */ /* Write 'value'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "value", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write the scalar value. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", input_event.data.scalar.value, input_event.data.scalar.length, 0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Display if the scalar tag is implicit. */ /* Write 'implicit'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "implicit", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write '{'. */ if (!yaml_mapping_start_event_initialize(&output_event, NULL, "tag:yaml.org,2002:map", 1, YAML_FLOW_MAPPING_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'plain'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "plain", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write if the scalar is implicit in the plain style. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:bool", (input_event.data.scalar.plain_implicit ? "true" : "false"), -1, 1, 0, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'quoted'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "non-plain", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write if the scalar is implicit in a non-plain style. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:bool", (input_event.data.scalar.quoted_implicit ? "true" : "false"), -1, 1, 0, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write '}'. */ if (!yaml_mapping_end_event_initialize(&output_event)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Display the style information. */ if (input_event.data.scalar.style) { yaml_scalar_style_t style = input_event.data.scalar.style; /* Write 'style'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "style", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write the scalar style. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", (style == YAML_PLAIN_SCALAR_STYLE ? "plain" : style == YAML_SINGLE_QUOTED_SCALAR_STYLE ? "single-quoted" : style == YAML_DOUBLE_QUOTED_SCALAR_STYLE ? "double-quoted" : style == YAML_LITERAL_SCALAR_STYLE ? "literal" : style == YAML_FOLDED_SCALAR_STYLE ? "folded" : "unknown"), -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; } break; case YAML_SEQUENCE_START_EVENT: /* Write 'type'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "type", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'SEQUENCE-START'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "SEQUENCE-START", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Display the sequence anchor. */ if (input_event.data.sequence_start.anchor) { /* Write 'anchor'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "anchor", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write the sequence anchor. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", input_event.data.sequence_start.anchor, -1, 0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; } /* Display the sequence tag. */ if (input_event.data.sequence_start.tag) { /* Write 'tag'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "tag", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write the sequence tag. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", input_event.data.sequence_start.tag, -1, 0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; } /* Write 'implicit'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "implicit", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write if the sequence tag is implicit. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:bool", (input_event.data.sequence_start.implicit ? "true" : "false"), -1, 1, 0, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Display the style information. */ if (input_event.data.sequence_start.style) { yaml_sequence_style_t style = input_event.data.sequence_start.style; /* Write 'style'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "style", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write the scalar style. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", (style == YAML_BLOCK_SEQUENCE_STYLE ? "block" : style == YAML_FLOW_SEQUENCE_STYLE ? "flow" : "unknown"), -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; } break; case YAML_SEQUENCE_END_EVENT: /* Write 'type'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "type", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'SEQUENCE-END'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "SEQUENCE-END", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; break; case YAML_MAPPING_START_EVENT: /* Write 'type'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "type", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'MAPPING-START'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "MAPPING-START", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Display the mapping anchor. */ if (input_event.data.mapping_start.anchor) { /* Write 'anchor'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "anchor", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write the mapping anchor. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", input_event.data.mapping_start.anchor, -1, 0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; } /* Display the mapping tag. */ if (input_event.data.mapping_start.tag) { /* Write 'tag'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "tag", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write the mapping tag. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", input_event.data.mapping_start.tag, -1, 0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; } /* Write 'implicit'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "implicit", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write if the mapping tag is implicit. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:bool", (input_event.data.mapping_start.implicit ? "true" : "false"), -1, 1, 0, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Display the style information. */ if (input_event.data.mapping_start.style) { yaml_mapping_style_t style = input_event.data.mapping_start.style; /* Write 'style'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "style", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write the scalar style. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", (style == YAML_BLOCK_MAPPING_STYLE ? "block" : style == YAML_FLOW_MAPPING_STYLE ? "flow" : "unknown"), -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; } break; case YAML_MAPPING_END_EVENT: /* Write 'type'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "type", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Write 'MAPPING-END'. */ if (!yaml_scalar_event_initialize(&output_event, NULL, "tag:yaml.org,2002:str", "MAPPING-END", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; break; default: /* It couldn't really happen. */ break; } /* Delete the event object. */ yaml_event_delete(&input_event); /* Create and emit a MAPPING-END event. */ if (!yaml_mapping_end_event_initialize(&output_event)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; } /* Create and emit the SEQUENCE-END event. */ if (!yaml_sequence_end_event_initialize(&output_event)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Create and emit the DOCUMENT-END event. */ if (!yaml_document_end_event_initialize(&output_event, 0)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; /* Create and emit the STREAM-END event. */ if (!yaml_stream_end_event_initialize(&output_event)) goto event_error; if (!yaml_emitter_emit(&emitter, &output_event)) goto emitter_error; yaml_parser_delete(&parser); yaml_emitter_delete(&emitter); return 0; parser_error: /* Display a parser error message. */ switch (parser.error) { case YAML_MEMORY_ERROR: fprintf(stderr, "Memory error: Not enough memory for parsing\n"); break; case YAML_READER_ERROR: if (parser.problem_value != -1) { fprintf(stderr, "Reader error: %s: #%X at %d\n", parser.problem, parser.problem_value, parser.problem_offset); } else { fprintf(stderr, "Reader error: %s at %d\n", parser.problem, parser.problem_offset); } break; case YAML_SCANNER_ERROR: if (parser.context) { fprintf(stderr, "Scanner error: %s at line %d, column %d\n" "%s at line %d, column %d\n", parser.context, parser.context_mark.line+1, parser.context_mark.column+1, parser.problem, parser.problem_mark.line+1, parser.problem_mark.column+1); } else { fprintf(stderr, "Scanner error: %s at line %d, column %d\n", parser.problem, parser.problem_mark.line+1, parser.problem_mark.column+1); } break; case YAML_PARSER_ERROR: if (parser.context) { fprintf(stderr, "Parser error: %s at line %d, column %d\n" "%s at line %d, column %d\n", parser.context, parser.context_mark.line+1, parser.context_mark.column+1, parser.problem, parser.problem_mark.line+1, parser.problem_mark.column+1); } else { fprintf(stderr, "Parser error: %s at line %d, column %d\n", parser.problem, parser.problem_mark.line+1, parser.problem_mark.column+1); } break; default: /* Couldn't happen. */ fprintf(stderr, "Internal error\n"); break; } yaml_event_delete(&input_event); yaml_event_delete(&output_event); yaml_parser_delete(&parser); yaml_emitter_delete(&emitter); return 1; emitter_error: /* Display an emitter error message. */ switch (emitter.error) { case YAML_MEMORY_ERROR: fprintf(stderr, "Memory error: Not enough memory for emitting\n"); break; case YAML_WRITER_ERROR: fprintf(stderr, "Writer error: %s\n", emitter.problem); break; case YAML_EMITTER_ERROR: fprintf(stderr, "Emitter error: %s\n", emitter.problem); break; default: /* Couldn't happen. */ fprintf(stderr, "Internal error\n"); break; } yaml_event_delete(&input_event); yaml_event_delete(&output_event); yaml_parser_delete(&parser); yaml_emitter_delete(&emitter); return 1; event_error: fprintf(stderr, "Memory error: Not enough memory for creating an event\n"); yaml_event_delete(&input_event); yaml_event_delete(&output_event); yaml_parser_delete(&parser); yaml_emitter_delete(&emitter); return 1; }
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; }
static bool cloud_config_parse(yaml_parser_t *parser, GNode *node, int state) { GNode *last_leaf = node; yaml_event_t event; bool finished = 0; while (!finished) { if (!yaml_parser_parse(parser, &event)) { LOG("An error occurred while the yaml file was parsed.\n"); return false; } switch (event.type) { case YAML_SCALAR_EVENT: if (state & SEQ) { last_leaf = g_node_append(node, g_node_new(g_strdup((gchar*) event.data.scalar.value))); } else if (state & VAL) { g_node_append_data(last_leaf, g_strdup((gchar*) event.data.scalar.value)); state &= MAP | SEQ; } else { last_leaf = g_node_append(node, g_node_new(g_strdup((gchar*) event.data.scalar.value))); state |= VAL; } break; case YAML_SEQUENCE_START_EVENT: /* remove VAL bit if it's set */ if (state & MAP) state = MAP; if (state & SEQ) { last_leaf = g_node_append(node, g_node_new(NULL)); } else { last_leaf = g_node_append(last_leaf, g_node_new(NULL)); } if (!cloud_config_parse(parser, last_leaf, SEQ)) { return false; } last_leaf = last_leaf->parent; break; case YAML_SEQUENCE_END_EVENT: finished = true; break; case YAML_MAPPING_START_EVENT: last_leaf = g_node_append(node, g_node_new(NULL)); if (!cloud_config_parse(parser, last_leaf, MAP)) { return false; } last_leaf = last_leaf->parent; break; case YAML_MAPPING_END_EVENT: last_leaf = last_leaf->parent; finished = true; break; case YAML_STREAM_END_EVENT: finished = true; break; case YAML_NO_TOKEN: LOG("Unexpectedly reached end of YAML input!"); finished = true; break; default: /* Ignore these for now */ break; } if (!finished) { yaml_event_delete(&event); } } return true; }
void Load_All_AI(Player* players, const char* filename, int* ai_indices) { // append path to front of filename. char newfilename[512]; sprintf(newfilename, "%s%s",g_DataPath, filename); FILE* fp = fopen(newfilename, "r"); if (!fp) SYS_Error("Error loading AI\n"); // pre allocate the maximum number of characters character_type* ais = (character_type*)malloc(sizeof(character_type) * MAX_AIS); memset(ais, 0, sizeof(character_type) * MAX_AIS); // open the YAML file yaml_parser_t parser; yaml_parser_initialize(&parser); yaml_parser_set_input_file(&parser, fp); // NOTE: YAML file is expected to contain a sequence of maps. // One map per character. int done = 0; int ai_index = 0; char key[128]; bool read_key = false; while (!done) { yaml_event_t event; // get the next event if (!yaml_parser_parse(&parser, &event)) { SYS_Error("error parsing YAML file \"%s\"\n", newfilename); return; } // process the event switch (event.type) { case YAML_MAPPING_START_EVENT: read_key = true; break; case YAML_SCALAR_EVENT: if (read_key) strcpy(key, (char*)event.data.scalar.value); else Character_Set(&ais[ai_index], key, (char*)event.data.scalar.value); read_key = !read_key; break; case YAML_MAPPING_END_EVENT: assert(ai_index < MAX_AIS); // too many ais in yaml file. ai_index++; break; case YAML_NO_EVENT: case YAML_STREAM_START_EVENT: case YAML_STREAM_END_EVENT: case YAML_DOCUMENT_START_EVENT: case YAML_DOCUMENT_END_EVENT: case YAML_ALIAS_EVENT: case YAML_SEQUENCE_START_EVENT: case YAML_SEQUENCE_END_EVENT: default: break; } done = (event.type == YAML_STREAM_END_EVENT); yaml_event_delete(&event); } yaml_parser_delete(&parser); // load each player's sound fx. for (int i = 0; i < 6; ++i) { character_type* c = &players[i].character; memcpy(c, &ais[ai_indices[i]], sizeof(character_type)); for (int j = 0; j < NUMBER_CHARACTER_SOUNDS; ++j) c->samples[j] = SYS_LoadSound(c->sample_filenames[j]); } free(ais); }
void MapObject::hardcoreYamlProcess(MapObject* yamlMap, yaml_parser_t *parser, yaml_event_t *event) { int debug = 0; #ifdef DEBUG debug = 0; #endif std::stack<MapObject*> stack; std::string lastKey; int done = 0; do { yaml_parser_parse(parser, event); MapObject newMapObj; switch (event->type) { case YAML_NO_EVENT: if (debug) puts("No event!"); done = 1; break; /* Stream start/end */ case YAML_STREAM_START_EVENT: if (debug) puts("STREAM START"); break; case YAML_STREAM_END_EVENT: if (debug) puts("STREAM END"); break; /* Block delimeters */ case YAML_DOCUMENT_START_EVENT: if (debug) puts("<b>Start Document</b>"); stack.push(yamlMap); break; case YAML_DOCUMENT_END_EVENT: if (debug) puts("<b>End Document</b>"); if (stack.top()->mapPtr->nextIsKey) { stack.top()->value = stack.top()->mapPtr->keys.front(); stack.top()->mapPtr->keys.pop_back(); } stack.pop(); break; case YAML_SEQUENCE_START_EVENT: if (debug) puts("<b>Start Sequence</b>"); if (stack.top()->mapPtr->keys.size() && stack.top()->mapPtr->nextIsKey) { lastKey = stack.top()->mapPtr->keys.back(); stack.top()->mapPtr->map[lastKey] = newMapObj; stack.top()->mapPtr->nextIsKey = false; stack.push(&stack.top()->mapPtr->map[lastKey]); } else if (stack.top()->_type == MAP_OBJ_VECTOR) { stack.top()->mapObjects.push_back(newMapObj); stack.push(&stack.top()->mapObjects.back()); } else stack.push(stack.top()); if (event->data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE) stack.top()->flow = true; stack.top()->_type = MAP_OBJ_VECTOR; break; case YAML_SEQUENCE_END_EVENT: if (debug) puts("<b>End Sequence</b>"); stack.pop(); break; case YAML_MAPPING_START_EVENT: if (debug) puts("<b>Start Mapping</b>"); if (stack.top()->mapPtr->keys.size() && stack.top()->mapPtr->nextIsKey) stack.push(&stack.top()->mapPtr->map[stack.top()->mapPtr->keys.back()]); else if (stack.top()->_type == MAP_OBJ_VECTOR) { stack.top()->mapObjects.push_back(newMapObj); stack.push(&stack.top()->mapObjects.back()); } else { stack.push(stack.top()); } if (event->data.mapping_start.style == YAML_FLOW_MAPPING_STYLE) stack.top()->mapPtr->flow = true; stack.top()->_type = MAP_OBJ_MAP; break; case YAML_MAPPING_END_EVENT: if (debug) puts("<b>End Mapping</b>"); if (stack.top()->mapPtr->keys.size()) { stack.top()->mapPtr->keys.erase(std::unique(stack.top()->mapPtr->keys.begin(), stack.top()->mapPtr->keys.end()), stack.top()->mapPtr->keys.end()); } stack.pop(); if (! stack.empty() && stack.top()->_type == MAP_OBJ_MAP) { stack.top()->mapPtr->nextIsKey = false; } break; /* Data */ case YAML_ALIAS_EVENT: if (debug) printf("Got alias (anchor %s)\n", event->data.alias.anchor); break; case YAML_SCALAR_EVENT: if (debug) printf("Got scalar (value %s)\n", event->data.scalar.value); if (stack.top()->_type == MAP_OBJ_MAP && ! stack.top()->mapPtr->nextIsKey) { stack.top()->mapPtr->keys.push_back(((char*) event->data.scalar.value)); stack.top()->mapPtr->nextIsKey = true; } else if (stack.top()->_type == MAP_OBJ_MAP && stack.top()->mapPtr->nextIsKey) { stack.top()->mapPtr->map[stack.top()->mapPtr->keys.back()] = newMapObj; stack.top()->mapPtr->map[stack.top()->mapPtr->keys.back()].value = ((char*) event->data.scalar.value); stack.top()->mapPtr->nextIsKey = false; } else if (stack.top()->_type == MAP_OBJ_VECTOR) { stack.top()->mapObjects.push_back(newMapObj); stack.top()->mapObjects.back().value = ((char*) event->data.scalar.value); } else { stack.top()->value = ((char*) event->data.scalar.value); stack.top()->_type = MAP_OBJ_VALUE; } break; } if (event->type == YAML_DOCUMENT_END_EVENT) done = 1; yaml_event_delete(event); } while (! done); yaml_parser_delete(parser); }
struct config* parse_config(FILE *input) { struct config *config = malloc(sizeof(struct config)); if (config == NULL) { stats_error_log("malloc() error"); return NULL; } init_proto_config(&config->carbon_config); if (config->carbon_config.ring == NULL) { stats_error_log("failed to allocate ring"); free(config); return NULL; } config->carbon_config.bind = strdup("127.0.0.1:2003"); init_proto_config(&config->statsd_config); config->statsd_config.bind = strdup("127.0.0.1:8125"); yaml_parser_t parser; yaml_event_t event; if (!yaml_parser_initialize(&parser)) { stats_log("failed to initialize yaml parser"); goto parse_err; } yaml_parser_set_input_file(&parser, input); struct proto_config *protoc = NULL; char *strval; long numval; int shard_count = -1; int map_nesting = 0; bool in_document = false; bool keep_going = true; bool is_key = false; bool update_bind = false; bool update_send_queue = false; bool update_validate = false; bool update_tcp_cork = false; bool always_resolve_dns = false; bool expect_shard_map = false; while (keep_going) { if (!yaml_parser_parse(&parser, &event)) { goto parse_err; } switch(event.type) { case YAML_NO_EVENT: case YAML_STREAM_START_EVENT: break; // nothing to do case YAML_STREAM_END_EVENT: keep_going = false; break; case YAML_DOCUMENT_START_EVENT: if (in_document) { stats_error_log("config should not have nested documents"); goto parse_err; } in_document = true; break; case YAML_DOCUMENT_END_EVENT: in_document = false; break; case YAML_SEQUENCE_START_EVENT: case YAML_SEQUENCE_END_EVENT: stats_error_log("unexpectedly got sequence"); goto parse_err; break; case YAML_MAPPING_START_EVENT: is_key = true; map_nesting++; break; case YAML_MAPPING_END_EVENT: map_nesting--; break; case YAML_ALIAS_EVENT: stats_error_log("don't know how to handle yaml aliases"); goto parse_err; break; case YAML_SCALAR_EVENT: strval = (char *) event.data.scalar.value; switch (map_nesting) { case 0: stats_error_log("unexpectedly got scalar outside of a map"); goto parse_err; break; case 1: if (strcmp(strval, "carbon") == 0) { protoc = &config->carbon_config; config->carbon_config.initialized = true; } else if (strcmp(strval, "statsd") == 0) { protoc = &config->statsd_config; config->statsd_config.initialized = true; } else { stats_error_log("unexpectedly got map value: \"%s\"", strval); goto parse_err; } break; case 2: if (is_key) { if (strcmp(strval, "bind") == 0) { update_bind = true; } else if (strcmp(strval, "max_send_queue") == 0) { update_send_queue = true; } else if (strcmp(strval, "shard_map") == 0) { shard_count = -1; expect_shard_map = true; } else if (strcmp(strval, "validate") == 0) { update_validate = true; } else if (strcmp(strval, "tcp_cork") == 0) { update_tcp_cork = true; } else if (strcmp(strval, "always_resolve_dns") == 0) { always_resolve_dns = true; } } else { if (update_bind) { free(protoc->bind); protoc->bind = strdup(strval); update_bind = false; } else if (update_send_queue) { if (!convert_number(strval, &numval)) { stats_error_log("max_send_queue was not a number: %s", strval); } protoc->max_send_queue = numval; update_send_queue = false; } else if (update_validate) { if (!set_boolean(strval, &protoc->enable_validation)) { goto parse_err; } update_validate = false; } else if (update_tcp_cork) { if (!set_boolean(strval, &protoc->enable_tcp_cork)) { goto parse_err; } update_tcp_cork = false; } else if (always_resolve_dns) { if (!set_boolean(strval, &protoc->always_resolve_dns)) { goto parse_err; } } } break; case 3: if (!expect_shard_map) { stats_error_log("was not expecting shard map"); goto parse_err; } else if (is_key) { if (!convert_number(strval, &numval)) { stats_error_log("shard key was not a number: \"%s\"", strval); goto parse_err; } shard_count++; if (numval != shard_count) { stats_error_log("expected to see shard key %d, instead saw %d", shard_count, numval); goto parse_err; } } else { if (statsrelay_list_expand(protoc->ring) == NULL) { stats_error_log("unable to expand list"); goto parse_err; } if ((protoc->ring->data[protoc->ring->size - 1] = strdup(strval)) == NULL) { stats_error_log("failed to copy string"); goto parse_err; } } } is_key = !is_key; break; default: stats_error_log("unhandled yaml event"); goto parse_err; } yaml_event_delete(&event); } yaml_parser_delete(&parser); return config; parse_err: destroy_config(config); yaml_event_delete(&event); yaml_parser_delete(&parser); return NULL; }