]> matita.cs.unibo.it Git - helm.git/blob - helm/minidom/minidom.c
minidom.c : fixed memory leak
[helm.git] / helm / minidom / minidom.c
1 /*
2  * Copyright (C) 2000, Luca Padovani <luca.padovani@cs.unibo.it>.
3  * 
4  * This file is part of miniDOM, a minimal implementation of the
5  * Document Object Model
6  * 
7  * miniDOM is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  * 
12  * miniDOM is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with miniDOM; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20  * 
21  * For details, send a mail to <luca.padovani@cs.unibo.it>
22  */
23
24 #include <config.h>
25 #include <glib.h>
26 #include <parser.h>
27 #include <parserInternals.h>
28
29 #include "minidom.h"
30
31 gboolean
32 mdom_string_eq(mDOMConstStringRef s1, mDOMConstStringRef s2)
33 {
34   g_return_val_if_fail(s1 != NULL, FALSE);
35   g_return_val_if_fail(s2 != NULL, FALSE);
36
37   return strcmp(C_CONST_STRING(s1), C_CONST_STRING(s2)) ? FALSE : TRUE;
38 }
39
40 mDOMStringRef
41 mdom_string_dup(mDOMConstStringRef s)
42 {
43   g_return_val_if_fail(s != NULL, NULL);
44   return xmlStrdup(s);
45 }
46
47 void
48 mdom_string_free(mDOMStringRef s)
49 {
50   g_free(s);
51 }
52
53 mDOMDocRef
54 mdom_load(const char* file_name, gboolean subst, mDOMEntityResolver entity_resolver)
55 {
56   xmlParserCtxtPtr ctxt;
57   mDOMDocRef doc;
58
59   g_return_val_if_fail(file_name != NULL, NULL);
60
61   xmlSubstituteEntitiesDefault(subst);
62   
63   ctxt = xmlCreateFileParserCtxt(file_name);
64   if (ctxt == NULL) return NULL;
65   g_assert(ctxt->sax != NULL);
66   ctxt->sax->getEntity = entity_resolver;
67   
68   xmlParseDocument(ctxt);
69   
70   doc = ctxt->myDoc;
71   xmlFreeParserCtxt(ctxt);
72
73   return doc;
74 }
75
76 void
77 mdom_unload(mDOMDocRef doc)
78 {
79   g_return_if_fail(doc != NULL);
80   xmlFreeDoc(doc);
81 }
82
83 mDOMDocRef
84 mdom_doc_new(mDOMConstStringRef version)
85 {
86   mDOMDocRef doc;
87   
88   g_return_val_if_fail(version != NULL, NULL);
89   doc = xmlNewDoc(version);
90   g_return_val_if_fail(doc != NULL, NULL);
91
92   doc->extSubset = xmlNewDtd(doc, DOM_CONST_STRING("Entities"), NULL, NULL);
93
94   return doc;
95 }
96
97 void
98 mdom_doc_free(mDOMDocRef doc)
99 {
100   g_return_if_fail(doc != NULL);
101   xmlFreeDoc(doc);
102 }
103
104 mDOMEntityRef
105 mdom_doc_add_entity(mDOMDocRef doc, mDOMConstStringRef name, mDOMConstStringRef content)
106 {
107   g_return_val_if_fail(doc != NULL, NULL);
108   g_return_val_if_fail(name != NULL, NULL);
109   g_return_val_if_fail(content != NULL, NULL);
110 #ifdef HAVE_LIBXML2
111   return xmlAddDtdEntity(doc, name, XML_INTERNAL_GENERAL_ENTITY, NULL, NULL, content);
112 #else
113   xmlAddDtdEntity(doc, name, XML_INTERNAL_GENERAL_ENTITY, NULL, NULL, content);
114   return NULL;
115 #endif
116 }
117
118 mDOMEntityRef
119 mdom_doc_get_entity(mDOMDocRef doc, mDOMConstStringRef name)
120 {
121   g_return_val_if_fail(doc != NULL, NULL);
122   g_return_val_if_fail(name != NULL, NULL);
123   return xmlGetDtdEntity(doc, name);
124 }
125
126 mDOMEntityRef
127 mdom_get_predefined_entity(mDOMConstStringRef name)
128 {
129   g_return_val_if_fail(name != NULL, NULL);
130   return xmlGetPredefinedEntity(name);
131 }
132
133 mDOMConstStringRef
134 mdom_entity_get_content(mDOMEntityRef entity)
135 {
136   g_return_val_if_fail(entity != NULL, NULL);
137   return entity->content;
138 }
139
140 mDOMNodeRef
141 mdom_doc_get_root_node(mDOMDocRef doc)
142 {
143   g_return_val_if_fail(doc != NULL, NULL);
144   return xmlDocGetRootElement(doc);
145 }
146
147 void
148 mdom_node_set_user_data(mDOMNodeRef node, gpointer user_data)
149 {
150   g_return_if_fail(node != NULL);
151 #ifndef XML_WITHOUT_CORBA
152   node->_private = user_data;
153 #else
154   g_assert_not_reached();
155 #endif
156 }
157
158 gpointer
159 mdom_node_get_user_data(mDOMNodeRef node)
160 {
161   g_return_val_if_fail(node != NULL, NULL);
162 #ifndef XML_WITHOUT_CORBA
163   return node->_private;
164 #else
165   g_assert_not_reached();
166 #endif
167 }
168
169 gboolean
170 mdom_node_is_text(mDOMNodeRef node)
171 {
172   g_return_val_if_fail(node != NULL, FALSE);
173   return xmlNodeIsText(node) ? TRUE : FALSE;
174 }
175
176 gboolean
177 mdom_node_is_element(mDOMNodeRef node)
178 {
179   g_return_val_if_fail(node != NULL, FALSE);
180   return node->type == XML_ELEMENT_NODE;
181 }
182
183 gboolean
184 mdom_node_is_blank(mDOMNodeRef node)
185 {
186   g_return_val_if_fail(node != NULL, FALSE);
187 #ifdef HAVE_LIBXML2
188   return xmlIsBlankNode(node) ? TRUE : FALSE;  
189 #else
190   return FALSE;
191 #endif
192 }
193
194 gboolean
195 mdom_node_is_entity_ref(mDOMNodeRef node)
196 {
197   g_return_val_if_fail(node != NULL, FALSE);
198   return node->type == XML_ENTITY_REF_NODE;
199 }
200
201 guint 
202 mdom_node_get_type(mDOMNodeRef node)
203 {
204   g_return_val_if_fail(node != NULL, 0);
205   return node->type;
206 }
207
208 mDOMConstStringRef
209 mdom_node_get_name(mDOMNodeRef node)
210 {
211   g_return_val_if_fail(node != NULL, NULL);
212   return node->name;
213 }
214
215 mDOMConstStringRef
216 mdom_node_get_ns_uri(mDOMNodeRef node)
217 {
218   g_return_val_if_fail(node != NULL, NULL);
219   if (node->ns == NULL) return NULL;
220   return node->ns->href;
221 }
222
223 mDOMStringRef
224 mdom_node_get_attribute(mDOMNodeRef node, mDOMConstStringRef name)
225 {
226   g_return_val_if_fail(node != NULL, NULL);
227   g_return_val_if_fail(name != NULL, NULL);
228   return xmlGetProp(node, name);
229 }
230
231 mDOMStringRef
232 mdom_node_get_attribute_ns(mDOMNodeRef node, mDOMConstStringRef name, mDOMConstStringRef uri)
233 {
234   g_return_val_if_fail(node != NULL, NULL);
235   g_return_val_if_fail(uri != NULL, NULL);
236   g_return_val_if_fail(name != NULL, NULL);
237   g_return_val_if_fail(mdom_node_is_element(node), NULL);
238   return xmlGetNsProp(node, name, uri);
239 }
240
241 gboolean
242 mdom_node_has_attribute(mDOMNodeRef node, mDOMConstStringRef name)
243 {
244 #ifndef HAVE_LIBXML2
245   mDOMStringRef s = NULL;
246 #endif /* HAVE_LIBXML2 */
247   g_return_val_if_fail(node != NULL, FALSE);
248   g_return_val_if_fail(name != NULL, FALSE);
249 #ifdef HAVE_LIBXML2
250   return (xmlHasProp(node, name) != NULL) ? TRUE : FALSE;
251 #else
252   s = xmlGetProp(node, name);
253   if (s != NULL) {
254     mdom_string_free(s);
255     return TRUE;
256   }
257   return FALSE;
258 #endif /* HAVE_LIBXML2 */
259 }
260
261 mDOMStringRef
262 mdom_node_get_content(mDOMNodeRef node)
263 {
264   g_return_val_if_fail(node != NULL, NULL);
265   return xmlNodeGetContent(node);
266 }
267
268 mDOMNodeRef
269 mdom_node_get_parent(mDOMNodeRef node)
270 {
271   g_return_val_if_fail(node != NULL, NULL);
272   return node->parent;
273 }
274
275 mDOMNodeRef
276 mdom_node_get_prev_sibling(mDOMNodeRef node)
277 {
278   g_return_val_if_fail(node != NULL, NULL);
279   return node->prev;
280 }
281
282 mDOMNodeRef
283 mdom_node_get_next_sibling(mDOMNodeRef node)
284 {
285   g_return_val_if_fail(node != NULL, NULL);
286   return node->next;
287 }
288
289 mDOMNodeRef
290 mdom_node_get_first_child(mDOMNodeRef node)
291 {
292   g_return_val_if_fail(node != NULL, NULL);
293 #ifdef HAVE_LIBXML2
294   return node->children;
295 #else
296   return node->childs;
297 #endif
298 }
299
300 mDOMAttrRef
301 mdom_node_get_first_attribute(mDOMNodeRef node)
302 {
303   g_return_val_if_fail(node != NULL, NULL);
304   return node->properties;
305 }
306
307 gboolean
308 mdom_node_is_first(mDOMNodeRef node)
309 {
310   g_return_val_if_fail(node != NULL, FALSE);
311   return node->prev == NULL;
312 }
313
314 gboolean
315 mdom_node_is_last(mDOMNodeRef node)
316 {
317   g_return_val_if_fail(node != NULL, FALSE);
318   return node->next == NULL;
319 }
320
321 mDOMConstStringRef
322 mdom_attr_get_name(mDOMAttrRef attr)
323 {
324   g_return_val_if_fail(attr != NULL, NULL);
325   return attr->name;
326 }
327
328 mDOMConstStringRef
329 mdom_attr_get_ns_uri(mDOMAttrRef attr)
330 {
331   g_return_val_if_fail(attr != NULL, NULL);
332   if (attr->ns == NULL) return NULL;
333   return attr->ns->href;
334 }
335
336 mDOMStringRef
337 mdom_attr_get_value(mDOMAttrRef attr)
338 {
339 #ifdef HAVE_LIBXML2
340   g_return_val_if_fail(attr != NULL, NULL);
341   return xmlNodeListGetString(attr->doc, attr->children, 1);
342 #else
343   mDOMNodeRef child;
344   g_return_val_if_fail(attr != NULL, NULL);
345
346   child = attr->val;
347   if (child == NULL) return NULL;
348   else return xmlNodeListGetString(child->doc, attr->val, 1);
349 #endif
350 }
351
352 mDOMAttrRef
353 mdom_attr_get_prev_sibling(mDOMAttrRef attr)
354 {
355 #ifdef HAVE_LIBXML2
356   g_return_val_if_fail(attr != NULL, NULL);
357   return attr->prev;
358 #else
359   /* in libxml 1.x there is no prev link in attributes */
360   return NULL;
361 #endif
362 }
363
364 mDOMAttrRef
365 mdom_attr_get_next_sibling(mDOMAttrRef attr)
366 {
367   g_return_val_if_fail(attr != NULL, NULL);
368   return attr->next;
369 }
370
371 mDOMNodeRef
372 mdom_attr_get_parent(mDOMAttrRef attr)
373 {
374   g_return_val_if_fail(attr != NULL, NULL);
375 #ifdef HAVE_LIBXML2
376   return attr->parent;
377 #else
378   return attr->node;
379 #endif
380 }