mirror of
https://github.com/dgibson/dtc.git
synced 2025-10-13 16:27:39 -04:00
dtc: Add ability to delete nodes and properties
dtc currently allows the contents of properties to be changed, and the contents of nodes to be added to. There are situations where removing properties or nodes may be useful. This change implements the following syntax to do that: / { /delete-property/ propname; /delete-node/ nodename; }; or: /delete-node/ &noderef; Signed-off-by: Stephen Warren <swarren@nvidia.com> Acked-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
8716901d22
commit
45013d8619
10 changed files with 312 additions and 52 deletions
48
dtc.h
48
dtc.h
|
@ -128,11 +128,13 @@ int data_is_one_string(struct data d);
|
|||
|
||||
/* Live trees */
|
||||
struct label {
|
||||
int deleted;
|
||||
char *label;
|
||||
struct label *next;
|
||||
};
|
||||
|
||||
struct property {
|
||||
int deleted;
|
||||
char *name;
|
||||
struct data val;
|
||||
|
||||
|
@ -142,6 +144,7 @@ struct property {
|
|||
};
|
||||
|
||||
struct node {
|
||||
int deleted;
|
||||
char *name;
|
||||
struct property *proplist;
|
||||
struct node *children;
|
||||
|
@ -158,28 +161,71 @@ struct node {
|
|||
struct label *labels;
|
||||
};
|
||||
|
||||
static inline struct label *for_each_label_next(struct label *l)
|
||||
{
|
||||
do {
|
||||
l = l->next;
|
||||
} while (l && l->deleted);
|
||||
|
||||
return l;
|
||||
}
|
||||
|
||||
#define for_each_label(l0, l) \
|
||||
for ((l) = (l0); (l); (l) = for_each_label_next(l))
|
||||
|
||||
#define for_each_label_withdel(l0, l) \
|
||||
for ((l) = (l0); (l); (l) = (l)->next)
|
||||
|
||||
static inline struct property *for_each_property_next(struct property *p)
|
||||
{
|
||||
do {
|
||||
p = p->next;
|
||||
} while (p && p->deleted);
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
#define for_each_property(n, p) \
|
||||
for ((p) = (n)->proplist; (p); (p) = for_each_property_next(p))
|
||||
|
||||
#define for_each_property_withdel(n, p) \
|
||||
for ((p) = (n)->proplist; (p); (p) = (p)->next)
|
||||
|
||||
#define for_each_child(n, c) \
|
||||
static inline struct node *for_each_child_next(struct node *c)
|
||||
{
|
||||
do {
|
||||
c = c->next_sibling;
|
||||
} while (c && c->deleted);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
#define for_each_child(n, c) \
|
||||
for ((c) = (n)->children; (c); (c) = for_each_child_next(c))
|
||||
|
||||
#define for_each_child_withdel(n, c) \
|
||||
for ((c) = (n)->children; (c); (c) = (c)->next_sibling)
|
||||
|
||||
void add_label(struct label **labels, char *label);
|
||||
void delete_labels(struct label **labels);
|
||||
|
||||
struct property *build_property(char *name, struct data val);
|
||||
struct property *build_property_delete(char *name);
|
||||
struct property *chain_property(struct property *first, struct property *list);
|
||||
struct property *reverse_properties(struct property *first);
|
||||
|
||||
struct node *build_node(struct property *proplist, struct node *children);
|
||||
struct node *build_node_delete(void);
|
||||
struct node *name_node(struct node *node, char *name);
|
||||
struct node *chain_node(struct node *first, struct node *list);
|
||||
struct node *merge_nodes(struct node *old_node, struct node *new_node);
|
||||
|
||||
void add_property(struct node *node, struct property *prop);
|
||||
void delete_property_by_name(struct node *node, char *name);
|
||||
void delete_property(struct property *prop);
|
||||
void add_child(struct node *parent, struct node *child);
|
||||
void delete_node_by_name(struct node *parent, char *name);
|
||||
void delete_node(struct node *node);
|
||||
|
||||
const char *get_unitname(struct node *node);
|
||||
struct property *get_property(struct node *node, const char *propname);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue