This source file includes following definitions.
- pcmk__xml_first_child
- pcmk__xml_next
- pcmk__xe_first_child
- pcmk__xe_next
1
2
3
4
5
6
7
8
9
10 #ifndef PCMK__XML_INTERNAL__H
11 # define PCMK__XML_INTERNAL__H
12
13
14
15
16
17 # include <stdlib.h>
18 # include <stdio.h>
19 # include <string.h>
20
21 # include <crm/crm.h>
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 #define PCMK__XML_LOG_BASE(priority, dechunk, postemit, prefix, fmt, ap) \
68 do { \
69 if (!(dechunk) && (prefix) == NULL) { \
70 qb_log_from_external_source_va(__func__, __FILE__, (fmt), \
71 (priority), __LINE__, 0, (ap)); \
72 (void) (postemit); \
73 } else { \
74 int CXLB_len = 0; \
75 char *CXLB_buf = NULL; \
76 static int CXLB_buffer_len = 0; \
77 static char *CXLB_buffer = NULL; \
78 static uint8_t CXLB_priority = 0; \
79 \
80 CXLB_len = vasprintf(&CXLB_buf, (fmt), (ap)); \
81 \
82 if (CXLB_len <= 0 || CXLB_buf[CXLB_len - 1] == '\n' || !(dechunk)) { \
83 if (CXLB_len < 0) { \
84 CXLB_buf = (char *) "LOG CORRUPTION HAZARD"; \
85 CXLB_priority = QB_MIN(CXLB_priority, LOG_ERR); \
86 } else if (CXLB_len > 0 \
87 && CXLB_buf[CXLB_len - 1] == '\n') { \
88 CXLB_buf[CXLB_len - 1] = '\0'; \
89 } \
90 if (CXLB_buffer) { \
91 qb_log_from_external_source(__func__, __FILE__, "%s%s%s", \
92 CXLB_priority, __LINE__, 0, \
93 (prefix) != NULL ? (prefix) : "", \
94 CXLB_buffer, CXLB_buf); \
95 free(CXLB_buffer); \
96 } else { \
97 qb_log_from_external_source(__func__, __FILE__, "%s%s", \
98 (priority), __LINE__, 0, \
99 (prefix) != NULL ? (prefix) : "", \
100 CXLB_buf); \
101 } \
102 if (CXLB_len < 0) { \
103 CXLB_buf = NULL; \
104 } \
105 CXLB_buffer = NULL; \
106 CXLB_buffer_len = 0; \
107 (void) (postemit); \
108 \
109 } else if (CXLB_buffer == NULL) { \
110 CXLB_buffer_len = CXLB_len; \
111 CXLB_buffer = CXLB_buf; \
112 CXLB_buf = NULL; \
113 CXLB_priority = (priority); \
114 \
115 } else { \
116 CXLB_buffer = realloc(CXLB_buffer, 1 + CXLB_buffer_len + CXLB_len); \
117 memcpy(CXLB_buffer + CXLB_buffer_len, CXLB_buf, CXLB_len); \
118 CXLB_buffer_len += CXLB_len; \
119 CXLB_buffer[CXLB_buffer_len] = '\0'; \
120 CXLB_priority = QB_MIN(CXLB_priority, (priority)); \
121 } \
122 free(CXLB_buf); \
123 } \
124 } while (0)
125
126 enum pcmk__xml_artefact_ns {
127 pcmk__xml_artefact_ns_legacy_rng = 1,
128 pcmk__xml_artefact_ns_legacy_xslt,
129 pcmk__xml_artefact_ns_base_rng,
130 pcmk__xml_artefact_ns_base_xslt,
131 };
132
133 void pcmk__strip_xml_text(xmlNode *xml);
134 const char *pcmk__xe_add_last_written(xmlNode *xe);
135
136 xmlNode *pcmk__xe_match(xmlNode *parent, const char *node_name,
137 const char *attr_n, const char *attr_v);
138
139
140
141
142
143
144
145
146
147 char *
148 pcmk__xml_artefact_root(enum pcmk__xml_artefact_ns ns);
149
150
151
152
153
154
155
156
157
158
159 char *pcmk__xml_artefact_path(enum pcmk__xml_artefact_ns ns,
160 const char *filespec);
161
162
163
164
165
166
167
168
169
170 static inline xmlNode *
171 pcmk__xml_first_child(const xmlNode *parent)
172 {
173 xmlNode *child = (parent? parent->children : NULL);
174
175 while (child && (child->type == XML_TEXT_NODE)) {
176 child = child->next;
177 }
178 return child;
179 }
180
181
182
183
184
185
186
187
188
189 static inline xmlNode *
190 pcmk__xml_next(const xmlNode *child)
191 {
192 xmlNode *next = (child? child->next : NULL);
193
194 while (next && (next->type == XML_TEXT_NODE)) {
195 next = next->next;
196 }
197 return next;
198 }
199
200
201
202
203
204
205
206
207
208 static inline xmlNode *
209 pcmk__xe_first_child(const xmlNode *parent)
210 {
211 xmlNode *child = (parent? parent->children : NULL);
212
213 while (child && (child->type != XML_ELEMENT_NODE)) {
214 child = child->next;
215 }
216 return child;
217 }
218
219
220
221
222
223
224
225
226
227 static inline xmlNode *
228 pcmk__xe_next(const xmlNode *child)
229 {
230 xmlNode *next = child? child->next : NULL;
231
232 while (next && (next->type != XML_ELEMENT_NODE)) {
233 next = next->next;
234 }
235 return next;
236 }
237
238 #endif