From f396a88bacd0d078738eaf7667f1ca96bdcfd9b3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 13 Sep 2024 17:16:42 -0700 Subject: [PATCH] mdesk layer extensions for mutable tree manipulations --- src/mdesk/mdesk.c | 34 ++++++++++++++++++++++++++++++++++ src/mdesk/mdesk.h | 3 +++ 2 files changed, 37 insertions(+) diff --git a/src/mdesk/mdesk.c b/src/mdesk/mdesk.c index 899d8c30..fe2e502c 100644 --- a/src/mdesk/mdesk.c +++ b/src/mdesk/mdesk.c @@ -197,6 +197,21 @@ md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, return node; } +internal void +md_node_insert_child(MD_Node *parent, MD_Node *prev_child, MD_Node *node) +{ + node->parent = parent; + DLLInsert_NPZ(&md_nil_node, parent->first, parent->last, prev_child, node, next, prev); +} + +internal void +md_node_insert_tag(MD_Node *parent, MD_Node *prev_child, MD_Node *node) +{ + node->kind = MD_NodeKind_Tag; + node->parent = parent; + DLLInsert_NPZ(&md_nil_node, parent->first_tag, parent->last_tag, prev_child, node, next, prev); +} + internal void md_node_push_child(MD_Node *parent, MD_Node *node) { @@ -207,10 +222,29 @@ md_node_push_child(MD_Node *parent, MD_Node *node) internal void md_node_push_tag(MD_Node *parent, MD_Node *node) { + node->kind = MD_NodeKind_Tag; node->parent = parent; DLLPushBack_NPZ(&md_nil_node, parent->first_tag, parent->last_tag, node, next, prev); } +internal void +md_unhook(MD_Node *node) +{ + MD_Node *parent = node->parent; + if(!md_node_is_nil(parent)) + { + if(node->kind == MD_NodeKind_Tag) + { + DLLRemove_NPZ(&md_nil_node, parent->first_tag, parent->last_tag, node, next, prev); + } + else + { + DLLRemove_NPZ(&md_nil_node, parent->first, parent->last, node, next, prev); + } + node->parent = &md_nil_node; + } +} + //- rjf: tree introspection internal MD_Node * diff --git a/src/mdesk/mdesk.h b/src/mdesk/mdesk.h index bc167109d..512f2a6b 100644 --- a/src/mdesk/mdesk.h +++ b/src/mdesk/mdesk.h @@ -270,8 +270,11 @@ internal MD_NodeRec md_node_rec_depth_first(MD_Node *node, MD_Node *subtree_root //- rjf: tree building internal MD_Node *md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset); +internal void md_node_insert_child(MD_Node *parent, MD_Node *prev_child, MD_Node *node); +internal void md_node_insert_tag(MD_Node *parent, MD_Node *prev_child, MD_Node *node); internal void md_node_push_child(MD_Node *parent, MD_Node *node); internal void md_node_push_tag(MD_Node *parent, MD_Node *node); +internal void md_unhook(MD_Node *node); //- rjf: tree introspection internal MD_Node * md_node_from_chain_string(MD_Node *first, MD_Node *opl, String8 string, StringMatchFlags flags);