static bool emit_sequence(node *sequence, void *context) { log_trace(component, "emitting seqence"); yaml_emitter_t *emitter = (yaml_emitter_t *)context; yaml_event_t event; log_trace(component, "seqence start"); uint8_t *name = node_name(sequence); yaml_char_t *tag = NULL == name ? (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG : (yaml_char_t *)name; yaml_sequence_start_event_initialize(&event, NULL, tag, NULL == name, YAML_BLOCK_SEQUENCE_STYLE); if (!yaml_emitter_emit(emitter, &event)) return false; if(!sequence_iterate(sequence, emit_sequence_item, context)) { return false; } log_trace(component, "seqence end"); yaml_sequence_end_event_initialize(&event); if (!yaml_emitter_emit(emitter, &event)) return false; return true; }
bool emit_node(node *each, void *argument) { emit_context *context = (emit_context *)argument; bool result = true; switch(node_kind(each)) { case DOCUMENT: log_trace("shell", "emitting document"); result = emit_node(document_root(each), NULL); break; case SCALAR: result = emit_scalar(each); EMIT("\n"); break; case SEQUENCE: log_trace("shell", "emitting seqence"); MAYBE_EMIT("("); result = sequence_iterate(each, emit_sequence_item, NULL); MAYBE_EMIT(")"); EMIT("\n"); break; case MAPPING: log_trace("shell", "emitting mapping"); MAYBE_EMIT("("); result = mapping_iterate(each, context->emit_mapping_item, NULL); MAYBE_EMIT(")"); EMIT("\n"); break; case ALIAS: log_trace("shell", "resolving alias"); result = emit_node(alias_target(each), NULL); break; } fflush(stdout); return result; }
END_TEST START_TEST (sequence_iteration) { reset_errno(); Node *r = model_document_root(model, 0); assert_noerr(); assert_not_null(r); assert_node_kind(r, MAPPING); reset_errno(); Node *s = mapping_get(mapping(r), (uint8_t *)"one", 3ul); assert_noerr(); assert_not_null(s); assert_node_kind(s, SEQUENCE); assert_node_size(s, 2); size_t count = 0; reset_errno(); assert_true(sequence_iterate(sequence(s), check_sequence, &count)); assert_noerr(); assert_uint_eq(2, count); }