Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 31 additions & 11 deletions src/info.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ typedef struct tree_node_stack {
} tree_node_stack_t;


tree_node_t *tree_node_new(tree_node_type_t type, const char *key, size_t index) {
static tree_node_t *tree_node_new(tree_node_type_t type, const char *key, size_t index) {
tree_node_t *node = calloc(1, sizeof(tree_node_t));
node->type = type;

Expand All @@ -89,7 +89,7 @@ tree_node_t *tree_node_new(tree_node_type_t type, const char *key, size_t index)
}


void tree_node_add_child(tree_node_t *parent, tree_node_t *child) {
static void tree_node_add_child(tree_node_t *parent, tree_node_t *child) {
child->parent = parent;
if (!parent->first_child) {
parent->first_child = parent->last_child = child;
Expand All @@ -100,7 +100,7 @@ void tree_node_add_child(tree_node_t *parent, tree_node_t *child) {
}


void tree_node_free(tree_node_t *node) {
static void tree_node_free(tree_node_t *node) {
tree_node_t *child = node->first_child;
while (child) {
tree_node_t *next = child->next_sibling;
Expand All @@ -111,12 +111,33 @@ void tree_node_free(tree_node_t *node) {
if (node->parent && node->parent->type == TREE_MAPPING)
free(node->index.key);

if (node->type == TREE_MAPPING)
free(node->state.mapping.pending_key);

free(node->tag);
free(node->value);
free(node);
}


static void tree_node_set_pending_key(tree_node_t *parent, const char *new_key, size_t len) {
if (!parent || parent->type != TREE_MAPPING)
return;

// Free old key if present
if (parent->state.mapping.pending_key) {
free(parent->state.mapping.pending_key);
parent->state.mapping.pending_key = NULL;
}

if (new_key && len > 0) {
parent->state.mapping.pending_key = strndup(new_key, len);
} else {
parent->state.mapping.pending_key = NULL;
}
}


static void stack_push(tree_node_stack_t **stack, tree_node_t *node) {
tree_node_stack_t *new_item = malloc(sizeof(tree_node_stack_t));
new_item->node = node;
Expand All @@ -143,7 +164,7 @@ static tree_node_t *stack_peek(tree_node_stack_t *stack) {
}


tree_node_t *build_tree(asdf_parser_t *parser) {
static tree_node_t *build_tree(asdf_parser_t *parser) {
asdf_event_t event = {0};
tree_node_t *root = NULL;
tree_node_stack_t *stack = NULL;
Expand All @@ -155,8 +176,10 @@ tree_node_t *build_tree(asdf_parser_t *parser) {
tree_node_t *parent = stack_peek(stack);
tree_node_t *node = NULL;

if (type == ASDF_YAML_STREAM_END_EVENT)
if (type == ASDF_YAML_STREAM_END_EVENT) {
asdf_event_destroy(parser, &event);
break;
}

switch (type) {
/* TODO: Handle anchor events */
Expand All @@ -174,14 +197,14 @@ tree_node_t *build_tree(asdf_parser_t *parser) {
switch (parent->type) {
case TREE_MAPPING:
key = parent->state.mapping.pending_key;
parent->state.mapping.pending_key = NULL;
break;
case TREE_SEQUENCE:
index = parent->state.sequence.index++;
default:
break;
}
node = tree_node_new(node_type, key, index);
tree_node_set_pending_key(parent, NULL, 0);
tree_node_add_child(parent, node);
}

Expand Down Expand Up @@ -211,14 +234,13 @@ tree_node_t *build_tree(asdf_parser_t *parser) {
tag = asdf_yaml_event_tag(&event, &tag_len);

if (parent->type == TREE_MAPPING && !parent->state.mapping.pending_key) {
parent->state.mapping.pending_key = strndup(value, val_len);
tree_node_set_pending_key(parent, value, val_len);
continue;
}

switch (parent->type) {
case TREE_MAPPING:
key = parent->state.mapping.pending_key;
parent->state.mapping.pending_key = NULL;
break;
case TREE_SEQUENCE:
index = parent->state.sequence.index++;
Expand All @@ -228,6 +250,7 @@ tree_node_t *build_tree(asdf_parser_t *parser) {
}

node = tree_node_new(TREE_SCALAR, key, index);
tree_node_set_pending_key(parent, NULL, 0);
node->value = strndup(value, val_len);
if (tag && tag_len > 0)
node->tag = strndup(tag, tag_len);
Expand All @@ -239,8 +262,6 @@ tree_node_t *build_tree(asdf_parser_t *parser) {
// ignore other ASDF event types for now
break;
}

asdf_event_destroy(parser, &event);
}

// Defensive cleanup of the stack; unlikely to be needed but possible in case of
Expand Down Expand Up @@ -472,7 +493,6 @@ int asdf_info(FILE *in_file, FILE *out_file, const asdf_info_cfg_t *cfg) {
default:
break;
}
asdf_event_destroy(&parser, &event);
}

asdf_parser_destroy(&parser);
Expand Down