bool emit_zsh(const nodelist *list) { log_debug("zsh", "emitting..."); emit_context context = { .emit_mapping_item = emit_mapping_item, .wrap_collections = false }; return nodelist_iterate(list, emit_node, &context); } static bool emit_mapping_item(Node *key, Node *value, void * context __attribute__((unused))) { if(is_scalar(value)) { log_trace("zsh", "emitting mapping item"); if(!emit_scalar(scalar(key))) { log_error("zsh", "uh oh! couldn't emit mapping key"); return false; } EMIT(" "); if(!emit_scalar(scalar(value))) { log_error("zsh", "uh oh! couldn't emit mapping value"); return false; } EMIT(" "); } else { log_trace("zsh", "skipping mapping item"); } 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; }
static bool emit_node(node *each, void *context) { bool result = true; switch(node_kind(each)) { case DOCUMENT: result = emit_document(each, context); break; case SCALAR: result = emit_scalar(each, context); break; case SEQUENCE: result = emit_sequence(each, context); break; case MAPPING: result = emit_mapping(each, context); break; case ALIAS: result = emit_node(alias_target(each), context); break; } return result; }