X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=src%2Fecoli_yaml.c;h=326af5666f0ceae42d2c816024bdd943117b3e23;hb=bfc32eb38d93d86ce294ede5527bcbb34db5dd78;hp=84007d55b96a756ff1d3f8c60b38b1bc908eff62;hpb=18d03456d96f7a086a2ccc82ce97fcf056848d90;p=protos%2Flibecoli.git diff --git a/src/ecoli_yaml.c b/src/ecoli_yaml.c index 84007d5..326af56 100644 --- a/src/ecoli_yaml.c +++ b/src/ecoli_yaml.c @@ -360,12 +360,20 @@ parse_ec_node(struct enode_table *table, const yaml_node_pair_t *pair; const char *key_str, *value_str; struct ec_node *enode = NULL; + char *value_dup = NULL; + size_t i; if (ynode->type != YAML_MAPPING_NODE) { fprintf(stderr, "Ecoli node should be a yaml mapping node\n"); goto fail; } + /* if it's an anchor, the node may be already parsed, reuse it */ + for (i = 0; i < table->len; i++) { + if (table->pair[i].ynode == ynode) + return ec_node_clone(table->pair[i].enode); + } + for (pair = ynode->data.mapping.pairs.start; pair < ynode->data.mapping.pairs.top; pair++) { key = document->nodes.start + pair->key - 1; // XXX -1 ? @@ -468,7 +476,24 @@ parse_ec_node(struct enode_table *table, } /* add attributes (all as string) */ - //XXX + if (attrs != NULL) { + for (pair = attrs->data.mapping.pairs.start; + pair < attrs->data.mapping.pairs.top; pair++) { + key = document->nodes.start + pair->key - 1; + value = document->nodes.start + pair->value - 1; + key_str = (const char *)key->data.scalar.value; + value_str = (const char *)value->data.scalar.value; + value_dup = ec_strdup(value_str); + if (value_dup == NULL) + goto fail; + if (ec_keyval_set(ec_node_attrs(enode), key_str, + value_dup, ec_free_func) < 0) { + value_dup = NULL; + goto fail; + } + value_dup = NULL; + } + } return enode; @@ -476,6 +501,7 @@ fail: ec_node_free(enode); ec_config_free(config); ec_free(help); + ec_free(value_dup); return NULL; }