NeoMutt  2024-10-02-7-gd3e66a
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
node.c
Go to the documentation of this file.
1
30#include "config.h"
31#include <stddef.h>
32#include "mutt/lib.h"
33#include "node.h"
34
39struct ExpandoNode *node_new(void)
40{
41 return mutt_mem_calloc(1, sizeof(struct ExpandoNode));
42}
43
48void node_free(struct ExpandoNode **ptr)
49{
50 if (!ptr || !*ptr)
51 return;
52
53 struct ExpandoNode *node = *ptr;
54 if (node->ndata_free)
55 {
56 node->ndata_free(&node->ndata);
57 }
58
59 struct ExpandoNode **enp = NULL;
60 ARRAY_FOREACH(enp, &node->children)
61 {
62 node_tree_free(enp);
63 }
64
65 FREE(&node->format);
66
67 ARRAY_FREE(&node->children);
68
69 FREE(ptr);
70}
71
76void node_tree_free(struct ExpandoNode **ptr)
77{
78 if (!ptr || !*ptr)
79 return;
80
81 struct ExpandoNode *node = *ptr;
82 while (node)
83 {
84 struct ExpandoNode *n = node;
85 node = node->next;
86 node_free(&n);
87 }
88
89 *ptr = NULL;
90}
91
99struct ExpandoNode *node_get_child(const struct ExpandoNode *node, int index)
100{
101 if (!node)
102 return NULL;
103
104 struct ExpandoNode **ptr = ARRAY_GET(&node->children, index);
105 if (!ptr)
106 return NULL;
107
108 return *ptr;
109}
110
116void node_append(struct ExpandoNode **root, struct ExpandoNode *new_node)
117{
118 if (!*root)
119 {
120 *root = new_node;
121 return;
122 }
123
124 struct ExpandoNode *node = *root;
125 while (node->next)
126 {
127 node = node->next;
128 }
129
130 node->next = new_node;
131}
132
138struct ExpandoNode *node_last(struct ExpandoNode *node)
139{
140 if (!node)
141 return NULL;
142
143 while (true)
144 {
145 if (node->next)
146 {
147 node = node->next;
148 continue;
149 }
150
151 size_t size = ARRAY_SIZE(&node->children);
152 if (size == 0)
153 break;
154
155 struct ExpandoNode *last = node_get_child(node, size - 1);
156 if (!last)
157 break; // LCOV_EXCL_LINE
158
159 node = last;
160 }
161
162 return node;
163}
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
Definition: array.h:212
#define ARRAY_SIZE(head)
The number of elements stored.
Definition: array.h:87
#define ARRAY_FREE(head)
Release all memory.
Definition: array.h:204
#define ARRAY_GET(head, idx)
Return the element at index.
Definition: array.h:109
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:51
#define FREE(x)
Definition: memory.h:45
Convenience wrapper for the library headers.
struct ExpandoNode * node_new(void)
Create a new empty ExpandoNode.
Definition: node.c:39
void node_tree_free(struct ExpandoNode **ptr)
Free a tree of ExpandoNodes.
Definition: node.c:76
struct ExpandoNode * node_get_child(const struct ExpandoNode *node, int index)
Get a child of an ExpandoNode.
Definition: node.c:99
void node_append(struct ExpandoNode **root, struct ExpandoNode *new_node)
Append an ExpandoNode to an existing node.
Definition: node.c:116
struct ExpandoNode * node_last(struct ExpandoNode *node)
Find the last Node in a tree.
Definition: node.c:138
void node_free(struct ExpandoNode **ptr)
Free an ExpandoNode and its private data.
Definition: node.c:48
Basic Expando Node.
Basic Expando Node.
Definition: node.h:69
void * ndata
Private node data.
Definition: node.h:82
struct ExpandoFormat * format
Formatting info.
Definition: node.h:75
struct ExpandoNode * next
Linked list.
Definition: node.h:71
void(* ndata_free)(void **ptr)
Function to free the private node data.
Definition: node.h:83
struct ExpandoNodeArray children
Children nodes.
Definition: node.h:77