/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* stack_manipulate.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: maiboyer +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/08/31 16:50:04 by maiboyer #+# #+# */ /* Updated: 2024/09/19 14:44:37 by maiboyer ### ########.fr */ /* */ /* ************************************************************************** */ #include "parser/inner/stack_inner.h" #include "parser/language.h" void ts_stack_push(t_stack *self, struct s_stack_push_arg args) { t_stack_head *head; t_stack_node *new_node; head = array_get(&self->heads, args.version); new_node = stack_node_new(head->node, args.subtree, args.pending, args.state); if (!args.subtree) head->node_count_at_last_error = new_node->node_count; head->node = new_node; } t_stack_action pop_count_callback(void *payload, const t_stack_iterator *iterator) { t_u32 *goal_subtree_count; goal_subtree_count = payload; if (iterator->subtree_count == *goal_subtree_count) { return (SActionPop | SActionStop); } else { return (SActionNone); } } t_stack_slice_array ts_stack_pop_count(t_stack *self, t_stack_version version, t_u32 count) { return (stack__iter(self, version, pop_count_callback, &count, (int)count)); } t_stack_action pop_pending_callback(void *payload, const t_stack_iterator *iterator) { (void)payload; if (iterator->subtree_count >= 1) { if (iterator->is_pending) return (SActionPop | SActionStop); else return (SActionStop); } else return (SActionNone); } t_stack_slice_array ts_stack_pop_pending(t_stack *self, t_stack_version version) { t_stack_slice_array pop; pop = stack__iter(self, version, pop_pending_callback, NULL, 0); if (pop.size > 0) { ts_stack_renumber_version(self, pop.contents[0].version, version); pop.contents[0].version = version; } return (pop); }