]> matita.cs.unibo.it Git - helm.git/blob - helm/minidom/minidom.c
Initial revision
[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   xmlSAXHandler sax;
57   xmlParserCtxtPtr ctxt;
58   mDOMDocRef doc;
59
60   g_return_val_if_fail(file_name != NULL, NULL);
61
62   xmlSubstituteEntitiesDefault(subst);
63   
64   sax = xmlDefaultSAXHandler;
65   sax.getEntity = entity_resolver;
66   
67   ctxt = xmlCreateFileParserCtxt(file_name);
68   if (ctxt == NULL) return NULL;
69   
70   ctxt->sax = &sax;
71   
72   xmlParseDocument(ctxt);
73   
74   doc = ctxt->myDoc;
75   ctxt->sax = NULL;
76   xmlFreeParserCtxt(ctxt);
77
78   return doc;
79 }
80
81 void
82 mdom_unload(mDOMDocRef doc)
83 {
84   g_return_if_fail(doc != NULL);
85   xmlFreeDoc(doc);
86 }
87
88 mDOMDocRef
89 mdom_doc_new(mDOMConstStringRef version)
90 {
91   mDOMDocRef doc;
92   
93   g_return_val_if_fail(version != NULL, NULL);
94   doc = xmlNewDoc(version);
95   g_return_val_if_fail(doc != NULL, NULL);
96
97   doc->extSubset = xmlNewDtd(doc, DOM_CONST_STRING("Entities"), NULL, NULL);
98
99   return doc;
100 }
101
102 void
103 mdom_doc_free(mDOMDocRef doc)
104 {
105   g_return_if_fail(doc != NULL);
106   xmlFreeDoc(doc);
107 }
108
109 mDOMEntityRef
110 mdom_doc_add_entity(mDOMDocRef doc, mDOMConstStringRef name, mDOMConstStringRef content)
111 {
112   g_return_val_if_fail(doc != NULL, NULL);
113   g_return_val_if_fail(name != NULL, NULL);
114   g_return_val_if_fail(content != NULL, NULL);
115 #ifdef HAVE_LIBXML2
116   return xmlAddDtdEntity(doc, name, XML_INTERNAL_GENERAL_ENTITY, NULL, NULL, content);
117 #else
118   xmlAddDtdEntity(doc, name, XML_INTERNAL_GENERAL_ENTITY, NULL, NULL, content);
119   return NULL;
120 #endif
121 }
122
123 mDOMEntityRef
124 mdom_doc_get_entity(mDOMDocRef doc, mDOMConstStringRef name)
125 {
126   g_return_val_if_fail(doc != NULL, NULL);
127   g_return_val_if_fail(name != NULL, NULL);
128   return xmlGetDtdEntity(doc, name);
129 }
130
131 mDOMEntityRef
132 mdom_get_predefined_entity(mDOMConstStringRef name)
133 {
134   g_return_val_if_fail(name != NULL, NULL);
135   return xmlGetPredefinedEntity(name);
136 }
137
138 mDOMConstStringRef
139 mdom_entity_get_content(mDOMEntityRef entity)
140 {
141   g_return_val_if_fail(entity != NULL, NULL);
142   return entity->content;
143 }
144
145 mDOMNodeRef
146 mdom_doc_get_root_node(mDOMDocRef doc)
147 {
148   g_return_val_if_fail(doc != NULL, NULL);
149   return xmlDocGetRootElement(doc);
150 }
151
152 void
153 mdom_node_set_user_data(mDOMNodeRef node, gpointer user_data)
154 {
155   g_return_if_fail(node != NULL);
156 #ifndef XML_WITHOUT_CORBA
157   node->_private = user_data;
158 #else
159   g_assert_not_reached();
160 #endif
161 }
162
163 gpointer
164 mdom_node_get_user_data(mDOMNodeRef node)
165 {
166   g_return_val_if_fail(node != NULL, NULL);
167 #ifndef XML_WITHOUT_CORBA
168   return node->_private;
169 #else
170   g_assert_not_reached();
171 #endif
172 }
173
174 gboolean
175 mdom_node_is_text(mDOMNodeRef node)
176 {
177   g_return_val_if_fail(node != NULL, FALSE);
178   return xmlNodeIsText(node) ? TRUE : FALSE;
179 }
180
181 gboolean
182 mdom_node_is_element(mDOMNodeRef node)
183 {
184   g_return_val_if_fail(node != NULL, FALSE);
185   return node->type == XML_ELEMENT_NODE;
186 }
187
188 gboolean
189 mdom_node_is_blank(mDOMNodeRef node)
190 {
191   g_return_val_if_fail(node != NULL, FALSE);
192 #ifdef HAVE_LIBXML2
193   return xmlIsBlankNode(node) ? TRUE : FALSE;  
194 #else
195   return FALSE;
196 #endif
197 }
198
199 gboolean
200 mdom_node_is_entity_ref(mDOMNodeRef node)
201 {
202   g_return_val_if_fail(node != NULL, FALSE);
203   return node->type == XML_ENTITY_REF_NODE;
204 }
205
206 guint 
207 mdom_node_get_type(mDOMNodeRef node)
208 {
209   g_return_val_if_fail(node != NULL, 0);
210   return node->type;
211 }
212
213 mDOMConstStringRef
214 mdom_node_get_name(mDOMNodeRef node)
215 {
216   g_return_val_if_fail(node != NULL, NULL);
217   return node->name;
218 }
219
220 mDOMConstStringRef
221 mdom_node_get_ns_uri(mDOMNodeRef node)
222 {
223   g_return_val_if_fail(node != NULL, NULL);
224   if (node->ns == NULL) return NULL;
225   return node->ns->href;
226 }
227
228 mDOMStringRef
229 mdom_node_get_attribute(mDOMNodeRef node, mDOMConstStringRef name)
230 {
231   g_return_val_if_fail(node != NULL, NULL);
232   g_return_val_if_fail(name != NULL, NULL);
233   return xmlGetProp(node, name);
234 }
235
236 mDOMStringRef
237 mdom_node_get_attribute_ns(mDOMNodeRef node, mDOMConstStringRef name, mDOMConstStringRef uri)
238 {
239   g_return_val_if_fail(node != NULL, NULL);
240   g_return_val_if_fail(uri != NULL, NULL);
241   g_return_val_if_fail(name != NULL, NULL);
242   g_return_val_if_fail(mdom_node_is_element(node), NULL);
243   return xmlGetNsProp(node, name, uri);
244 }
245
246 gboolean
247 mdom_node_has_attribute(mDOMNodeRef node, mDOMConstStringRef name)
248 {
249 #ifndef HAVE_LIBXML2
250   mDOMStringRef s = NULL;
251 #endif /* HAVE_LIBXML2 */
252   g_return_val_if_fail(node != NULL, FALSE);
253   g_return_val_if_fail(name != NULL, FALSE);
254 #ifdef HAVE_LIBXML2
255   return (xmlHasProp(node, name) != NULL) ? TRUE : FALSE;
256 #else
257   s = xmlGetProp(node, name);
258   if (s != NULL) {
259     mdom_string_free(s);
260     return TRUE;
261   }
262   return FALSE;
263 #endif /* HAVE_LIBXML2 */
264 }
265
266 mDOMStringRef
267 mdom_node_get_content(mDOMNodeRef node)
268 {
269   g_return_val_if_fail(node != NULL, NULL);
270   return xmlNodeGetContent(node);
271 }
272
273 mDOMNodeRef
274 mdom_node_get_parent(mDOMNodeRef node)
275 {
276   g_return_val_if_fail(node != NULL, NULL);
277   return node->parent;
278 }
279
280 mDOMNodeRef
281 mdom_node_get_prev_sibling(mDOMNodeRef node)
282 {
283   g_return_val_if_fail(node != NULL, NULL);
284   return node->prev;
285 }
286
287 mDOMNodeRef
288 mdom_node_get_next_sibling(mDOMNodeRef node)
289 {
290   g_return_val_if_fail(node != NULL, NULL);
291   return node->next;
292 }
293
294 mDOMNodeRef
295 mdom_node_get_first_child(mDOMNodeRef node)
296 {
297   g_return_val_if_fail(node != NULL, NULL);
298 #ifdef HAVE_LIBXML2
299   return node->children;
300 #else
301   return node->childs;
302 #endif
303 }
304
305 mDOMAttrRef
306 mdom_node_get_first_attribute(mDOMNodeRef node)
307 {
308   g_return_val_if_fail(node != NULL, NULL);
309   return node->properties;
310 }
311
312 gboolean
313 mdom_node_is_first(mDOMNodeRef node)
314 {
315   g_return_val_if_fail(node != NULL, FALSE);
316   return node->prev == NULL;
317 }
318
319 gboolean
320 mdom_node_is_last(mDOMNodeRef node)
321 {
322   g_return_val_if_fail(node != NULL, FALSE);
323   return node->next == NULL;
324 }
325
326 mDOMConstStringRef
327 mdom_attr_get_name(mDOMAttrRef attr)
328 {
329   g_return_val_if_fail(attr != NULL, NULL);
330   return attr->name;
331 }
332
333 mDOMConstStringRef
334 mdom_attr_get_ns_uri(mDOMAttrRef attr)
335 {
336   g_return_val_if_fail(attr != NULL, NULL);
337   if (attr->ns == NULL) return NULL;
338   return attr->ns->href;
339 }
340
341 mDOMStringRef
342 mdom_attr_get_value(mDOMAttrRef attr)
343 {
344 #ifdef HAVE_LIBXML2
345   g_return_val_if_fail(attr != NULL, NULL);
346   return xmlNodeListGetString(attr->doc, attr->children, 1);
347 #else
348   mDOMNodeRef child;
349   g_return_val_if_fail(attr != NULL, NULL);
350
351   child = attr->val;
352   if (child == NULL) return NULL;
353   else return xmlNodeListGetString(child->doc, attr->val, 1);
354 #endif
355 }
356
357 mDOMAttrRef
358 mdom_attr_get_prev_sibling(mDOMAttrRef attr)
359 {
360 #ifdef HAVE_LIBXML2
361   g_return_val_if_fail(attr != NULL, NULL);
362   return attr->prev;
363 #else
364   /* in libxml 1.x there is no prev link in attributes */
365   return NULL;
366 #endif
367 }
368
369 mDOMAttrRef
370 mdom_attr_get_next_sibling(mDOMAttrRef attr)
371 {
372   g_return_val_if_fail(attr != NULL, NULL);
373   return attr->next;
374 }
375
376 mDOMNodeRef
377 mdom_attr_get_parent(mDOMAttrRef attr)
378 {
379   g_return_val_if_fail(attr != NULL, NULL);
380 #ifdef HAVE_LIBXML2
381   return attr->parent;
382 #else
383   return attr->node;
384 #endif
385 }