root / logic / trunk / src / mxml / mxml-set.c @ 69
History | View | Annotate | Download (6.42 KB)
1 |
/*
|
---|---|
2 |
* "$Id: mxml-set.c 270 2007-04-23 21:48:03Z mike $"
|
3 |
*
|
4 |
* Node set functions for Mini-XML, a small XML-like file parsing library.
|
5 |
*
|
6 |
* Copyright 2003-2007 by Michael Sweet.
|
7 |
*
|
8 |
* This program is free software; you can redistribute it and/or
|
9 |
* modify it under the terms of the GNU Library General Public
|
10 |
* License as published by the Free Software Foundation; either
|
11 |
* version 2, or (at your option) any later version.
|
12 |
*
|
13 |
* This program is distributed in the hope that it will be useful,
|
14 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16 |
* GNU General Public License for more details.
|
17 |
*
|
18 |
* Contents:
|
19 |
*
|
20 |
* mxmlSetCustom() - Set the data and destructor of a custom data node.
|
21 |
* mxmlSetCDATA() - Set the element name of a CDATA node.
|
22 |
* mxmlSetElement() - Set the name of an element node.
|
23 |
* mxmlSetInteger() - Set the value of an integer node.
|
24 |
* mxmlSetOpaque() - Set the value of an opaque node.
|
25 |
* mxmlSetReal() - Set the value of a real number node.
|
26 |
* mxmlSetText() - Set the value of a text node.
|
27 |
* mxmlSetTextf() - Set the value of a text node to a formatted string.
|
28 |
*/
|
29 |
|
30 |
/*
|
31 |
* Include necessary headers...
|
32 |
*/
|
33 |
|
34 |
#include "config.h" |
35 |
#include "mxml.h" |
36 |
|
37 |
|
38 |
/*
|
39 |
* 'mxmlSetCustom()' - Set the data and destructor of a custom data node.
|
40 |
*
|
41 |
* The node is not changed if it is not a custom node.
|
42 |
*
|
43 |
* @since Mini-XML 2.1@
|
44 |
*/
|
45 |
|
46 |
int /* O - 0 on success, -1 on failure */ |
47 |
mxmlSetCustom( |
48 |
mxml_node_t *node, /* I - Node to set */
|
49 |
void *data, /* I - New data pointer */ |
50 |
mxml_custom_destroy_cb_t destroy) /* I - New destructor function */
|
51 |
{ |
52 |
/*
|
53 |
* Range check input...
|
54 |
*/
|
55 |
|
56 |
if (!node || node->type != MXML_CUSTOM)
|
57 |
return (-1); |
58 |
|
59 |
/*
|
60 |
* Free any old element value and set the new value...
|
61 |
*/
|
62 |
|
63 |
if (node->value.custom.data && node->value.custom.destroy)
|
64 |
(*(node->value.custom.destroy))(node->value.custom.data); |
65 |
|
66 |
node->value.custom.data = data; |
67 |
node->value.custom.destroy = destroy; |
68 |
|
69 |
return (0); |
70 |
} |
71 |
|
72 |
|
73 |
/*
|
74 |
* 'mxmlSetCDATA()' - Set the element name of a CDATA node.
|
75 |
*
|
76 |
* The node is not changed if it is not a CDATA element node.
|
77 |
*
|
78 |
* @since Mini-XML 2.3@
|
79 |
*/
|
80 |
|
81 |
int /* O - 0 on success, -1 on failure */ |
82 |
mxmlSetCDATA(mxml_node_t *node, /* I - Node to set */
|
83 |
const char *data) /* I - New data string */ |
84 |
{ |
85 |
/*
|
86 |
* Range check input...
|
87 |
*/
|
88 |
|
89 |
if (!node || node->type != MXML_ELEMENT || !data ||
|
90 |
strncmp(node->value.element.name, "![CDATA[", 8)) |
91 |
return (-1); |
92 |
|
93 |
/*
|
94 |
* Free any old element value and set the new value...
|
95 |
*/
|
96 |
|
97 |
if (node->value.element.name)
|
98 |
free(node->value.element.name); |
99 |
|
100 |
node->value.element.name = _mxml_strdupf("![CDATA[%s]]", data);
|
101 |
|
102 |
return (0); |
103 |
} |
104 |
|
105 |
|
106 |
/*
|
107 |
* 'mxmlSetElement()' - Set the name of an element node.
|
108 |
*
|
109 |
* The node is not changed if it is not an element node.
|
110 |
*/
|
111 |
|
112 |
int /* O - 0 on success, -1 on failure */ |
113 |
mxmlSetElement(mxml_node_t *node, /* I - Node to set */
|
114 |
const char *name) /* I - New name string */ |
115 |
{ |
116 |
/*
|
117 |
* Range check input...
|
118 |
*/
|
119 |
|
120 |
if (!node || node->type != MXML_ELEMENT || !name)
|
121 |
return (-1); |
122 |
|
123 |
/*
|
124 |
* Free any old element value and set the new value...
|
125 |
*/
|
126 |
|
127 |
if (node->value.element.name)
|
128 |
free(node->value.element.name); |
129 |
|
130 |
node->value.element.name = strdup(name); |
131 |
|
132 |
return (0); |
133 |
} |
134 |
|
135 |
|
136 |
/*
|
137 |
* 'mxmlSetInteger()' - Set the value of an integer node.
|
138 |
*
|
139 |
* The node is not changed if it is not an integer node.
|
140 |
*/
|
141 |
|
142 |
int /* O - 0 on success, -1 on failure */ |
143 |
mxmlSetInteger(mxml_node_t *node, /* I - Node to set */
|
144 |
int integer) /* I - Integer value */ |
145 |
{ |
146 |
/*
|
147 |
* Range check input...
|
148 |
*/
|
149 |
|
150 |
if (!node || node->type != MXML_INTEGER)
|
151 |
return (-1); |
152 |
|
153 |
/*
|
154 |
* Set the new value and return...
|
155 |
*/
|
156 |
|
157 |
node->value.integer = integer; |
158 |
|
159 |
return (0); |
160 |
} |
161 |
|
162 |
|
163 |
/*
|
164 |
* 'mxmlSetOpaque()' - Set the value of an opaque node.
|
165 |
*
|
166 |
* The node is not changed if it is not an opaque node.
|
167 |
*/
|
168 |
|
169 |
int /* O - 0 on success, -1 on failure */ |
170 |
mxmlSetOpaque(mxml_node_t *node, /* I - Node to set */
|
171 |
const char *opaque) /* I - Opaque string */ |
172 |
{ |
173 |
/*
|
174 |
* Range check input...
|
175 |
*/
|
176 |
|
177 |
if (!node || node->type != MXML_OPAQUE || !opaque)
|
178 |
return (-1); |
179 |
|
180 |
/*
|
181 |
* Free any old opaque value and set the new value...
|
182 |
*/
|
183 |
|
184 |
if (node->value.opaque)
|
185 |
free(node->value.opaque); |
186 |
|
187 |
node->value.opaque = strdup(opaque); |
188 |
|
189 |
return (0); |
190 |
} |
191 |
|
192 |
|
193 |
/*
|
194 |
* 'mxmlSetReal()' - Set the value of a real number node.
|
195 |
*
|
196 |
* The node is not changed if it is not a real number node.
|
197 |
*/
|
198 |
|
199 |
int /* O - 0 on success, -1 on failure */ |
200 |
mxmlSetReal(mxml_node_t *node, /* I - Node to set */
|
201 |
double real) /* I - Real number value */ |
202 |
{ |
203 |
/*
|
204 |
* Range check input...
|
205 |
*/
|
206 |
|
207 |
if (!node || node->type != MXML_REAL)
|
208 |
return (-1); |
209 |
|
210 |
/*
|
211 |
* Set the new value and return...
|
212 |
*/
|
213 |
|
214 |
node->value.real = real; |
215 |
|
216 |
return (0); |
217 |
} |
218 |
|
219 |
|
220 |
/*
|
221 |
* 'mxmlSetText()' - Set the value of a text node.
|
222 |
*
|
223 |
* The node is not changed if it is not a text node.
|
224 |
*/
|
225 |
|
226 |
int /* O - 0 on success, -1 on failure */ |
227 |
mxmlSetText(mxml_node_t *node, /* I - Node to set */
|
228 |
int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */ |
229 |
const char *string) /* I - String */ |
230 |
{ |
231 |
/*
|
232 |
* Range check input...
|
233 |
*/
|
234 |
|
235 |
if (!node || node->type != MXML_TEXT || !string)
|
236 |
return (-1); |
237 |
|
238 |
/*
|
239 |
* Free any old string value and set the new value...
|
240 |
*/
|
241 |
|
242 |
if (node->value.text.string)
|
243 |
free(node->value.text.string); |
244 |
|
245 |
node->value.text.whitespace = whitespace; |
246 |
node->value.text.string = strdup(string); |
247 |
|
248 |
return (0); |
249 |
} |
250 |
|
251 |
|
252 |
/*
|
253 |
* 'mxmlSetTextf()' - Set the value of a text node to a formatted string.
|
254 |
*
|
255 |
* The node is not changed if it is not a text node.
|
256 |
*/
|
257 |
|
258 |
int /* O - 0 on success, -1 on failure */ |
259 |
mxmlSetTextf(mxml_node_t *node, /* I - Node to set */
|
260 |
int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */ |
261 |
const char *format, /* I - Printf-style format string */ |
262 |
...) /* I - Additional arguments as needed */
|
263 |
{ |
264 |
va_list ap; /* Pointer to arguments */
|
265 |
|
266 |
|
267 |
/*
|
268 |
* Range check input...
|
269 |
*/
|
270 |
|
271 |
if (!node || node->type != MXML_TEXT || !format)
|
272 |
return (-1); |
273 |
|
274 |
/*
|
275 |
* Free any old string value and set the new value...
|
276 |
*/
|
277 |
|
278 |
if (node->value.text.string)
|
279 |
free(node->value.text.string); |
280 |
|
281 |
va_start(ap, format); |
282 |
|
283 |
node->value.text.whitespace = whitespace; |
284 |
node->value.text.string = _mxml_strdupf(format, ap); |
285 |
|
286 |
va_end(ap); |
287 |
|
288 |
return (0); |
289 |
} |
290 |
|
291 |
|
292 |
/*
|
293 |
* End of "$Id: mxml-set.c 270 2007-04-23 21:48:03Z mike $".
|
294 |
*/
|