1 #include "bej_tree.h"
2
bejTreeInitParent(struct RedfishPropertyParent * node,const char * name,enum BejPrincipalDataType type)3 static void bejTreeInitParent(struct RedfishPropertyParent* node,
4 const char* name, enum BejPrincipalDataType type)
5 {
6 node->nodeAttr.name = name;
7 node->nodeAttr.format.principalDataType = type;
8 node->nodeAttr.format.deferredBinding = 0;
9 node->nodeAttr.format.readOnlyProperty = 0;
10 node->nodeAttr.format.nullableProperty = 0;
11 node->nodeAttr.sibling = NULL;
12 node->nChildren = 0;
13 node->firstChild = NULL;
14 node->lastChild = NULL;
15 }
16
bejTreeInitSet(struct RedfishPropertyParent * node,const char * name)17 void bejTreeInitSet(struct RedfishPropertyParent* node, const char* name)
18 {
19 bejTreeInitParent(node, name, bejSet);
20 }
21
bejTreeInitArray(struct RedfishPropertyParent * node,const char * name)22 void bejTreeInitArray(struct RedfishPropertyParent* node, const char* name)
23 {
24 bejTreeInitParent(node, name, bejArray);
25 }
26
bejTreeInitPropertyAnnotated(struct RedfishPropertyParent * node,const char * name)27 void bejTreeInitPropertyAnnotated(struct RedfishPropertyParent* node,
28 const char* name)
29 {
30 bejTreeInitParent(node, name, bejPropertyAnnotation);
31 }
32
bejTreeIsParentType(struct RedfishPropertyNode * node)33 bool bejTreeIsParentType(struct RedfishPropertyNode* node)
34 {
35 return node->format.principalDataType == bejSet ||
36 node->format.principalDataType == bejArray ||
37 node->format.principalDataType == bejPropertyAnnotation;
38 }
39
bejTreeInitChildNode(struct RedfishPropertyLeaf * node,const char * name,enum BejPrincipalDataType type)40 static void bejTreeInitChildNode(struct RedfishPropertyLeaf* node,
41 const char* name,
42 enum BejPrincipalDataType type)
43 {
44 node->nodeAttr.name = name;
45 node->nodeAttr.format.principalDataType = type;
46 node->nodeAttr.format.deferredBinding = 0;
47 node->nodeAttr.format.readOnlyProperty = 0;
48 node->nodeAttr.format.nullableProperty = 0;
49 node->nodeAttr.sibling = NULL;
50 }
51
bejTreeAddNull(struct RedfishPropertyParent * parent,struct RedfishPropertyLeafNull * child,const char * name)52 void bejTreeAddNull(struct RedfishPropertyParent* parent,
53 struct RedfishPropertyLeafNull* child, const char* name)
54 {
55 bejTreeInitChildNode((struct RedfishPropertyLeaf*)child, name, bejNull);
56 bejTreeLinkChildToParent(parent, child);
57 }
58
bejTreeAddInteger(struct RedfishPropertyParent * parent,struct RedfishPropertyLeafInt * child,const char * name,int64_t value)59 void bejTreeAddInteger(struct RedfishPropertyParent* parent,
60 struct RedfishPropertyLeafInt* child, const char* name,
61 int64_t value)
62 {
63 bejTreeInitChildNode((struct RedfishPropertyLeaf*)child, name, bejInteger);
64 child->value = value;
65 bejTreeLinkChildToParent(parent, child);
66 }
67
bejTreeSetInteger(struct RedfishPropertyLeafInt * node,int64_t newValue)68 void bejTreeSetInteger(struct RedfishPropertyLeafInt* node, int64_t newValue)
69 {
70 node->value = newValue;
71 }
72
bejTreeAddEnum(struct RedfishPropertyParent * parent,struct RedfishPropertyLeafEnum * child,const char * name,const char * value)73 void bejTreeAddEnum(struct RedfishPropertyParent* parent,
74 struct RedfishPropertyLeafEnum* child, const char* name,
75 const char* value)
76 {
77 bejTreeInitChildNode((struct RedfishPropertyLeaf*)child, name, bejEnum);
78 child->value = value;
79 bejTreeLinkChildToParent(parent, child);
80 }
81
bejTreeAddString(struct RedfishPropertyParent * parent,struct RedfishPropertyLeafString * child,const char * name,const char * value)82 void bejTreeAddString(struct RedfishPropertyParent* parent,
83 struct RedfishPropertyLeafString* child, const char* name,
84 const char* value)
85 {
86 bejTreeInitChildNode((struct RedfishPropertyLeaf*)child, name, bejString);
87 child->value = value;
88 bejTreeLinkChildToParent(parent, child);
89 }
90
bejTreeAddReal(struct RedfishPropertyParent * parent,struct RedfishPropertyLeafReal * child,const char * name,double value)91 void bejTreeAddReal(struct RedfishPropertyParent* parent,
92 struct RedfishPropertyLeafReal* child, const char* name,
93 double value)
94 {
95 bejTreeInitChildNode((struct RedfishPropertyLeaf*)child, name, bejReal);
96 child->value = value;
97 bejTreeLinkChildToParent(parent, child);
98 }
99
bejTreeSetReal(struct RedfishPropertyLeafReal * node,double newValue)100 void bejTreeSetReal(struct RedfishPropertyLeafReal* node, double newValue)
101 {
102 node->value = newValue;
103 }
104
bejTreeAddBool(struct RedfishPropertyParent * parent,struct RedfishPropertyLeafBool * child,const char * name,bool value)105 void bejTreeAddBool(struct RedfishPropertyParent* parent,
106 struct RedfishPropertyLeafBool* child, const char* name,
107 bool value)
108 {
109 bejTreeInitChildNode((struct RedfishPropertyLeaf*)child, name, bejBoolean);
110 child->value = value;
111 bejTreeLinkChildToParent(parent, child);
112 }
113
bejTreeLinkChildToParent(struct RedfishPropertyParent * parent,void * child)114 void bejTreeLinkChildToParent(struct RedfishPropertyParent* parent, void* child)
115 {
116 // A new node is added at the end of the list.
117 if (parent->firstChild == NULL)
118 {
119 parent->firstChild = child;
120 }
121 else
122 {
123 struct RedfishPropertyNode* lastChild = parent->lastChild;
124 lastChild->sibling = child;
125 }
126 parent->lastChild = child;
127 parent->nChildren += 1;
128 }
129
bejTreeUpdateNodeFlags(struct RedfishPropertyNode * node,bool deferredBinding,bool readOnlyProperty,bool nullableProperty)130 void bejTreeUpdateNodeFlags(struct RedfishPropertyNode* node,
131 bool deferredBinding, bool readOnlyProperty,
132 bool nullableProperty)
133 {
134 node->format.deferredBinding = deferredBinding;
135 node->format.readOnlyProperty = readOnlyProperty;
136 node->format.nullableProperty = nullableProperty;
137 }
138
bejParentGoToNextChild(struct RedfishPropertyParent * parent,struct RedfishPropertyNode * currentChild)139 void* bejParentGoToNextChild(struct RedfishPropertyParent* parent,
140 struct RedfishPropertyNode* currentChild)
141 {
142 if (parent == NULL || currentChild == NULL)
143 {
144 return NULL;
145 }
146
147 parent->metaData.nextChildIndex += 1;
148 parent->metaData.nextChild = currentChild->sibling;
149 return currentChild->sibling;
150 }
151