]> matita.cs.unibo.it Git - helm.git/blob - helm/minidom/minidom.c
ocaml 3.09 transition
[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 <libxml/parser.h>
27 #include <libxml/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 gboolean
262 mdom_node_has_attribute_ns(mDOMNodeRef node, mDOMConstStringRef name, mDOMConstStringRef uri)
263 {
264   g_return_val_if_fail(node != NULL, FALSE);
265   g_return_val_if_fail(name != NULL, FALSE);
266   g_return_val_if_fail(uri != NULL, FALSE);
267 #ifdef HAVE_LIBXML2
268   return (xmlHasNsProp(node, name, uri) != NULL) ? TRUE : FALSE;
269 #else
270   return FALSE;
271 #endif /* HAVE_LIBXML2 */
272 }
273
274 mDOMStringRef
275 mdom_node_get_content(mDOMNodeRef node)
276 {
277   g_return_val_if_fail(node != NULL, NULL);
278   return xmlNodeGetContent(node);
279 }
280
281 mDOMNodeRef
282 mdom_node_get_parent(mDOMNodeRef node)
283 {
284   g_return_val_if_fail(node != NULL, NULL);
285   return node->parent;
286 }
287
288 mDOMNodeRef
289 mdom_node_get_prev_sibling(mDOMNodeRef node)
290 {
291   g_return_val_if_fail(node != NULL, NULL);
292   return node->prev;
293 }
294
295 mDOMNodeRef
296 mdom_node_get_next_sibling(mDOMNodeRef node)
297 {
298   g_return_val_if_fail(node != NULL, NULL);
299   return node->next;
300 }
301
302 mDOMNodeRef
303 mdom_node_get_first_child(mDOMNodeRef node)
304 {
305   g_return_val_if_fail(node != NULL, NULL);
306 #ifdef HAVE_LIBXML2
307   return node->children;
308 #else
309   return node->childs;
310 #endif
311 }
312
313 mDOMAttrRef
314 mdom_node_get_first_attribute(mDOMNodeRef node)
315 {
316   g_return_val_if_fail(node != NULL, NULL);
317   return node->properties;
318 }
319
320 gboolean
321 mdom_node_is_first(mDOMNodeRef node)
322 {
323   g_return_val_if_fail(node != NULL, FALSE);
324   return node->prev == NULL;
325 }
326
327 gboolean
328 mdom_node_is_last(mDOMNodeRef node)
329 {
330   g_return_val_if_fail(node != NULL, FALSE);
331   return node->next == NULL;
332 }
333
334 mDOMConstStringRef
335 mdom_attr_get_name(mDOMAttrRef attr)
336 {
337   g_return_val_if_fail(attr != NULL, NULL);
338   return attr->name;
339 }
340
341 mDOMConstStringRef
342 mdom_attr_get_ns_uri(mDOMAttrRef attr)
343 {
344   g_return_val_if_fail(attr != NULL, NULL);
345   if (attr->ns == NULL) return NULL;
346   return attr->ns->href;
347 }
348
349 mDOMStringRef
350 mdom_attr_get_value(mDOMAttrRef attr)
351 {
352 #ifdef HAVE_LIBXML2
353   g_return_val_if_fail(attr != NULL, NULL);
354   return xmlNodeListGetString(attr->doc, attr->children, 1);
355 #else
356   mDOMNodeRef child;
357   g_return_val_if_fail(attr != NULL, NULL);
358
359   child = attr->val;
360   if (child == NULL) return NULL;
361   else return xmlNodeListGetString(child->doc, attr->val, 1);
362 #endif
363 }
364
365 mDOMAttrRef
366 mdom_attr_get_prev_sibling(mDOMAttrRef attr)
367 {
368 #ifdef HAVE_LIBXML2
369   g_return_val_if_fail(attr != NULL, NULL);
370   return attr->prev;
371 #else
372   /* in libxml 1.x there is no prev link in attributes */
373   return NULL;
374 #endif
375 }
376
377 mDOMAttrRef
378 mdom_attr_get_next_sibling(mDOMAttrRef attr)
379 {
380   g_return_val_if_fail(attr != NULL, NULL);
381   return attr->next;
382 }
383
384 mDOMNodeRef
385 mdom_attr_get_parent(mDOMAttrRef attr)
386 {
387   g_return_val_if_fail(attr != NULL, NULL);
388 #ifdef HAVE_LIBXML2
389   return attr->parent;
390 #else
391   return attr->node;
392 #endif
393 }