XML: add insertion functions and creation ones 40/4740/9
Calixte DENIZET [Wed, 24 Aug 2011 09:10:54 +0000 (11:10 +0200)]
Change-Id: Ic058771311edf2a9982f6273e96993ff3e86b194

60 files changed:
scilab/modules/xml/Makefile.am
scilab/modules/xml/Makefile.in
scilab/modules/xml/includes/gw_xml.h
scilab/modules/xml/includes/xmlObjects.h [new file with mode: 0644]
scilab/modules/xml/includes/xml_mlist.h
scilab/modules/xml/sci_gateway/c/gw_xml.c
scilab/modules/xml/sci_gateway/cpp/sci_extraction.cpp
scilab/modules/xml/sci_gateway/cpp/sci_insertion.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLAttr_e.cpp
scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLAttr_length.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLAttr_size.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLList_e.cpp
scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLList_length.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLList_size.cpp
scilab/modules/xml/sci_gateway/cpp/sci_percent_c_i_XMLAttr.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_percent_foo_i_XMLList.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_percent_s_i_XMLList.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_print.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlAddNs.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_xmlAttrs.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_xmlClose.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlDocument.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_xmlDump.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlElement.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_xmlFormat.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_xmlGetNsByHref.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_xmlGetNsByPrefix.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_xmlNs.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_xmlRead.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlReadStr.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_xmlWrite.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/cpp/sci_xmlXPath.cpp
scilab/modules/xml/sci_gateway/xml_gateway.xml
scilab/modules/xml/src/c/XMLMlistsManagement.c [moved from scilab/modules/xml/src/c/createMlists.c with 64% similarity]
scilab/modules/xml/src/cpp/VariableScope.cpp
scilab/modules/xml/src/cpp/VariableScope.hxx
scilab/modules/xml/src/cpp/XMLAttr.cpp
scilab/modules/xml/src/cpp/XMLAttr.hxx
scilab/modules/xml/src/cpp/XMLDocument.cpp
scilab/modules/xml/src/cpp/XMLDocument.hxx
scilab/modules/xml/src/cpp/XMLElement.cpp
scilab/modules/xml/src/cpp/XMLElement.hxx
scilab/modules/xml/src/cpp/XMLList.cpp
scilab/modules/xml/src/cpp/XMLList.hxx
scilab/modules/xml/src/cpp/XMLList_insertion.hpp [new file with mode: 0644]
scilab/modules/xml/src/cpp/XMLNodeList.cpp
scilab/modules/xml/src/cpp/XMLNodeList.hxx
scilab/modules/xml/src/cpp/XMLNodeSet.cpp
scilab/modules/xml/src/cpp/XMLNodeSet.hxx
scilab/modules/xml/src/cpp/XMLNotHandledElement.cpp
scilab/modules/xml/src/cpp/XMLNotHandledElement.hxx
scilab/modules/xml/src/cpp/XMLNs.cpp
scilab/modules/xml/src/cpp/XMLNs.hxx
scilab/modules/xml/src/cpp/XMLObject.cpp
scilab/modules/xml/src/cpp/XMLObject.hxx
scilab/modules/xml/src/cpp/XMLRhsValue.hxx [new file with mode: 0644]
scilab/modules/xml/src/cpp/XMLXPath.cpp
scilab/modules/xml/src/cpp/XMLXPath.hxx
scilab/modules/xml/src/cpp/extraction.hpp
scilab/modules/xml/src/cpp/insertion.hpp [new file with mode: 0644]

index c5f156e..e9c032d 100644 (file)
@@ -28,7 +28,7 @@ include $(top_srcdir)/Makefile.incl.am
 
 XML_JNI_SOURCES = 
 
-XML_C_SOURCES = src/c/createMlists.c
+XML_C_SOURCES = src/c/XMLMlistsManagement.c
 
 XML_CPP_SOURCES = src/cpp/VariableScope.cpp \
                  src/cpp/XMLObject.cpp \
@@ -47,13 +47,29 @@ GATEWAY_C_SOURCES = sci_gateway/c/gw_xml.c
 GATEWAY_CPP_SOURCES = sci_gateway/cpp/sci_xmlRead.cpp \
                       sci_gateway/cpp/sci_xmlXPath.cpp \
                      sci_gateway/cpp/sci_extraction.cpp \
+                     sci_gateway/cpp/sci_insertion.cpp \
                      sci_gateway/cpp/sci_print.cpp \
                      sci_gateway/cpp/sci_xmlGetOpenStreams.cpp \
                      sci_gateway/cpp/sci_xmlClose.cpp \
                      sci_gateway/cpp/sci_xmlDump.cpp \
+                     sci_gateway/cpp/sci_xmlReadStr.cpp \
+                     sci_gateway/cpp/sci_xmlFormat.cpp \
                      sci_gateway/cpp/sci_percent_XMLList_e.cpp \
                      sci_gateway/cpp/sci_percent_XMLAttr_e.cpp \
-                     sci_gateway/cpp/sci_percent_XMLList_size.cpp
+                     sci_gateway/cpp/sci_percent_XMLList_size.cpp \
+                     sci_gateway/cpp/sci_percent_XMLAttr_size.cpp \
+                     sci_gateway/cpp/sci_percent_XMLList_length.cpp \
+                     sci_gateway/cpp/sci_percent_XMLAttr_length.cpp \
+                     sci_gateway/cpp/sci_percent_c_i_XMLAttr.cpp \
+                     sci_gateway/cpp/sci_percent_s_i_XMLList.cpp \
+                     sci_gateway/cpp/sci_xmlElement.cpp \
+                     sci_gateway/cpp/sci_xmlDocument.cpp \
+                     sci_gateway/cpp/sci_xmlNs.cpp \
+                     sci_gateway/cpp/sci_xmlAddNs.cpp \
+                     sci_gateway/cpp/sci_xmlGetNsByHref.cpp \
+                     sci_gateway/cpp/sci_xmlGetNsByPrefix.cpp \
+                     sci_gateway/cpp/sci_xmlWrite.cpp \
+                     sci_gateway/cpp/sci_percent_foo_i_XMLList.cpp
 
 libscixml_la_CFLAGS= -I$(srcdir)/includes/ \
                     -I$(top_srcdir)/libs/MALLOC/includes/ \
index 46823db..a5d2907 100644 (file)
@@ -116,7 +116,7 @@ am__installdirs = "$(DESTDIR)$(pkglibdir)" \
        "$(DESTDIR)$(libscixml_la_sci_gatewaydir)"
 LTLIBRARIES = $(noinst_LTLIBRARIES) $(pkglib_LTLIBRARIES)
 libscixml_algo_la_LIBADD =
-am__objects_1 = libscixml_algo_la-createMlists.lo
+am__objects_1 = libscixml_algo_la-XMLMlistsManagement.lo
 am__objects_2 =
 am__objects_3 = libscixml_algo_la-VariableScope.lo \
        libscixml_algo_la-XMLObject.lo \
@@ -144,12 +144,24 @@ libscixml_la_DEPENDENCIES = libscixml-algo.la \
 am__objects_4 = libscixml_la-gw_xml.lo
 am__objects_5 = libscixml_la-sci_xmlRead.lo \
        libscixml_la-sci_xmlXPath.lo libscixml_la-sci_extraction.lo \
-       libscixml_la-sci_print.lo \
+       libscixml_la-sci_insertion.lo libscixml_la-sci_print.lo \
        libscixml_la-sci_xmlGetOpenStreams.lo \
        libscixml_la-sci_xmlClose.lo libscixml_la-sci_xmlDump.lo \
+       libscixml_la-sci_xmlReadStr.lo libscixml_la-sci_xmlFormat.lo \
        libscixml_la-sci_percent_XMLList_e.lo \
        libscixml_la-sci_percent_XMLAttr_e.lo \
-       libscixml_la-sci_percent_XMLList_size.lo
+       libscixml_la-sci_percent_XMLList_size.lo \
+       libscixml_la-sci_percent_XMLAttr_size.lo \
+       libscixml_la-sci_percent_XMLList_length.lo \
+       libscixml_la-sci_percent_XMLAttr_length.lo \
+       libscixml_la-sci_percent_c_i_XMLAttr.lo \
+       libscixml_la-sci_percent_s_i_XMLList.lo \
+       libscixml_la-sci_xmlElement.lo libscixml_la-sci_xmlDocument.lo \
+       libscixml_la-sci_xmlNs.lo libscixml_la-sci_xmlAddNs.lo \
+       libscixml_la-sci_xmlGetNsByHref.lo \
+       libscixml_la-sci_xmlGetNsByPrefix.lo \
+       libscixml_la-sci_xmlWrite.lo \
+       libscixml_la-sci_percent_foo_i_XMLList.lo
 am_libscixml_la_OBJECTS = $(am__objects_4) $(am__objects_5)
 libscixml_la_OBJECTS = $(am_libscixml_la_OBJECTS)
 libscixml_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
@@ -512,7 +524,7 @@ HELP_CHAPTERDIR = help/
 HELP_CHAPTERFILE = addchapter.sce
 HELP_CHAPTERLANG = en_US fr_FR pt_BR
 XML_JNI_SOURCES = 
-XML_C_SOURCES = src/c/createMlists.c
+XML_C_SOURCES = src/c/XMLMlistsManagement.c
 XML_CPP_SOURCES = src/cpp/VariableScope.cpp \
                  src/cpp/XMLObject.cpp \
                  src/cpp/XMLDocument.cpp \
@@ -529,13 +541,29 @@ GATEWAY_C_SOURCES = sci_gateway/c/gw_xml.c
 GATEWAY_CPP_SOURCES = sci_gateway/cpp/sci_xmlRead.cpp \
                       sci_gateway/cpp/sci_xmlXPath.cpp \
                      sci_gateway/cpp/sci_extraction.cpp \
+                     sci_gateway/cpp/sci_insertion.cpp \
                      sci_gateway/cpp/sci_print.cpp \
                      sci_gateway/cpp/sci_xmlGetOpenStreams.cpp \
                      sci_gateway/cpp/sci_xmlClose.cpp \
                      sci_gateway/cpp/sci_xmlDump.cpp \
+                     sci_gateway/cpp/sci_xmlReadStr.cpp \
+                     sci_gateway/cpp/sci_xmlFormat.cpp \
                      sci_gateway/cpp/sci_percent_XMLList_e.cpp \
                      sci_gateway/cpp/sci_percent_XMLAttr_e.cpp \
-                     sci_gateway/cpp/sci_percent_XMLList_size.cpp
+                     sci_gateway/cpp/sci_percent_XMLList_size.cpp \
+                     sci_gateway/cpp/sci_percent_XMLAttr_size.cpp \
+                     sci_gateway/cpp/sci_percent_XMLList_length.cpp \
+                     sci_gateway/cpp/sci_percent_XMLAttr_length.cpp \
+                     sci_gateway/cpp/sci_percent_c_i_XMLAttr.cpp \
+                     sci_gateway/cpp/sci_percent_s_i_XMLList.cpp \
+                     sci_gateway/cpp/sci_xmlElement.cpp \
+                     sci_gateway/cpp/sci_xmlDocument.cpp \
+                     sci_gateway/cpp/sci_xmlNs.cpp \
+                     sci_gateway/cpp/sci_xmlAddNs.cpp \
+                     sci_gateway/cpp/sci_xmlGetNsByHref.cpp \
+                     sci_gateway/cpp/sci_xmlGetNsByPrefix.cpp \
+                     sci_gateway/cpp/sci_xmlWrite.cpp \
+                     sci_gateway/cpp/sci_percent_foo_i_XMLList.cpp
 
 libscixml_la_CFLAGS = -I$(srcdir)/includes/ \
                     -I$(top_srcdir)/libs/MALLOC/includes/ \
@@ -669,23 +697,39 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_algo_la-XMLDocument.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_algo_la-XMLElement.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_algo_la-XMLList.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_algo_la-XMLMlistsManagement.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_algo_la-XMLNodeList.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_algo_la-XMLNodeSet.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_algo_la-XMLNotHandledElement.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_algo_la-XMLNs.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_algo_la-XMLObject.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_algo_la-XMLXPath.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_algo_la-createMlists.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-gw_xml.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_extraction.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_insertion.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_percent_XMLAttr_e.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_percent_XMLAttr_length.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_percent_XMLAttr_size.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_percent_XMLList_e.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_percent_XMLList_length.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_percent_XMLList_size.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_percent_c_i_XMLAttr.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_percent_foo_i_XMLList.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_percent_s_i_XMLList.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_print.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlAddNs.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlClose.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlDocument.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlDump.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlElement.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlFormat.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlGetNsByHref.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlGetNsByPrefix.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlGetOpenStreams.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlNs.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlRead.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlReadStr.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlWrite.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlXPath.Plo@am__quote@
 
 .c.o:
@@ -709,12 +753,12 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(LTCOMPILE) -c -o $@ $<
 
-libscixml_algo_la-createMlists.lo: src/c/createMlists.c
-@am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_algo_la_CPPFLAGS) $(CPPFLAGS) $(libscixml_algo_la_CFLAGS) $(CFLAGS) -MT libscixml_algo_la-createMlists.lo -MD -MP -MF $(DEPDIR)/libscixml_algo_la-createMlists.Tpo -c -o libscixml_algo_la-createMlists.lo `test -f 'src/c/createMlists.c' || echo '$(srcdir)/'`src/c/createMlists.c
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscixml_algo_la-createMlists.Tpo $(DEPDIR)/libscixml_algo_la-createMlists.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='src/c/createMlists.c' object='libscixml_algo_la-createMlists.lo' libtool=yes @AMDEPBACKSLASH@
+libscixml_algo_la-XMLMlistsManagement.lo: src/c/XMLMlistsManagement.c
+@am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_algo_la_CPPFLAGS) $(CPPFLAGS) $(libscixml_algo_la_CFLAGS) $(CFLAGS) -MT libscixml_algo_la-XMLMlistsManagement.lo -MD -MP -MF $(DEPDIR)/libscixml_algo_la-XMLMlistsManagement.Tpo -c -o libscixml_algo_la-XMLMlistsManagement.lo `test -f 'src/c/XMLMlistsManagement.c' || echo '$(srcdir)/'`src/c/XMLMlistsManagement.c
+@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscixml_algo_la-XMLMlistsManagement.Tpo $(DEPDIR)/libscixml_algo_la-XMLMlistsManagement.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='src/c/XMLMlistsManagement.c' object='libscixml_algo_la-XMLMlistsManagement.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_algo_la_CPPFLAGS) $(CPPFLAGS) $(libscixml_algo_la_CFLAGS) $(CFLAGS) -c -o libscixml_algo_la-createMlists.lo `test -f 'src/c/createMlists.c' || echo '$(srcdir)/'`src/c/createMlists.c
+@am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_algo_la_CPPFLAGS) $(CPPFLAGS) $(libscixml_algo_la_CFLAGS) $(CFLAGS) -c -o libscixml_algo_la-XMLMlistsManagement.lo `test -f 'src/c/XMLMlistsManagement.c' || echo '$(srcdir)/'`src/c/XMLMlistsManagement.c
 
 libscixml_la-gw_xml.lo: sci_gateway/c/gw_xml.c
 @am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(libscixml_la_CFLAGS) $(CFLAGS) -MT libscixml_la-gw_xml.lo -MD -MP -MF $(DEPDIR)/libscixml_la-gw_xml.Tpo -c -o libscixml_la-gw_xml.lo `test -f 'sci_gateway/c/gw_xml.c' || echo '$(srcdir)/'`sci_gateway/c/gw_xml.c
@@ -842,6 +886,13 @@ libscixml_la-sci_extraction.lo: sci_gateway/cpp/sci_extraction.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_extraction.lo `test -f 'sci_gateway/cpp/sci_extraction.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_extraction.cpp
 
+libscixml_la-sci_insertion.lo: sci_gateway/cpp/sci_insertion.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_insertion.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_insertion.Tpo -c -o libscixml_la-sci_insertion.lo `test -f 'sci_gateway/cpp/sci_insertion.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_insertion.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_insertion.Tpo $(DEPDIR)/libscixml_la-sci_insertion.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_insertion.cpp' object='libscixml_la-sci_insertion.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_insertion.lo `test -f 'sci_gateway/cpp/sci_insertion.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_insertion.cpp
+
 libscixml_la-sci_print.lo: sci_gateway/cpp/sci_print.cpp
 @am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_print.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_print.Tpo -c -o libscixml_la-sci_print.lo `test -f 'sci_gateway/cpp/sci_print.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_print.cpp
 @am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_print.Tpo $(DEPDIR)/libscixml_la-sci_print.Plo
@@ -870,6 +921,20 @@ libscixml_la-sci_xmlDump.lo: sci_gateway/cpp/sci_xmlDump.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlDump.lo `test -f 'sci_gateway/cpp/sci_xmlDump.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlDump.cpp
 
+libscixml_la-sci_xmlReadStr.lo: sci_gateway/cpp/sci_xmlReadStr.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_xmlReadStr.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_xmlReadStr.Tpo -c -o libscixml_la-sci_xmlReadStr.lo `test -f 'sci_gateway/cpp/sci_xmlReadStr.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlReadStr.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_xmlReadStr.Tpo $(DEPDIR)/libscixml_la-sci_xmlReadStr.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_xmlReadStr.cpp' object='libscixml_la-sci_xmlReadStr.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlReadStr.lo `test -f 'sci_gateway/cpp/sci_xmlReadStr.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlReadStr.cpp
+
+libscixml_la-sci_xmlFormat.lo: sci_gateway/cpp/sci_xmlFormat.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_xmlFormat.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_xmlFormat.Tpo -c -o libscixml_la-sci_xmlFormat.lo `test -f 'sci_gateway/cpp/sci_xmlFormat.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlFormat.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_xmlFormat.Tpo $(DEPDIR)/libscixml_la-sci_xmlFormat.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_xmlFormat.cpp' object='libscixml_la-sci_xmlFormat.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlFormat.lo `test -f 'sci_gateway/cpp/sci_xmlFormat.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlFormat.cpp
+
 libscixml_la-sci_percent_XMLList_e.lo: sci_gateway/cpp/sci_percent_XMLList_e.cpp
 @am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_percent_XMLList_e.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_percent_XMLList_e.Tpo -c -o libscixml_la-sci_percent_XMLList_e.lo `test -f 'sci_gateway/cpp/sci_percent_XMLList_e.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_percent_XMLList_e.cpp
 @am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_percent_XMLList_e.Tpo $(DEPDIR)/libscixml_la-sci_percent_XMLList_e.Plo
@@ -891,6 +956,97 @@ libscixml_la-sci_percent_XMLList_size.lo: sci_gateway/cpp/sci_percent_XMLList_si
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_percent_XMLList_size.lo `test -f 'sci_gateway/cpp/sci_percent_XMLList_size.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_percent_XMLList_size.cpp
 
+libscixml_la-sci_percent_XMLAttr_size.lo: sci_gateway/cpp/sci_percent_XMLAttr_size.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_percent_XMLAttr_size.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_percent_XMLAttr_size.Tpo -c -o libscixml_la-sci_percent_XMLAttr_size.lo `test -f 'sci_gateway/cpp/sci_percent_XMLAttr_size.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_percent_XMLAttr_size.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_percent_XMLAttr_size.Tpo $(DEPDIR)/libscixml_la-sci_percent_XMLAttr_size.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_percent_XMLAttr_size.cpp' object='libscixml_la-sci_percent_XMLAttr_size.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_percent_XMLAttr_size.lo `test -f 'sci_gateway/cpp/sci_percent_XMLAttr_size.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_percent_XMLAttr_size.cpp
+
+libscixml_la-sci_percent_XMLList_length.lo: sci_gateway/cpp/sci_percent_XMLList_length.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_percent_XMLList_length.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_percent_XMLList_length.Tpo -c -o libscixml_la-sci_percent_XMLList_length.lo `test -f 'sci_gateway/cpp/sci_percent_XMLList_length.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_percent_XMLList_length.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_percent_XMLList_length.Tpo $(DEPDIR)/libscixml_la-sci_percent_XMLList_length.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_percent_XMLList_length.cpp' object='libscixml_la-sci_percent_XMLList_length.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_percent_XMLList_length.lo `test -f 'sci_gateway/cpp/sci_percent_XMLList_length.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_percent_XMLList_length.cpp
+
+libscixml_la-sci_percent_XMLAttr_length.lo: sci_gateway/cpp/sci_percent_XMLAttr_length.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_percent_XMLAttr_length.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_percent_XMLAttr_length.Tpo -c -o libscixml_la-sci_percent_XMLAttr_length.lo `test -f 'sci_gateway/cpp/sci_percent_XMLAttr_length.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_percent_XMLAttr_length.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_percent_XMLAttr_length.Tpo $(DEPDIR)/libscixml_la-sci_percent_XMLAttr_length.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_percent_XMLAttr_length.cpp' object='libscixml_la-sci_percent_XMLAttr_length.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_percent_XMLAttr_length.lo `test -f 'sci_gateway/cpp/sci_percent_XMLAttr_length.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_percent_XMLAttr_length.cpp
+
+libscixml_la-sci_percent_c_i_XMLAttr.lo: sci_gateway/cpp/sci_percent_c_i_XMLAttr.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_percent_c_i_XMLAttr.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_percent_c_i_XMLAttr.Tpo -c -o libscixml_la-sci_percent_c_i_XMLAttr.lo `test -f 'sci_gateway/cpp/sci_percent_c_i_XMLAttr.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_percent_c_i_XMLAttr.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_percent_c_i_XMLAttr.Tpo $(DEPDIR)/libscixml_la-sci_percent_c_i_XMLAttr.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_percent_c_i_XMLAttr.cpp' object='libscixml_la-sci_percent_c_i_XMLAttr.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_percent_c_i_XMLAttr.lo `test -f 'sci_gateway/cpp/sci_percent_c_i_XMLAttr.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_percent_c_i_XMLAttr.cpp
+
+libscixml_la-sci_percent_s_i_XMLList.lo: sci_gateway/cpp/sci_percent_s_i_XMLList.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_percent_s_i_XMLList.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_percent_s_i_XMLList.Tpo -c -o libscixml_la-sci_percent_s_i_XMLList.lo `test -f 'sci_gateway/cpp/sci_percent_s_i_XMLList.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_percent_s_i_XMLList.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_percent_s_i_XMLList.Tpo $(DEPDIR)/libscixml_la-sci_percent_s_i_XMLList.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_percent_s_i_XMLList.cpp' object='libscixml_la-sci_percent_s_i_XMLList.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_percent_s_i_XMLList.lo `test -f 'sci_gateway/cpp/sci_percent_s_i_XMLList.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_percent_s_i_XMLList.cpp
+
+libscixml_la-sci_xmlElement.lo: sci_gateway/cpp/sci_xmlElement.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_xmlElement.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_xmlElement.Tpo -c -o libscixml_la-sci_xmlElement.lo `test -f 'sci_gateway/cpp/sci_xmlElement.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlElement.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_xmlElement.Tpo $(DEPDIR)/libscixml_la-sci_xmlElement.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_xmlElement.cpp' object='libscixml_la-sci_xmlElement.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlElement.lo `test -f 'sci_gateway/cpp/sci_xmlElement.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlElement.cpp
+
+libscixml_la-sci_xmlDocument.lo: sci_gateway/cpp/sci_xmlDocument.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_xmlDocument.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_xmlDocument.Tpo -c -o libscixml_la-sci_xmlDocument.lo `test -f 'sci_gateway/cpp/sci_xmlDocument.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlDocument.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_xmlDocument.Tpo $(DEPDIR)/libscixml_la-sci_xmlDocument.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_xmlDocument.cpp' object='libscixml_la-sci_xmlDocument.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlDocument.lo `test -f 'sci_gateway/cpp/sci_xmlDocument.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlDocument.cpp
+
+libscixml_la-sci_xmlNs.lo: sci_gateway/cpp/sci_xmlNs.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_xmlNs.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_xmlNs.Tpo -c -o libscixml_la-sci_xmlNs.lo `test -f 'sci_gateway/cpp/sci_xmlNs.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlNs.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_xmlNs.Tpo $(DEPDIR)/libscixml_la-sci_xmlNs.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_xmlNs.cpp' object='libscixml_la-sci_xmlNs.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlNs.lo `test -f 'sci_gateway/cpp/sci_xmlNs.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlNs.cpp
+
+libscixml_la-sci_xmlAddNs.lo: sci_gateway/cpp/sci_xmlAddNs.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_xmlAddNs.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_xmlAddNs.Tpo -c -o libscixml_la-sci_xmlAddNs.lo `test -f 'sci_gateway/cpp/sci_xmlAddNs.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlAddNs.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_xmlAddNs.Tpo $(DEPDIR)/libscixml_la-sci_xmlAddNs.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_xmlAddNs.cpp' object='libscixml_la-sci_xmlAddNs.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlAddNs.lo `test -f 'sci_gateway/cpp/sci_xmlAddNs.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlAddNs.cpp
+
+libscixml_la-sci_xmlGetNsByHref.lo: sci_gateway/cpp/sci_xmlGetNsByHref.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_xmlGetNsByHref.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_xmlGetNsByHref.Tpo -c -o libscixml_la-sci_xmlGetNsByHref.lo `test -f 'sci_gateway/cpp/sci_xmlGetNsByHref.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlGetNsByHref.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_xmlGetNsByHref.Tpo $(DEPDIR)/libscixml_la-sci_xmlGetNsByHref.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_xmlGetNsByHref.cpp' object='libscixml_la-sci_xmlGetNsByHref.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlGetNsByHref.lo `test -f 'sci_gateway/cpp/sci_xmlGetNsByHref.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlGetNsByHref.cpp
+
+libscixml_la-sci_xmlGetNsByPrefix.lo: sci_gateway/cpp/sci_xmlGetNsByPrefix.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_xmlGetNsByPrefix.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_xmlGetNsByPrefix.Tpo -c -o libscixml_la-sci_xmlGetNsByPrefix.lo `test -f 'sci_gateway/cpp/sci_xmlGetNsByPrefix.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlGetNsByPrefix.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_xmlGetNsByPrefix.Tpo $(DEPDIR)/libscixml_la-sci_xmlGetNsByPrefix.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_xmlGetNsByPrefix.cpp' object='libscixml_la-sci_xmlGetNsByPrefix.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlGetNsByPrefix.lo `test -f 'sci_gateway/cpp/sci_xmlGetNsByPrefix.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlGetNsByPrefix.cpp
+
+libscixml_la-sci_xmlWrite.lo: sci_gateway/cpp/sci_xmlWrite.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_xmlWrite.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_xmlWrite.Tpo -c -o libscixml_la-sci_xmlWrite.lo `test -f 'sci_gateway/cpp/sci_xmlWrite.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlWrite.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_xmlWrite.Tpo $(DEPDIR)/libscixml_la-sci_xmlWrite.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_xmlWrite.cpp' object='libscixml_la-sci_xmlWrite.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlWrite.lo `test -f 'sci_gateway/cpp/sci_xmlWrite.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlWrite.cpp
+
+libscixml_la-sci_percent_foo_i_XMLList.lo: sci_gateway/cpp/sci_percent_foo_i_XMLList.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_percent_foo_i_XMLList.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_percent_foo_i_XMLList.Tpo -c -o libscixml_la-sci_percent_foo_i_XMLList.lo `test -f 'sci_gateway/cpp/sci_percent_foo_i_XMLList.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_percent_foo_i_XMLList.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_percent_foo_i_XMLList.Tpo $(DEPDIR)/libscixml_la-sci_percent_foo_i_XMLList.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_percent_foo_i_XMLList.cpp' object='libscixml_la-sci_percent_foo_i_XMLList.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_percent_foo_i_XMLList.lo `test -f 'sci_gateway/cpp/sci_percent_foo_i_XMLList.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_percent_foo_i_XMLList.cpp
+
 mostlyclean-libtool:
        -rm -f *.lo
 
index 18dd634..72bc4c2 100644 (file)
@@ -1,22 +1,22 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
- * 
+ *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
- * are also available at    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
  *
  */
-/*--------------------------------------------------------------------------*/ 
+/*--------------------------------------------------------------------------*/
 #ifndef __GW_XML_H__
 #define __GW_XML_H__
-/*--------------------------------------------------------------------------*/ 
+/*--------------------------------------------------------------------------*/
 #include "dynlib_xml_scilab.h"
-/*--------------------------------------------------------------------------*/ 
+/*--------------------------------------------------------------------------*/
 XML_SCILAB_IMPEXP int gw_xml(void);
-/*--------------------------------------------------------------------------*/ 
+/*--------------------------------------------------------------------------*/
 int sci_xmlRead(char *fname, unsigned long fname_len);
 int sci_xmlClose(char *fname, unsigned long fname_len);
 int sci_xmlDump(char *fname, unsigned long fname_len);
@@ -32,7 +32,35 @@ int sci_percent_XMLElem_p(char *fname, unsigned long fname_len);
 int sci_percent_XMLNs_p(char *fname, unsigned long fname_len);
 int sci_percent_XMLList_p(char *fname, unsigned long fname_len);
 int sci_percent_XMLAttr_p(char *fname, unsigned long fname_len);
+int sci_percent_XMLSet_p(char *fname, unsigned long fname_len);
 int sci_percent_XMLList_size(char *fname, unsigned long fname_len);
-/*--------------------------------------------------------------------------*/ 
+int sci_percent_XMLSet_size(char *fname, unsigned long fname_len);
+int sci_percent_XMLAttr_size(char *fname, unsigned long fname_len);
+int sci_percent_c_i_XMLDoc(char *fname, unsigned long fname_len);
+int sci_percent_XMLElem_i_XMLDoc(char *fname, unsigned long fname_len);
+int sci_percent_c_i_XMLElem(char *fname, unsigned long fname_len);
+int sci_percent_XMLElem_i_XMLElem(char *fname, unsigned long fname_len);
+int sci_percent_XMLAttr_i_XMLElem(char *fname, unsigned long fname_len);
+int sci_percent_XMLList_i_XMLElem(char *fname, unsigned long fname_len);
+int sci_percent_XMLNs_i_XMLElem(char *fname, unsigned long fname_len);
+int sci_percent_c_i_XMLAttr(char *fname, unsigned long fname_len);
+int sci_percent_XMLElem_i_XMLList(char *fname, unsigned long fname_len);
+int sci_percent_XMLDoc_i_XMLList(char *fname, unsigned long fname_len);
+int sci_percent_c_i_XMLList(char *fname, unsigned long fname_len);
+int sci_percent_s_i_XMLList(char *fname, unsigned long fname_len);
+int sci_percent_foo_i_XMLList(char *fname, unsigned long fname_len);
+int sci_percent_XMLList_i_XMLList(char *fname, unsigned long fname_len);
+int sci_xmlReadStr(char *fname, unsigned long fname_len);
+int sci_xmlFormat(char *fname, unsigned long fname_len);
+int sci_xmlElement(char *fname, unsigned long fname_len);
+int sci_xmlDocument(char *fname, unsigned long fname_len);
+int sci_xmlNs(char *fname, unsigned long fname_len);
+int sci_xmlAddNs(char *fname, unsigned long fname_len);
+int sci_xmlGetNsByHref(char *fname, unsigned long fname_len);
+int sci_xmlGetNsByPrefix(char *fname, unsigned long fname_len);
+int sci_xmlWrite(char *fname, unsigned long fname_len);
+int sci_percent_XMLList_length(char *fname, unsigned long fname_len);
+int sci_percent_XMLAttr_length(char *fname, unsigned long fname_len);
+/*--------------------------------------------------------------------------*/
 #endif /* __GW_XML_H__ */
 /*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/xml/includes/xmlObjects.h b/scilab/modules/xml/includes/xmlObjects.h
new file mode 100644 (file)
index 0000000..1da60e4
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#ifndef __XML_OBJECTS__
+#define __XML_OBJECTS__
+#include "XMLObject.hxx"
+#include "XMLNodeList.hxx"
+#include "XMLNodeSet.hxx"
+#include "XMLAttr.hxx"
+#include "XMLNs.hxx"
+#include "XMLDocument.hxx"
+#include "XMLElement.hxx"
+#include "XMLNotHandledElement.hxx"
+#include "XMLXPath.hxx"
+#endif
index c191306..25c1482 100644 (file)
 #define XMLNAMESPACE 4
 #define XMLLIST 5
 #define XMLNOTHANDLED 6
+#define XMLSET 7
 
+/**
+ * Creates an XML object at a given position in the stack
+ * @param type the object type
+ * @param pos the position in the stack
+ * @param id the object id
+ * @return 1 if all is ok else 0
+ */
 int createXMLObjectAtPos(int type, int pos, int id);
+
+/**
+ * Creates an XML object at a given position in a list
+ * @param list the list addr
+ * @param stackpos the position of the list in the stack
+ * @param type the object type
+ * @param pos the position in the list
+ * @param id the object id
+ * @return 1 if all is ok else 0
+ */
 int createXMLObjectAtPosInList(int * list, int stackPos, int type, int pos, int id);
+
+/**
+ * Checks if a mlist has the good type
+ * @param mlist the mlist address
+ * @return 1 if the mlist has the good type, else 0.
+ */
 int isXMLDoc(int * mlist);
+
+/**
+ * Checks if a mlist has the good type
+ * @param mlist the mlist address
+ * @return 1 if the mlist has the good type, else 0.
+ */
 int isXMLElem(int * mlist);
+
+/**
+ * Checks if a mlist has the good type
+ * @param mlist the mlist address
+ * @return 1 if the mlist has the good type, else 0.
+ */
 int isXMLAttr(int * mlist);
+
+/**
+ * Checks if a mlist has the good type
+ * @param mlist the mlist address
+ * @return 1 if the mlist has the good type, else 0.
+ */
 int isXMLNs(int * mlist);
+
+/**
+ * Checks if a mlist has the good type
+ * @param mlist the mlist address
+ * @return 1 if the mlist has the good type, else 0.
+ */
 int isXMLList(int * mlist);
+
+/**
+ * Checks if a mlist has the good type
+ * @param mlist the mlist address
+ * @return 1 if the mlist has the good type, else 0.
+ */
 int isXMLObject(int * mlist);
+
+/**
+ * Checks if a mlist has the good type
+ * @param mlist the mlist address
+ * @return 1 if the mlist has the good type, else 0.
+ */
 int isXMLNotHandled(int * mlist);
+
+/**
+ * Checks if a mlist has the good type
+ * @param mlist the mlist address
+ * @return 1 if the mlist has the good type, else 0.
+ */
+int isXMLSet(int * mlist);
+
+/**
+ * Checks if a mlist has the good type
+ * @param mlist the mlist address
+ * @return 1 if the mlist has the good type, else 0.
+ */
 int getXMLObjectId(int * mlist);
 
 #endif /* __XML_MLIST_H__ */
index 5520057..0480156 100644 (file)
@@ -30,12 +30,64 @@ static gw_generic_table Tab[] =
     {sci_percent_XMLNs_e, "%XMLNs_e"},
     {sci_percent_XMLAttr_e, "%XMLAttr_e"},
     {sci_percent_XMLList_e, "%XMLList_e"},
+    {sci_percent_XMLList_e, "%XMLSet_e"},
     {sci_percent_XMLDoc_p, "%XMLDoc_p"},
     {sci_percent_XMLElem_p, "%XMLElem_p"},
     {sci_percent_XMLNs_p, "%XMLNs_p"},
     {sci_percent_XMLList_p, "%XMLList_p"},
     {sci_percent_XMLAttr_p, "%XMLAttr_p"},
-    {sci_percent_XMLList_size, "%XMLList_size"}
+    {sci_percent_XMLSet_p, "%XMLSet_p"},
+    {sci_percent_XMLList_size, "%XMLList_size"},
+    {sci_percent_XMLList_size, "%XMLSet_size"},
+    {sci_percent_XMLAttr_size, "%XMLAttr_size"},
+    {sci_percent_c_i_XMLDoc, "%c_i_XMLDoc"},
+    {sci_percent_XMLElem_i_XMLDoc, "%XMLElem_i_XMLDoc"},
+    {sci_percent_c_i_XMLElem, "%c_i_XMLElem"},
+    {sci_percent_XMLElem_i_XMLElem, "%XMLElem_i_XMLElem"},
+    {sci_percent_XMLAttr_i_XMLElem, "%XMLAttr_i_XMLElem"},
+    {sci_percent_XMLList_i_XMLElem, "%XMLList_i_XMLElem"},
+    {sci_percent_XMLNs_i_XMLElem, "%XMLNs_i_XMLElem"},
+    {sci_percent_c_i_XMLAttr, "%c_i_XMLAttr"},
+    {sci_percent_XMLElem_i_XMLList, "%XMLElem_i_XMLList"},
+    {sci_percent_XMLDoc_i_XMLList, "%XMLDoc_i_XMLList"},
+    {sci_percent_c_i_XMLList, "%c_i_XMLList"},
+    {sci_percent_s_i_XMLList, "%s_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%p_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%b_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%sp_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%spb_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%msp_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%i_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%h_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%fptr_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%mc_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%l_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%hm_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%ptr_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%ce_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%st_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%r_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%lss_i_XMLList"},
+    {sci_percent_foo_i_XMLList, "%ip_i_XMLList"},
+    {sci_percent_XMLList_i_XMLList, "%XMLList_i_XMLList"},
+    {sci_xmlReadStr, "xmlReadStr"},
+    {sci_xmlFormat, "xmlFormat"},
+    {sci_xmlElement, "xmlElement"},
+    {sci_xmlDocument, "xmlDocument"},
+    {sci_xmlNs, "xmlNs"},
+    {sci_xmlAddNs, "xmlAddNs"},
+    {sci_xmlGetNsByHref, "xmlGetNsByHref"},
+    {sci_xmlGetNsByPrefix, "xmlGetNsByPrefix"},
+    {sci_percent_XMLElem_e, "%XMLElem_6"},
+    {sci_percent_XMLDoc_e, "%XMLDoc_6"},
+    {sci_percent_XMLNs_e, "%XMLNs_6"},
+    {sci_percent_XMLAttr_e, "%XMLAttr_6"},
+    {sci_percent_XMLList_e, "%XMLList_6"},
+    {sci_percent_XMLList_e, "%XMLSet_6"},
+    {sci_xmlWrite, "xmlWrite"},
+    {sci_percent_XMLList_length, "%XMLList_length"},
+    {sci_percent_XMLList_length, "%XMLSet_length"},
+    {sci_percent_XMLAttr_length, "%XMLAttr_length"}
 };
 /*--------------------------------------------------------------------------*/
 int gw_xml(void)
index c11b17d..6b0f90a 100644 (file)
@@ -28,9 +28,4 @@ int sci_percent_XMLNs_e(char *fname, unsigned long fname_len)
 {
     return sci_extraction<XMLNs>(fname, fname_len);
 }
-/*--------------------------------------------------------------------------
-int sci_percent_XMLAttr_e(char *fname, unsigned long fname_len)
-{
-    return sci_extraction<XMLAttr>(fname, fname_len);
-}
 /*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_insertion.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_insertion.cpp
new file mode 100644 (file)
index 0000000..b120496
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "insertion.hpp"
+#include "XMLList_insertion.hpp"
+
+int sci_percent_c_i_XMLDoc(char *fname, unsigned long fname_len)
+{
+    return sci_insertion<XMLDocument, std::string>(fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+int sci_percent_XMLElem_i_XMLDoc(char *fname, unsigned long fname_len)
+{
+    return sci_insertion<XMLDocument, XMLElement>(fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+int sci_percent_c_i_XMLElem(char *fname, unsigned long fname_len)
+{
+    return sci_insertion<XMLElement, std::string>(fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+int sci_percent_XMLElem_i_XMLElem(char *fname, unsigned long fname_len)
+{
+    return sci_insertion<XMLElement, XMLElement>(fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+int sci_percent_XMLAttr_i_XMLElem(char *fname, unsigned long fname_len)
+{
+    return sci_insertion<XMLElement, XMLAttr>(fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+int sci_percent_XMLList_i_XMLElem(char *fname, unsigned long fname_len)
+{
+    return sci_insertion<XMLElement, XMLNodeList>(fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+int sci_percent_XMLNs_i_XMLElem(char *fname, unsigned long fname_len)
+{
+    return sci_insertion<XMLElement, XMLNs>(fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+int sci_percent_XMLElem_i_XMLList(char *fname, unsigned long fname_len)
+{
+    return sci_XMLList_insertion<XMLElement>(fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+int sci_percent_XMLDoc_i_XMLList(char *fname, unsigned long fname_len)
+{
+    return sci_XMLList_insertion<XMLDocument>(fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+int sci_percent_c_i_XMLList(char *fname, unsigned long fname_len)
+{
+    return sci_XMLList_insertion<std::string>(fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+int sci_percent_XMLList_i_XMLList(char *fname, unsigned long fname_len)
+{
+    return sci_XMLList_insertion<XMLNodeList>(fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
index e7d8f96..309fc92 100644 (file)
@@ -23,6 +23,7 @@ extern "C"
 #include "Scierror.h"
 #include "api_scilab.h"
 #include "xml_mlist.h"
+#include "localization.h"
 }
 
 using namespace org_modules_xml;
@@ -52,7 +53,7 @@ int sci_percent_XMLAttr_e(char * fname, unsigned long fname_len)
 
     if (!isStringType(pvApiCtx, prefixaddr))
     {
-        Scierror(999, "%s: Wrong type for input argument %i: String expected\n", fname, 1);
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, 1);
         return 0;
     }
 
@@ -69,7 +70,7 @@ int sci_percent_XMLAttr_e(char * fname, unsigned long fname_len)
 
         if (!isStringType(pvApiCtx, nameaddr))
         {
-            Scierror(999, "%s: Wrong type for input argument %i: String expected\n", fname, 1);
+            Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, 1);
             return 0;
         }
 
@@ -86,33 +87,31 @@ int sci_percent_XMLAttr_e(char * fname, unsigned long fname_len)
     id = getXMLObjectId(mlistaddr);
     attr = XMLObject::getFromId<XMLAttr>(id);
 
-    if (attr)
+    if (!attr)
     {
-        if (Rhs == 3)
-        {
-            value = attr->getAttributeValue(const_cast<const char *>(prefix), const_cast<const char *>(name));
-        }
-        else
-        {
-            name = prefix;
-            value = attr->getAttributeValue(const_cast<const char *>(name));
-        }
-
-        if (!value)
-        {
-            value = "";
-        }
+        Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
+        return 0;
+    }
 
-        err = createMatrixOfString(pvApiCtx, Rhs + 1, 1, 1, const_cast<const char * const *>(&value));
-        if (err.iErr)
-        {
-            printError(&err, 0);
-            return 0;
-        }
+    if (Rhs == 3)
+    {
+        value = attr->getAttributeValue(const_cast<const char *>(prefix), const_cast<const char *>(name));
     }
     else
     {
-        Scierror(999, "%s: XML object do not exist\n", fname);
+        name = prefix;
+        value = attr->getAttributeValue(const_cast<const char *>(name));
+    }
+
+    if (!value)
+    {
+        value = "";
+    }
+
+    err = createMatrixOfString(pvApiCtx, Rhs + 1, 1, 1, const_cast<const char * const *>(&value));
+    if (err.iErr)
+    {
+        printError(&err, 0);
         return 0;
     }
 
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLAttr_length.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLAttr_length.cpp
new file mode 100644 (file)
index 0000000..1805fe9
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLAttr.hxx"
+
+extern "C"
+{
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_percent_XMLAttr_length(char * fname, unsigned long fname_len)
+{
+    int id;
+    SciErr err;
+    double d;
+    int * addr = 0;
+    XMLAttr * attrs;
+
+    CheckLhs(1, 1);
+    CheckRhs(1, 1);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isXMLAttr(addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A %s expected.\n"), fname, 1, "XMLAttr");
+        return 0;
+
+    }
+
+    id = getXMLObjectId(addr);
+    attrs = XMLObject::getFromId<XMLAttr>(id);
+    if (!attrs)
+    {
+        Scierror(999, gettext("%s: XML Attributes does not exist.\n"), fname);
+        return 0;
+    }
+
+    d = (double)attrs->getSize();
+    createScalarDouble(pvApiCtx, Rhs + 1, d);
+
+    LhsVar(1) = Rhs + 1;
+    PutLhsVar();
+    return 0;
+}
+/*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLAttr_size.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLAttr_size.cpp
new file mode 100644 (file)
index 0000000..f70348f
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLAttr.hxx"
+
+extern "C"
+{
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_percent_XMLAttr_size(char * fname, unsigned long fname_len)
+{
+    int id;
+    SciErr err;
+    double d[2] = {1, 0};
+    int * addr = 0;
+    XMLAttr * attrs;
+
+    CheckLhs(1, 1);
+    CheckRhs(1, 1);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isXMLAttr(addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A %s expected.\n"), fname, 1, "XMLAttr");
+        return 0;
+
+    }
+
+    id = getXMLObjectId(addr);
+    attrs = XMLObject::getFromId<XMLAttr>(id);
+    if (!attrs)
+    {
+        Scierror(999, gettext("%s: XML Attributes does not exist.\n"), fname);
+        return 0;
+    }
+
+    d[1] = (double)attrs->getSize();
+    err = createMatrixOfDouble(pvApiCtx, Rhs + 1, 1, 2, d);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    LhsVar(1) = Rhs + 1;
+    PutLhsVar();
+    return 0;
+}
+/*--------------------------------------------------------------------------*/
index 4d78925..ac1eb1a 100644 (file)
@@ -21,14 +21,15 @@ extern "C"
 #include "Scierror.h"
 #include "api_scilab.h"
 #include "xml_mlist.h"
+#include "localization.h"
 }
 
 using namespace org_modules_xml;
 
 int sci_percent_XMLList_e(char * fname, unsigned long fname_len)
 {
-    XMLList * xmlList = 0;
-    XMLObject * elem;
+    XMLList * list = 0;
+    const XMLObject * elem;
     int id;
     SciErr err;
     double * dvalue = 0;
@@ -65,13 +66,13 @@ int sci_percent_XMLList_e(char * fname, unsigned long fname_len)
 
     if (row != 1 || col != 1 || typ != sci_matrix)
     {
-        Scierror(999, "%s: Wrong dimension for input argument %i: Single double expected\n", fname, 1);
+        Scierror(999, gettext("%s: Wrong dimension for input argument #%i: Single double expected.\n"), fname, 1);
         return 0;
     }
 
     if (isVarComplex(pvApiCtx, daddr))
     {
-        Scierror(999, "%s: Wrong type for input argument %i: double expected\n", fname, 1);
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: Double expected.\n"), fname, 1);
         return 0;
     }
 
@@ -90,18 +91,18 @@ int sci_percent_XMLList_e(char * fname, unsigned long fname_len)
     }
 
     id = getXMLObjectId(mlistaddr);
-    xmlList = XMLObject::getFromId<XMLList>(id);
-    if (!xmlList)
+    list = XMLObject::getFromId<XMLList>(id);
+    if (!list)
     {
-        Scierror(999, "%s: XML object do not exist\n", fname);
+        Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
         return 0;
     }
 
     index = (int)(*dvalue);
-    elem = xmlList->getListElement(index);
+    elem = list->getListElement(index);
     if (!elem)
     {
-        Scierror(999, "%s: Wrong index\n", fname);
+        Scierror(999, gettext("%s: Wrong index in the XMLList.\n"), fname);
         return 0;
     }
 
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLList_length.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLList_length.cpp
new file mode 100644 (file)
index 0000000..0680b1a
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLList.hxx"
+
+extern "C"
+{
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_percent_XMLList_length(char * fname, unsigned long fname_len)
+{
+    int id;
+    SciErr err;
+    double d;
+    int * addr = 0;
+    XMLList * list;
+
+    CheckLhs(1, 1);
+    CheckRhs(1, 1);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isXMLList(addr) && !isXMLSet(addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: XMLList or XMLSet expected.\n"), fname, 1);
+        return 0;
+
+    }
+
+    id = getXMLObjectId(addr);
+    list = XMLObject::getFromId<XMLList>(id);
+    if (!list)
+    {
+        Scierror(999, gettext("%s: XMLList does not exist.\n"), fname);
+        return 0;
+    }
+
+    d = (double)list->getSize();
+    createScalarDouble(pvApiCtx, Rhs + 1, d);
+
+    LhsVar(1) = Rhs + 1;
+    PutLhsVar();
+    return 0;
+}
+/*--------------------------------------------------------------------------*/
index 7a64c94..cb5ce83 100644 (file)
@@ -20,6 +20,7 @@ extern "C"
 #include "Scierror.h"
 #include "api_scilab.h"
 #include "xml_mlist.h"
+#include "localization.h"
 }
 
 using namespace org_modules_xml;
@@ -29,7 +30,7 @@ int sci_percent_XMLList_size(char * fname, unsigned long fname_len)
 {
     int id;
     SciErr err;
-    double d;
+    double d[2] = {1, 0};
     int * addr = 0;
     XMLList * list;
 
@@ -43,9 +44,9 @@ int sci_percent_XMLList_size(char * fname, unsigned long fname_len)
         return 0;
     }
 
-    if (!isXMLList(addr))
+    if (!isXMLList(addr) && !isXMLSet(addr))
     {
-        Scierror(999, "%s: Wrong type for input argument %i: %s expected\n", fname, 1, "XMLDoc");
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: XMLList or XMLSet expected.\n"), fname, 1);
         return 0;
 
     }
@@ -54,12 +55,17 @@ int sci_percent_XMLList_size(char * fname, unsigned long fname_len)
     list = XMLObject::getFromId<XMLList>(id);
     if (!list)
     {
-        Scierror(999, "%s: XML list does not exist\n", fname);
+        Scierror(999, gettext("%s: XMLList does not exist.\n"), fname);
         return 0;
     }
 
-    d = (double) list->getSize();
-    createScalarDouble(pvApiCtx, Rhs + 1, d);
+    d[1] = (double)list->getSize();
+    err = createMatrixOfDouble(pvApiCtx, Rhs + 1, 1, 2, d);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
 
     LhsVar(1) = Rhs + 1;
     PutLhsVar();
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_percent_c_i_XMLAttr.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_percent_c_i_XMLAttr.cpp
new file mode 100644 (file)
index 0000000..ae6bdba
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLElement.hxx"
+#include "XMLNs.hxx"
+#include "XMLAttr.hxx"
+
+extern "C"
+{
+#include <stdio.h>
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_percent_c_i_XMLAttr(char * fname, unsigned long fname_len)
+{
+    XMLAttr * a;
+    int lhsid;
+    SciErr err;
+    int * prefixaddr = 0;
+    int * nameaddr = 0;
+    int * rhsaddr = 0;
+    int * lhsaddr = 0;
+    char * name = 0;
+    char * prefix = 0;
+    char * value = 0;
+
+    CheckLhs(1, 1);
+    CheckRhs(3, 4);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &prefixaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isStringType(pvApiCtx, prefixaddr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, 1);
+        return 0;
+    }
+
+    getAllocatedSingleString(pvApiCtx, prefixaddr, &prefix);
+
+    if (Rhs == 4)
+    {
+        err = getVarAddressFromPosition(pvApiCtx, 2, &nameaddr);
+        if (err.iErr)
+        {
+            printError(&err, 0);
+            return 0;
+        }
+
+        if (!isStringType(pvApiCtx, nameaddr))
+        {
+            Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, 1);
+            return 0;
+        }
+
+        getAllocatedSingleString(pvApiCtx, nameaddr, &name);
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, Rhs - 1, &rhsaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, Rhs, &lhsaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    lhsid = getXMLObjectId(lhsaddr);
+    a = XMLObject::getFromId<XMLAttr>(lhsid);
+    if (!a)
+    {
+        Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
+        return 0;
+    }
+
+    if (!isStringType(pvApiCtx, rhsaddr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, Rhs - 1);
+        return 0;
+    }
+
+    getAllocatedSingleString(pvApiCtx, rhsaddr, &value);
+
+    if (Rhs == 3)
+    {
+        name = prefix;
+        a->setAttributeValue(name, value);
+    }
+    else
+    {
+        a->setAttributeValue(prefix, name, value);
+    }
+
+    a->createOnStack(Rhs + 1);
+    LhsVar(1) = Rhs + 1;
+    PutLhsVar();
+
+    return 0;
+}
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_percent_foo_i_XMLList.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_percent_foo_i_XMLList.cpp
new file mode 100644 (file)
index 0000000..3a01b0b
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLElement.hxx"
+#include "XMLNodeList.hxx"
+
+extern "C"
+{
+#include <stdio.h>
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "MALLOC.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_percent_foo_i_XMLList(char * fname, unsigned long fname_len)
+{
+    XMLNodeList * a;
+    int lhsid;
+    double index;
+    SciErr err;
+    char * prefix = 0;
+    char * underscore = 0;
+    char * format = 0;
+    int * indexaddr = 0;
+    int * rhsaddr = 0;
+    int * lhsaddr = 0;
+    int * retaddr = 0;
+    char * retstr = 0;
+    int iBegin = 2;
+    int mrhs = 1;
+    int mlhs = 1;
+
+    CheckLhs(1, 1);
+    CheckRhs(3, 3);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &indexaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isDoubleType(pvApiCtx, indexaddr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A double expected.\n"), fname, 1);
+        return 0;
+    }
+
+    getScalarDouble(pvApiCtx, indexaddr, &index);
+
+    err = getVarAddressFromPosition(pvApiCtx, 2, &rhsaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 3, &lhsaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    lhsid = getXMLObjectId(lhsaddr);
+    a = XMLObject::getFromId<XMLNodeList>(lhsid);
+    if (!a)
+    {
+        Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
+        return 0;
+    }
+
+    prefix = strdup(fname);
+    underscore = strchr(prefix, '_');
+    *underscore = '\0';
+    format = (char *)MALLOC(sizeof(char *) * (strlen(prefix) + strlen("_xmlFormat") + 1));
+    sprintf(format, "%s_xmlFormat", prefix);
+    free(prefix);
+
+    if (isNamedVarExist(pvApiCtx, format))
+    {
+        SciString(&iBegin, format, &mlhs, &mrhs);
+        FREE(format);
+        err = getVarAddressFromPosition(pvApiCtx, iBegin, &retaddr);
+        if (err.iErr)
+        {
+            printError(&err, 0);
+            return 0;
+        }
+
+        if (!isStringType(pvApiCtx, retaddr))
+        {
+            Scierror(999, gettext("%s: xmlFormat must return a string.\n"), fname);
+            return 0;
+        }
+
+        getAllocatedSingleString(pvApiCtx, retaddr, &retstr);
+        if (retstr)
+        {
+            a->setElementAtPosition(index, std::string(retstr));
+            a->createOnStack(Rhs + 1);
+            LhsVar(1) = Rhs + 1;
+        }
+    }
+    else
+    {
+        Scierror(999, gettext("%s: You must define %%s_xmlFormat function.\n"), fname, format);
+        FREE(format);
+        return 0;
+    }
+
+    PutLhsVar();
+
+    return 0;
+}
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_percent_s_i_XMLList.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_percent_s_i_XMLList.cpp
new file mode 100644 (file)
index 0000000..fb23c0d
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLElement.hxx"
+#include "XMLNodeList.hxx"
+
+extern "C"
+{
+#include <stdio.h>
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_percent_s_i_XMLList(char * fname, unsigned long fname_len)
+{
+    XMLNodeList * a;
+    int lhsid;
+    int row, col;
+    double index;
+    SciErr err;
+    int * indexaddr = 0;
+    int * rhsaddr = 0;
+    int * lhsaddr = 0;
+    int * retaddr = 0;
+    char * retstr = 0;
+    int iBegin = 2;
+    int mrhs = 1;
+    int mlhs = 1;
+
+    CheckLhs(1, 1);
+    CheckRhs(3, 3);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &indexaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isDoubleType(pvApiCtx, indexaddr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A double expected.\n"), fname, 1);
+        return 0;
+    }
+
+    getScalarDouble(pvApiCtx, indexaddr, &index);
+
+    err = getVarAddressFromPosition(pvApiCtx, 2, &rhsaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 3, &lhsaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    lhsid = getXMLObjectId(lhsaddr);
+    a = XMLObject::getFromId<XMLNodeList>(lhsid);
+    if (!a)
+    {
+        Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
+        return 0;
+    }
+
+    err = getMatrixOfDouble(pvApiCtx, rhsaddr, &row, &col, 0);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (row == 0 && col == 0)
+    {
+        a->removeElementAtPosition((int)index);
+        a->createOnStack(Rhs + 1);
+        LhsVar(1) = Rhs + 1;
+    }
+    else if (isNamedVarExist(pvApiCtx, "%s_xmlFormat"))
+    {
+        Nbvars = Max(Nbvars, Lhs + Rhs);
+        SciString(&iBegin, (char *)"%s_xmlFormat", &mlhs, &mrhs);
+        Nbvars = Max(Nbvars, Lhs + Rhs + mlhs + mrhs);
+
+        err = getVarAddressFromPosition(pvApiCtx, iBegin, &retaddr);
+        if (err.iErr)
+        {
+            printError(&err, 0);
+            return 0;
+        }
+
+        if (!isStringType(pvApiCtx, retaddr))
+        {
+            Scierror(999, gettext("%s: xmlFormat must return a string.\n"), fname);
+            return 0;
+        }
+
+        getAllocatedSingleString(pvApiCtx, retaddr, &retstr);
+        if (retstr)
+        {
+            a->setElementAtPosition(index, std::string(retstr));
+            a->createOnStack(Rhs + 1);
+            LhsVar(1) = Rhs + 1;
+        }
+    }
+    else
+    {
+        Scierror(999, gettext("%s: You must define %%s_xmlFormat function.\n"), fname);
+        return 0;
+    }
+
+    PutLhsVar();
+
+    return 0;
+}
index 068466c..5114296 100644 (file)
@@ -25,6 +25,7 @@ extern "C"
 #include "api_scilab.h"
 #include "sciprint.h"
 #include "xml_mlist.h"
+#include "localization.h"
 }
 
 using namespace org_modules_xml;
@@ -35,7 +36,7 @@ int sci_print(char * fname, unsigned long fname_len)
     XMLObject * obj;
     int id;
     SciErr err;
-    int *mlistaddr = 0;
+    int * mlistaddr = 0;
 
     CheckRhs(1, 1);
 
@@ -50,13 +51,12 @@ int sci_print(char * fname, unsigned long fname_len)
     obj = XMLObject::getFromId<XMLObject>(id);
     if (!obj)
     {
-        Scierror(999, "%s: XML object does not exist\n", fname);
+        Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
         return 0;
     }
 
-    std::string * str = obj->toString();
-    sciprint("%s\n", str->c_str());
-    delete str;
+    const std::string str = obj->toString();
+    sciprint("%s\n", str.c_str());
 
     return 0;
 }
@@ -86,3 +86,8 @@ int sci_percent_XMLAttr_p(char *fname, unsigned long fname_len)
     return sci_print(fname, fname_len);
 }
 /*--------------------------------------------------------------------------*/
+int sci_percent_XMLSet_p(char *fname, unsigned long fname_len)
+{
+    return sci_print(fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_xmlAddNs.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_xmlAddNs.cpp
new file mode 100644 (file)
index 0000000..4c0b96d
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLElement.hxx"
+#include "XMLNs.hxx"
+
+extern "C"
+{
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_xmlAddNs(char * fname, unsigned long fname_len)
+{
+    XMLElement * elem = 0;
+    XMLNs * ns = 0;
+    SciErr err;
+    int * addr = 0;
+    int i = 2;
+
+    CheckLhs(1, 1);
+    if (Rhs < 2)
+    {
+        Scierror(999, gettext("%s: Wrong number of input arguments: at least %d expected.\n"), fname, 2);
+        return 0;
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isXMLElem(addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A %s expected.\n"), fname, 1, "XMLElem");
+        return 0;
+    }
+
+    elem = XMLObject::getFromId<XMLElement>(getXMLObjectId(addr));
+    if (!elem)
+    {
+        Scierror(999, gettext("%s: XML Element does not exist.\n"), fname);
+        return 0;
+    }
+
+    for (; i <= Rhs; i++)
+    {
+        err = getVarAddressFromPosition(pvApiCtx, i, &addr);
+        if (err.iErr)
+        {
+            printError(&err, 0);
+            return 0;
+        }
+
+        if (!isXMLNs(addr))
+        {
+            Scierror(999, gettext("%s: Wrong type for input argument #%i: A %s expected.\n"), fname, i, "XMLNs");
+            return 0;
+        }
+
+        ns = XMLObject::getFromId<XMLNs>(getXMLObjectId(addr));
+        if (!ns)
+        {
+            Scierror(999, gettext("%s: XML Namespace does not exist.\n"), fname);
+            return 0;
+        }
+
+        elem->addNamespace(*ns);
+    }
+
+    LhsVar(1) = 0;
+    PutLhsVar();
+
+    return 0;
+}
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_xmlAttrs.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_xmlAttrs.cpp
new file mode 100644 (file)
index 0000000..7032c48
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLNs.hxx"
+#include "XMLElement.hxx"
+
+extern "C"
+{
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_xmlNs(char * fname, unsigned long fname_len)
+{
+    int * addr = 0;
+    SciErr err;
+    XMLNs * ns = 0;
+    XMLElement * elem = 0;
+    char * prefix = 0;
+    char * href = 0;
+    int i = 0;
+    char ** vars[] = {&prefix, &href};
+
+    CheckLhs(1, 1);
+    CheckRhs(3, 3);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isXMLElem(addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A %s expected.\n"), fname, 1, "XMLElem");
+        return 0;
+    }
+
+    elem = XMLObject::getFromId<XMLElement>(getXMLObjectId(addr));
+    if (!elem)
+    {
+        Scierror(999, gettext("%s: XML Element does not exist.\n"), fname);
+        return 0;
+    }
+
+    for (; i < Rhs - 1; i++)
+    {
+        err = getVarAddressFromPosition(pvApiCtx, i + 2, &addr);
+        if (err.iErr)
+        {
+            printError(&err, 0);
+            return 0;
+        }
+
+        if (!isStringType(pvApiCtx, addr))
+        {
+            Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, i + 2);
+            return 0;
+        }
+
+        getAllocatedSingleString(pvApiCtx, addr, vars[i]);
+    }
+
+    ns = new XMLNs(elem, prefix, href);
+
+    for (i = 0; i < Rhs - 1; i++)
+    {
+        freeAllocatedSingleString(*(vars[i]));
+    }
+
+    if (!ns->createOnStack(Rhs + 1))
+    {
+        return 0;
+    }
+
+    LhsVar(1) = Rhs + 1;
+    PutLhsVar();
+
+    return 0;
+}
+/*--------------------------------------------------------------------------*/
index 155b518..58f0a4b 100644 (file)
@@ -20,6 +20,7 @@ extern "C"
 #include "Scierror.h"
 #include "api_scilab.h"
 #include "xml_mlist.h"
+#include "localization.h"
 }
 
 using namespace org_modules_xml;
@@ -31,9 +32,15 @@ int sci_xmlClose(char * fname, unsigned long fname_len)
     SciErr err;
     int * addr = 0;
     org_modules_xml::XMLDocument * doc;
+    char * com = 0;
 
     CheckLhs(1, 1);
-    CheckRhs(1, 1);
+
+    if (Rhs == 0)
+    {
+        Scierror(999, gettext("%s: Wrong number of input arguments: at least %d expected.\n"), fname, 1);
+        return 0;
+    }
 
     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
     if (err.iErr)
@@ -42,21 +49,43 @@ int sci_xmlClose(char * fname, unsigned long fname_len)
         return 0;
     }
 
-    if (isXMLDoc(addr))
+    if (isStringType(pvApiCtx, addr))
     {
-        id = getXMLObjectId(addr);
-        doc = XMLObject::getFromId<org_modules_xml::XMLDocument>(id);
-        if (!doc)
+        getAllocatedSingleString(pvApiCtx, addr, &com);
+        if (!strcmp(com, "all"))
         {
-            Scierror(999, "%s: XML document does not exist\n", fname);
-            return 0;
+            XMLDocument::closeAllDocuments();
         }
-        delete doc;
+        freeAllocatedSingleString(com);
     }
     else
     {
-        Scierror(999, "%s: Wrong type for input argument %i: %s expected\n", fname, 1, "XMLDoc");
-        return 0;
+        for (int pos = 1; pos <= Rhs; pos++)
+        {
+            err = getVarAddressFromPosition(pvApiCtx, pos, &addr);
+            if (err.iErr)
+            {
+                printError(&err, 0);
+                return 0;
+            }
+
+            if (isXMLDoc(addr))
+            {
+                id = getXMLObjectId(addr);
+                doc = XMLObject::getFromId<XMLDocument>(id);
+                if (!doc)
+                {
+                    Scierror(999, gettext("%s: XML document does not exist.\n"), fname);
+                    return 0;
+                }
+                delete doc;
+            }
+            else
+            {
+                Scierror(999, gettext("%s: Wrong type for input argument #%i: A %s expected\n"), fname, 1, "XMLDoc");
+                return 0;
+            }
+        }
     }
 
     LhsVar(1) = 0;
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_xmlDocument.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_xmlDocument.cpp
new file mode 100644 (file)
index 0000000..3d059dd
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLDocument.hxx"
+
+extern "C"
+{
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_xmlDocument(char * fname, unsigned long fname_len)
+{
+    int * addr = 0;
+    SciErr err;
+    XMLDocument * doc = 0;
+    char * uri = 0;
+    char * version = 0;
+    int i = 0;
+    char ** vars[] = {&uri, &version};
+
+    CheckLhs(1, 1);
+    CheckRhs(0, 2);
+
+    for (; i < Rhs; i++)
+    {
+        err = getVarAddressFromPosition(pvApiCtx, i + 1, &addr);
+        if (err.iErr)
+        {
+            printError(&err, 0);
+            return 0;
+        }
+
+        if (!isStringType(pvApiCtx, addr))
+        {
+            Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, i + 1);
+            return 0;
+        }
+
+        getAllocatedSingleString(pvApiCtx, addr, vars[i]);
+    }
+
+    doc = new XMLDocument(uri, version);
+
+    for (i = 0; i < Rhs; i++)
+    {
+        freeAllocatedSingleString(*(vars[i]));
+    }
+
+    if (!doc->createOnStack(Rhs + 1))
+    {
+        return 0;
+    }
+
+    LhsVar(1) = Rhs + 1;
+    PutLhsVar();
+
+    return 0;
+}
+/*--------------------------------------------------------------------------*/
index d8e6036..0996063 100644 (file)
@@ -10,6 +10,8 @@
  *
  */
 
+#include <vector>
+
 #include "XMLObject.hxx"
 #include "XMLDocument.hxx"
 #include "XMLElement.hxx"
@@ -23,6 +25,7 @@ extern "C"
 #include "Scierror.h"
 #include "api_scilab.h"
 #include "xml_mlist.h"
+#include "localization.h"
 }
 
 using namespace org_modules_xml;
@@ -30,12 +33,14 @@ using namespace org_modules_xml;
 /*--------------------------------------------------------------------------*/
 int sci_xmlDump(char *fname, unsigned long fname_len)
 {
+    XMLObject * obj = 0;
     int id;
     int type;
     SciErr err;
-    int *addr = 0;
-    const char * dump;
-    std::string * str;
+    int * addr = 0;
+    char * dump;
+    std::string str;
+    std::vector<char *> vector;
 
     CheckLhs(1, 1);
     CheckRhs(1, 1);
@@ -50,16 +55,38 @@ int sci_xmlDump(char *fname, unsigned long fname_len)
     type = isXMLObject(addr);
     if (!type)
     {
-       Scierror(999, "%s: Wrong type for input argument %i: %s expected\n", fname, 1, "XML object");
-       return 0;
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A %s expected.\n"), fname, 1, "XML object");
+        return 0;
     }
 
     id = getXMLObjectId(addr);
-    str = XMLObject::getFromId<XMLObject>(id)->dump();
-    dump = str->c_str();
-    
-    err = createMatrixOfString(pvApiCtx, Rhs + 1, 1, 1, const_cast<const char * const *>(&dump));
-    delete str;
+    obj = XMLObject::getFromId<XMLObject>(id);
+    if (!obj)
+    {
+        Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
+        return 0;
+    }
+
+    str = obj->dump();
+    dump = const_cast<char *>(str.c_str());
+    vector = std::vector<char *>();
+
+    dump = strtok(dump, "\n\r");
+    while (dump)
+    {
+        vector.push_back(dump);
+        dump = strtok(0, "\n\r");
+    }
+
+    if (vector.size())
+    {
+        err = createMatrixOfString(pvApiCtx, Rhs + 1, vector.size(), 1, const_cast<const char * const *>(&(vector[0])));
+    }
+    else
+    {
+        err = createMatrixOfDouble(pvApiCtx, Rhs + 1, 0, 0, 0);
+    }
+
     if (err.iErr)
     {
         printError(&err, 0);
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_xmlElement.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_xmlElement.cpp
new file mode 100644 (file)
index 0000000..57e3711
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLDocument.hxx"
+#include "XMLElement.hxx"
+
+extern "C"
+{
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "libxml/tree.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_xmlElement(char * fname, unsigned long fname_len)
+{
+    XMLDocument * doc = 0;
+    XMLElement * elem = 0;
+    SciErr err;
+    int * addr = 0;
+    char * name = 0;
+
+    CheckLhs(1, 1);
+    CheckRhs(2, 2);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isXMLDoc(addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A %s expected.\n"), fname, 1, "XMLDoc");
+        return 0;
+    }
+
+    doc = XMLObject::getFromId<XMLDocument>(getXMLObjectId(addr));
+    if (!doc)
+    {
+        Scierror(999, gettext("%s: XML Document does not exist.\n"), fname);
+        return 0;
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isStringType(pvApiCtx, addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, 2);
+        return 0;
+    }
+
+    getAllocatedSingleString(pvApiCtx, addr, &name);
+
+    if (!name || !strlen(name) || xmlValidateName((const xmlChar *)name, 0))
+    {
+        freeAllocatedSingleString(name);
+        Scierror(999, gettext("%s: Bad input argument #%i: A valid XML name expected.\n"), fname, 2);
+        return 0;
+    }
+
+    elem = new XMLElement(*doc, name);
+    if (!elem->createOnStack(Rhs + 1))
+    {
+        return 0;
+    }
+
+    LhsVar(1) = Rhs + 1;
+    PutLhsVar();
+
+    return 0;
+}
+/*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_xmlFormat.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_xmlFormat.cpp
new file mode 100644 (file)
index 0000000..98daf72
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+extern "C"
+{
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "api_scilab.h"
+}
+
+/*--------------------------------------------------------------------------*/
+int sci_xmlFormat(char *fname, unsigned long fname_len)
+{
+    CheckRhs(1, 1);
+    CheckLhs(1, 1);
+
+    OverLoad(1);
+
+    return 0;
+}
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_xmlGetNsByHref.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_xmlGetNsByHref.cpp
new file mode 100644 (file)
index 0000000..6943f59
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLElement.hxx"
+#include "XMLNs.hxx"
+
+extern "C"
+{
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_xmlGetNsByHref(char * fname, unsigned long fname_len)
+{
+    XMLElement * elem = 0;
+    const XMLNs * ns = 0;
+    char * href = 0;
+    SciErr err;
+    int * addr = 0;
+
+    CheckLhs(1, 1);
+    CheckRhs(2, 2);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isXMLElem(addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A %s expected.\n"), fname, 1, "XMLElem");
+        return 0;
+    }
+
+    elem = XMLObject::getFromId<XMLElement>(getXMLObjectId(addr));
+    if (!elem)
+    {
+        Scierror(999, gettext("%s: XML Element does not exist.\n"), fname);
+        return 0;
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isStringType(pvApiCtx, addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, 2);
+        return 0;
+    }
+
+    getAllocatedSingleString(pvApiCtx, addr, &href);
+
+    if (!strlen(href))
+    {
+        freeAllocatedSingleString(href);
+        Scierror(999, gettext("%s: Wrong size for input argument #%d: Non-empty string expected.\n"), fname, 2);
+        return 0;
+    }
+
+    ns = elem->getNamespaceByHref((const char *)href);
+    freeAllocatedSingleString(href);
+
+    if (!ns->createOnStack(Rhs + 1))
+    {
+        return 0;
+    }
+
+    LhsVar(1) = Rhs + 1;
+    PutLhsVar();
+
+    return 0;
+}
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_xmlGetNsByPrefix.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_xmlGetNsByPrefix.cpp
new file mode 100644 (file)
index 0000000..aa5bc0f
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLElement.hxx"
+#include "XMLNs.hxx"
+
+extern "C"
+{
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_xmlGetNsByPrefix(char * fname, unsigned long fname_len)
+{
+    XMLElement * elem = 0;
+    const XMLNs * ns = 0;
+    char * href = 0;
+    SciErr err;
+    int * addr = 0;
+
+    CheckLhs(1, 1);
+    CheckRhs(2, 2);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isXMLElem(addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A %s expected.\n"), fname, 1, "XMLElem");
+        return 0;
+    }
+
+    elem = XMLObject::getFromId<XMLElement>(getXMLObjectId(addr));
+    if (!elem)
+    {
+        Scierror(999, gettext("%s: XML Element does not exist.\n"), fname);
+        return 0;
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isStringType(pvApiCtx, addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, 2);
+        return 0;
+    }
+
+    getAllocatedSingleString(pvApiCtx, addr, &href);
+
+    if (!strlen(href))
+    {
+        freeAllocatedSingleString(href);
+        Scierror(999, gettext("%s: Wrong size for input argument #%d: Non-empty string expected.\n"), fname, 2);
+        return 0;
+    }
+
+    ns = elem->getNamespaceByPrefix((const char *)href);
+    freeAllocatedSingleString(href);
+
+    if (!ns->createOnStack(Rhs + 1))
+    {
+        return 0;
+    }
+
+    LhsVar(1) = Rhs + 1;
+    PutLhsVar();
+
+    return 0;
+}
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_xmlNs.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_xmlNs.cpp
new file mode 100644 (file)
index 0000000..ffbf859
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLNs.hxx"
+#include "XMLElement.hxx"
+
+extern "C"
+{
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_xmlNs(char * fname, unsigned long fname_len)
+{
+    int * addr = 0;
+    SciErr err;
+    XMLNs * ns = 0;
+    XMLElement * elem = 0;
+    char * prefix = 0;
+    char * href = 0;
+    int i = 0;
+    char ** vars[] = {&prefix, &href};
+
+    CheckLhs(1, 1);
+    CheckRhs(3, 3);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isXMLElem(addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A %s expected.\n"), fname, 1, "XMLElem");
+        return 0;
+    }
+
+    elem = XMLObject::getFromId<XMLElement>(getXMLObjectId(addr));
+    if (!elem)
+    {
+        Scierror(999, gettext("%s: XML Element does not exist.\n"), fname);
+        return 0;
+    }
+
+    for (; i < Rhs - 1; i++)
+    {
+        err = getVarAddressFromPosition(pvApiCtx, i + 2, &addr);
+        if (err.iErr)
+        {
+            printError(&err, 0);
+            return 0;
+        }
+
+        if (!isStringType(pvApiCtx, addr))
+        {
+            Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, i + 2);
+            return 0;
+        }
+
+        getAllocatedSingleString(pvApiCtx, addr, vars[i]);
+    }
+
+    ns = new XMLNs(*elem, prefix, href);
+
+    for (i = 0; i < Rhs - 1; i++)
+    {
+        freeAllocatedSingleString(*(vars[i]));
+    }
+
+    if (!ns->createOnStack(Rhs + 1))
+    {
+        return 0;
+    }
+
+    LhsVar(1) = Rhs + 1;
+    PutLhsVar();
+
+    return 0;
+}
+/*--------------------------------------------------------------------------*/
index c8f08c1..461c573 100644 (file)
@@ -10,7 +10,8 @@
  *
  */
 
-#include <iostream>
+#include "XMLObject.hxx"
+#include "XMLDocument.hxx"
 
 extern "C"
 {
@@ -20,6 +21,7 @@ extern "C"
 #include "Scierror.h"
 #include "api_scilab.h"
 #include "xml_mlist.h"
+#include "localization.h"
 }
 
 #include "XMLObject.hxx"
@@ -29,18 +31,19 @@ extern "C"
 using namespace org_modules_xml;
 
 /*--------------------------------------------------------------------------*/
-int sci_xmlRead(char *fname, unsigned long fname_len)
+int sci_xmlRead(char * fname, unsigned long fname_len)
 {
-    org_modules_xml::XMLDocument *doc;
-    
+    org_modules_xml::XMLDocument * doc;
     SciErr err;
-    int *addr = 0;
-    char *path = 0;
-    char *error = 0;
-    
+    int * addr = 0;
+    char * path = 0;
+    char * error = 0;
+    bool validate = false;
+    int validateParam;
+
     CheckLhs(1, 1);
-    CheckRhs(1, 1);
-   
+    CheckRhs(1, 2);
+
     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
     if (err.iErr)
     {
@@ -50,25 +53,45 @@ int sci_xmlRead(char *fname, unsigned long fname_len)
 
     if (!isStringType(pvApiCtx, addr))
     {
-        Scierror(999, "%s: Wrong type for input argument %i: String expected\n", fname, 1);
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, 1);
         return 0;
     }
-    
     getAllocatedSingleString(pvApiCtx, addr, &path);
-    
-    doc = new org_modules_xml::XMLDocument((const char *) path, &error);
+
+    if (Rhs == 2)
+    {
+        err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
+        if (err.iErr)
+        {
+            freeAllocatedSingleString(path);
+            printError(&err, 0);
+            return 0;
+        }
+
+        if (!isBooleanType(pvApiCtx, addr))
+        {
+            freeAllocatedSingleString(path);
+            Scierror(999, gettext("%s: Wrong type for input argument #%i: A boolean expected.\n"), fname, 2);
+            return 0;
+        }
+
+        getScalarBoolean(pvApiCtx, addr, &validateParam);
+        validate = validateParam != 0;
+    }
+
+    doc = new org_modules_xml::XMLDocument((const char *)path, validate, &error);
     freeAllocatedSingleString(path);
 
     if (error)
     {
-       delete doc;
-       Scierror(999, "%s: Cannot read the file:\n%s", fname, error);
+        delete doc;
+        Scierror(999, gettext("%s: Cannot read the file:\n%s"), fname, error);
         return 0;
     }
 
     if (!doc->createOnStack(Rhs + 1))
     {
-       return 0;
+        return 0;
     }
 
     LhsVar(1) = Rhs + 1;
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_xmlReadStr.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_xmlReadStr.cpp
new file mode 100644 (file)
index 0000000..5ed069a
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLDocument.hxx"
+#include "XMLRhsValue.hxx"
+#include <iostream>
+
+extern "C"
+{
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_xmlReadStr(char * fname, unsigned long fname_len)
+{
+    XMLDocument * doc;
+    SciErr err;
+    int * addr = 0;
+    std::string * code;
+    char * error = 0;
+    bool validate = false;
+    int validateParam;
+
+    CheckLhs(1, 1);
+    CheckRhs(1, 2);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isStringType(pvApiCtx, addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, 1);
+        return 0;
+    }
+
+    if (!XMLRhsValue::get(fname, addr, &code))
+    {
+        return 0;
+    }
+
+    if (Rhs == 2)
+    {
+        err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
+        if (err.iErr)
+        {
+            delete code;
+            printError(&err, 0);
+            return 0;
+        }
+
+        if (!isBooleanType(pvApiCtx, addr))
+        {
+            delete code;
+            Scierror(999, gettext("%s: Wrong type for input argument #%i: A boolean expected.\n"), fname, 2);
+            return 0;
+        }
+
+        getScalarBoolean(pvApiCtx, addr, &validateParam);
+        validate = validateParam != 0;
+    }
+
+    doc = new XMLDocument(*code, validate, &error);
+    delete code;
+
+    if (error)
+    {
+        delete doc;
+        Scierror(999, gettext("%s: Cannot parse the string:\n%s"), fname, error);
+        return 0;
+    }
+
+    if (!doc->createOnStack(Rhs + 1))
+    {
+        return 0;
+    }
+
+    LhsVar(1) = Rhs + 1;
+    PutLhsVar();
+    return 0;
+}
+/*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_xmlWrite.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_xmlWrite.cpp
new file mode 100644 (file)
index 0000000..49a2f76
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLDocument.hxx"
+#include "XMLElement.hxx"
+
+extern "C"
+{
+#include <stdio.h>
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "libxml/tree.h"
+#include "expandPathVariable.h"
+#include "MALLOC.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_xmlWrite(char * fname, unsigned long fname_len)
+{
+    XMLDocument * doc = 0;
+    xmlDoc * document = 0;
+    SciErr err;
+    int * addr = 0;
+    char * path = 0;
+    const char * expandedPath = 0;
+    FILE * file = 0;
+    int ret = 0;
+
+    CheckLhs(1, 1);
+    CheckRhs(1, 2);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isXMLDoc(addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument %i: A %s expected.\n"), fname, 1, "XMLDoc");
+        return 0;
+    }
+
+    doc = XMLObject::getFromId<XMLDocument>(getXMLObjectId(addr));
+    if (!doc)
+    {
+        Scierror(999, gettext("%s: XML Document does not exist.\n"), fname);
+        return 0;
+    }
+    document = doc->getRealDocument();
+
+    if (Rhs == 2)
+    {
+        err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
+        if (err.iErr)
+        {
+            printError(&err, 0);
+            return 0;
+        }
+
+        if (!isStringType(pvApiCtx, addr))
+        {
+            Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, 2);
+            return 0;
+        }
+
+        getAllocatedSingleString(pvApiCtx, addr, &path);
+
+        if (!path || !strlen(path))
+        {
+            freeAllocatedSingleString(path);
+            Scierror(999, gettext("%s: Wrong size for input argument #%d: Non-empty string expected.\n"), fname, 2);
+            return 0;
+        }
+
+        expandedPath = const_cast<const char *>(expandPathVariable(path));
+        freeAllocatedSingleString(path);
+    }
+    else
+    {
+        if (!document->URL)
+        {
+            Scierror(999, gettext("%s: The XML Document has not an URI and there is no second argument.\n"), fname);
+            return 0;
+        }
+        expandedPath = strdup((const char *)document->URL);
+    }
+
+    file = fopen(expandedPath, "w");
+    if (!file)
+    {
+        Scierror(999, gettext("%s: Cannot write the file: %s\n"), fname, expandedPath);
+        FREE(expandedPath);
+        return 0;
+    }
+
+    ret = xmlDocDump(file, document);
+    if (ret == -1)
+    {
+        Scierror(999, gettext("%s: Cannot write the file: %s\n"), fname, expandedPath);
+        FREE(expandedPath);
+        return 0;
+    }
+
+    FREE(expandedPath);
+    fclose(file);
+
+    LhsVar(1) = 0;
+    PutLhsVar();
+
+    return 0;
+}
+/*--------------------------------------------------------------------------*/
index 9c203f2..d8310a9 100644 (file)
@@ -19,6 +19,7 @@ extern "C"
 #include "Scierror.h"
 #include "api_scilab.h"
 #include "xml_mlist.h"
+#include "localization.h"
 }
 
 #include "XMLObject.hxx"
@@ -34,17 +35,16 @@ int sci_xmlXPath(char * fname, unsigned long fname_len)
     int id;
     SciErr err;
     org_modules_xml::XMLDocument * doc;
-    XMLXPath * xpath;
-    XMLNodeSet * set;
-    int b;
-    double d;
-    const char * str;
-    int *addr = 0;
+    const XMLXPath * xpath;
+    int * addr = 0;
     char * query = 0;
-    char *error = 0;
+    char * error = 0;
+    int row = 0;
+    int col = 0;
+    char ** namespaces = 0;
 
     CheckLhs(1, 1);
-    CheckRhs(2, 2);
+    CheckRhs(2, 3);
 
     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
     if (err.iErr)
@@ -55,16 +55,15 @@ int sci_xmlXPath(char * fname, unsigned long fname_len)
 
     if (!isXMLDoc(addr))
     {
-        Scierror(999, "%s: Wrong type for input argument %i: %s expected\n", fname, 1, "XMLDoc");
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A %s expected.\n"), fname, 1, "XMLDoc");
         return 0;
     }
 
     id = getXMLObjectId(addr);
     doc = XMLObject::getFromId<org_modules_xml::XMLDocument>(id);
-
     if (!doc)
     {
-        Scierror(999, "%s: XML document does not exist\n", fname);
+        Scierror(999, gettext("%s: XML document does not exist.\n"), fname);
         return 0;
     }
 
@@ -77,47 +76,93 @@ int sci_xmlXPath(char * fname, unsigned long fname_len)
 
     if (!isStringType(pvApiCtx, addr))
     {
-        Scierror(999, "%s: Wrong type for input argument %i: String expected\n", fname, 2);
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, 2);
         return 0;
     }
-
     getAllocatedSingleString(pvApiCtx, addr, &query);
 
-    xpath = doc->makeXPathQuery(const_cast<const char *>(query), &error);
+    if (Rhs == 3)
+    {
+        err = getVarAddressFromPosition(pvApiCtx, 3, &addr);
+        if (err.iErr)
+        {
+            printError(&err, 0);
+            return 0;
+        }
+
+        if (!isStringType(pvApiCtx, addr))
+        {
+            Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, 2);
+            return 0;
+        }
+
+        err = getMatrixOfString(pvApiCtx, addr, &row, &col, 0, 0);
+        if (err.iErr)
+        {
+            printError(&err, 0);
+            return 0;
+        }
+
+        if (col != 2)
+        {
+            Scierror(999, gettext("%s: Bad number of columns for argument #%i: two expected.\n"), fname, 3);
+            return 0;
+        }
+
+        getAllocatedMatrixOfString(pvApiCtx, addr, &row, &col, &namespaces);
+    }
+
+    xpath = doc->makeXPathQuery(const_cast<const char *>(query), namespaces, row, &error);
+    freeAllocatedSingleString(query);
+    if (namespaces)
+    {
+        freeAllocatedMatrixOfString(row, col, namespaces);
+    }
 
     if (error)
     {
-       Scierror(999, "%s: Bad XPath query:\n%s", fname, error);
+        Scierror(999, gettext("%s: Bad XPath query:\n%s"), fname, error);
         return 0;
     }
 
     switch (xpath->getResultType())
     {
-    case XPATH_NODESET :;
-       set = xpath->getNodeSet();
-       id = set->getId();
-        if (!createXMLObjectAtPos(XMLLIST, Rhs + 1, id))
+    case XPATH_NODESET :
+    {
+        const XMLNodeSet * set = xpath->getNodeSet();
+        if (set->getSize() == 0)
         {
-            return 0;
+            createMatrixOfDouble(pvApiCtx, Rhs + 1, 0, 0, 0);
         }
-       break;
-    case XPATH_BOOLEAN :;
-       b = xpath->getBooleanValue();
-       createScalarBoolean(pvApiCtx, Rhs + 1, b);
-       break;
-    case XPATH_NUMBER :;
-       d = xpath->getFloatValue();
-       createScalarDouble(pvApiCtx, Rhs + 1, d);
-       break;
-    case XPATH_STRING :;
-       str = xpath->getStringValue();
-       createSingleString(pvApiCtx, Rhs + 1, str);
-       break;
-    default :;
-       Scierror(999, "%s: XPath query returned a not handled type: %i\n", fname, xpath->getResultType());
+        set->createOnStack(Rhs + 1);
+        break;
+    }
+    case XPATH_BOOLEAN :
+    {
+        int b = xpath->getBooleanValue();
+        createScalarBoolean(pvApiCtx, Rhs + 1, b);
+        break;
+    }
+    case XPATH_NUMBER :
+    {
+        double d = xpath->getFloatValue();
+        createScalarDouble(pvApiCtx, Rhs + 1, d);
+        break;
+    }
+    case XPATH_STRING :
+    {
+        const char * str = xpath->getStringValue();
+        createSingleString(pvApiCtx, Rhs + 1, str);
+        break;
+    }
+    default :
+        delete xpath;
+        Scierror(999, gettext("%s: XPath query returned a not handled type: %i\n"), fname, xpath->getResultType());
         return 0;
     }
-    
+
+    delete xpath;
+
     LhsVar(1) = Rhs + 1;
     PutLhsVar();
     return 0;
index 6a91e4b..61ec095 100644 (file)
 <PRIMITIVE gatewayId="68" primitiveId="8" primitiveName="%XMLNs_e" />
 <PRIMITIVE gatewayId="68" primitiveId="9" primitiveName="%XMLAttr_e" />
 <PRIMITIVE gatewayId="68" primitiveId="10" primitiveName="%XMLList_e" />
-<PRIMITIVE gatewayId="68" primitiveId="11" primitiveName="%XMLDoc_p" />
-<PRIMITIVE gatewayId="68" primitiveId="12" primitiveName="%XMLElem_p" />
-<PRIMITIVE gatewayId="68" primitiveId="13" primitiveName="%XMLNs_p" />
-<PRIMITIVE gatewayId="68" primitiveId="14" primitiveName="%XMLList_p" />
-<PRIMITIVE gatewayId="68" primitiveId="15" primitiveName="%XMLAttr_p" />
-<PRIMITIVE gatewayId="68" primitiveId="16" primitiveName="%XMLList_size" />
+<PRIMITIVE gatewayId="68" primitiveId="11" primitiveName="%XMLSet_e" />
+<PRIMITIVE gatewayId="68" primitiveId="12" primitiveName="%XMLDoc_p" />
+<PRIMITIVE gatewayId="68" primitiveId="13" primitiveName="%XMLElem_p" />
+<PRIMITIVE gatewayId="68" primitiveId="14" primitiveName="%XMLNs_p" />
+<PRIMITIVE gatewayId="68" primitiveId="15" primitiveName="%XMLList_p" />
+<PRIMITIVE gatewayId="68" primitiveId="16" primitiveName="%XMLAttr_p" />
+<PRIMITIVE gatewayId="68" primitiveId="17" primitiveName="%XMLSet_p" />
+<PRIMITIVE gatewayId="68" primitiveId="18" primitiveName="%XMLList_size" />
+<PRIMITIVE gatewayId="68" primitiveId="19" primitiveName="%XMLSet_size" />
+<PRIMITIVE gatewayId="68" primitiveId="20" primitiveName="%XMLAttr_size" />
+<PRIMITIVE gatewayId="68" primitiveId="21" primitiveName="%c_i_XMLDoc" />
+<PRIMITIVE gatewayId="68" primitiveId="22" primitiveName="%XMLElem_i_XMLDoc" />
+<PRIMITIVE gatewayId="68" primitiveId="23" primitiveName="%c_i_XMLElem" />
+<PRIMITIVE gatewayId="68" primitiveId="24" primitiveName="%XMLElem_i_XMLElem" />
+<PRIMITIVE gatewayId="68" primitiveId="25" primitiveName="%XMLAttr_i_XMLElem" />
+<PRIMITIVE gatewayId="68" primitiveId="26" primitiveName="%XMLList_i_XMLElem" />
+<PRIMITIVE gatewayId="68" primitiveId="27" primitiveName="%XMLNs_i_XMLElem" />
+<PRIMITIVE gatewayId="68" primitiveId="28" primitiveName="%c_i_XMLAttr" />
+<PRIMITIVE gatewayId="68" primitiveId="29" primitiveName="%XMLElem_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="30" primitiveName="%XMLDoc_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="31" primitiveName="%c_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="32" primitiveName="%s_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="33" primitiveName="%p_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="34" primitiveName="%b_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="35" primitiveName="%sp_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="36" primitiveName="%spb_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="37" primitiveName="%msp_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="38" primitiveName="%i_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="39" primitiveName="%h_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="40" primitiveName="%fptr_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="41" primitiveName="%mc_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="42" primitiveName="%l_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="43" primitiveName="%hm_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="44" primitiveName="%ptr_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="45" primitiveName="%ce_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="46" primitiveName="%st_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="47" primitiveName="%r_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="48" primitiveName="%lss_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="49" primitiveName="%ip_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="50" primitiveName="%XMLList_i_XMLList" />
+<PRIMITIVE gatewayId="68" primitiveId="51" primitiveName="xmlReadStr" />
+<PRIMITIVE gatewayId="68" primitiveId="52" primitiveName="xmlFormat" />
+<PRIMITIVE gatewayId="68" primitiveId="53" primitiveName="xmlElement" />
+<PRIMITIVE gatewayId="68" primitiveId="54" primitiveName="xmlDocument" />
+<PRIMITIVE gatewayId="68" primitiveId="55" primitiveName="xmlNs" />
+<PRIMITIVE gatewayId="68" primitiveId="56" primitiveName="xmlAddNs" />
+<PRIMITIVE gatewayId="68" primitiveId="57" primitiveName="xmlGetNsByHref" />
+<PRIMITIVE gatewayId="68" primitiveId="58" primitiveName="xmlGetNsByPrefix" />
+<PRIMITIVE gatewayId="68" primitiveId="59" primitiveName="%XMLElem_6" />
+<PRIMITIVE gatewayId="68" primitiveId="60" primitiveName="%XMLDoc_6" />
+<PRIMITIVE gatewayId="68" primitiveId="61" primitiveName="%XMLNs_6" />
+<PRIMITIVE gatewayId="68" primitiveId="62" primitiveName="%XMLAttr_6" />
+<PRIMITIVE gatewayId="68" primitiveId="63" primitiveName="%XMLList_6" />
+<PRIMITIVE gatewayId="68" primitiveId="64" primitiveName="%XMLSet_6" />
+<PRIMITIVE gatewayId="68" primitiveId="65" primitiveName="xmlWrite" />
+<PRIMITIVE gatewayId="68" primitiveId="66" primitiveName="%XMLList_length" />
+<PRIMITIVE gatewayId="68" primitiveId="67" primitiveName="%XMLSet_length" />
+<PRIMITIVE gatewayId="68" primitiveId="68" primitiveName="%XMLAttr_length" />
 </GATEWAY>
similarity index 64%
rename from scilab/modules/xml/src/c/createMlists.c
rename to scilab/modules/xml/src/c/XMLMlistsManagement.c
index fc1787a..f69f5a9 100644 (file)
@@ -16,8 +16,8 @@
 #include "Scierror.h"
 #include "MALLOC.h"
 
-#define NB_XMLOBJECTS 6
-static const char *XMLObjects[] = { "XMLDoc", "XMLElem", "XMLAttr", "XMLNs", "XMLList", "XMLNH" };
+#define NB_XMLOBJECTS 7
+static const char *XMLObjects[] = { "XMLDoc", "XMLElem", "XMLAttr", "XMLNs", "XMLList", "XMLNH", "XMLSet" };
 
 static const char *_XMLDoc[] = { "XMLDoc", "_id" };
 static const char *_XMLElem[] = { "XMLElem", "_id" };
@@ -25,71 +25,71 @@ static const char *_XMLAttr[] = { "XMLAttr", "_id" };
 static const char *_XMLNs[] = { "XMLNs", "_id" };
 static const char *_XMLList[] = { "XMLList", "_id" };
 static const char *_XMLNotHandled[] = { "XMLNH", "_id" };
+static const char *_XMLSet[] = { "XMLSet", "_id" };
+
+static int compareStrToMlistType(const char ** str, int nb, int * mlist);
 
 /*--------------------------------------------------------------------------*/
-/**
- * Create a XML Object at the given position on the stack
- */
 int createXMLObjectAtPos(int type, int pos, int id)
-{
-    const char **fields = NULL;
-    int *mlistaddr = NULL;
-    SciErr err;
-
-    switch (type)
-    {
-    case XMLDOCUMENT:;
-        fields = _XMLDoc;
-        break;
-    case XMLELEMENT:;
-        fields = _XMLElem;
-        break;
-    case XMLATTRIBUTE:;
-        fields = _XMLAttr;
-        break;
-    case XMLNAMESPACE:;
-        fields = _XMLNs;
-        break;
-    case XMLLIST:;
-        fields = _XMLList;
-        break;
-    case XMLNOTHANDLED:;
-        fields = _XMLNotHandled;
-        break;
-    }
-
-    err = createMList(pvApiCtx, pos, 2, &mlistaddr);
-    if (err.iErr)
-    {
-        printError(&err, 0);
-        return 0;
-    }
-
-    err = createMatrixOfStringInList(pvApiCtx, pos, mlistaddr, 1, 1, 2, fields);
-    if (err.iErr)
-    {
-        printError(&err, 0);
-        return 0;
-    }
-
-    err = createMatrixOfInteger32InList(pvApiCtx, pos, mlistaddr, 2, 1, 1, &id);
-    if (err.iErr)
-    {
-        printError(&err, 0);
-        return 0;
-    }
-
-    return 1;
-}
+ {
+     const char **fields = NULL;
+     int *mlistaddr = NULL;
+     SciErr err;
+
+     switch (type)
+     {
+     case XMLDOCUMENT:;
+         fields = _XMLDoc;
+         break;
+     case XMLELEMENT:;
+         fields = _XMLElem;
+         break;
+     case XMLATTRIBUTE:;
+         fields = _XMLAttr;
+         break;
+     case XMLNAMESPACE:;
+         fields = _XMLNs;
+         break;
+     case XMLLIST:;
+         fields = _XMLList;
+         break;
+     case XMLNOTHANDLED:;
+         fields = _XMLNotHandled;
+         break;
+     case XMLSET:;
+         fields = _XMLSet;
+         break;
+     }
+
+     err = createMList(pvApiCtx, pos, 2, &mlistaddr);
+     if (err.iErr)
+     {
+         printError(&err, 0);
+         return 0;
+     }
+
+     err = createMatrixOfStringInList(pvApiCtx, pos, mlistaddr, 1, 1, 2, fields);
+     if (err.iErr)
+     {
+         printError(&err, 0);
+         return 0;
+     }
+
+     err = createMatrixOfInteger32InList(pvApiCtx, pos, mlistaddr, 2, 1, 1, &id);
+     if (err.iErr)
+     {
+         printError(&err, 0);
+         return 0;
+     }
+
+     return 1;
+ }
 
 /*--------------------------------------------------------------------------*/
-/**
- *
- */
-int createXMLObjectAtPosInList(int *list, int stackPos, int type, int pos, int id)
+int createXMLObjectAtPosInList(int * list, int stackPos, int type, int pos, int id)
 {
-    const char **fields = NULL;
-    int *mlistaddr = NULL;
+    const char ** fields = NULL;
+    int * mlistaddr = NULL;
     SciErr err;
 
     err = createMListInList(pvApiCtx, stackPos, list, pos, 2, &mlistaddr);
@@ -119,16 +119,19 @@ int createXMLObjectAtPosInList(int *list, int stackPos, int type, int pos, int i
     case XMLNOTHANDLED:;
         fields = _XMLNotHandled;
         break;
+    case XMLSET:;
+        fields = _XMLSet;
+        break;
     }
 
-    err = createMatrixOfStringInList(pvApiCtx, pos, mlistaddr, 1, 1, 2, fields);
+    err = createMatrixOfStringInList(pvApiCtx, stackPos, mlistaddr, 1, 1, 2, fields);
     if (err.iErr)
     {
         printError(&err, 0);
         return 0;
     }
 
-    err = createMatrixOfInteger32InList(pvApiCtx, pos, mlistaddr, 2, 1, 1, &id);
+    err = createMatrixOfInteger32InList(pvApiCtx, stackPos, mlistaddr, 2, 1, 1, &id);
     if (err.iErr)
     {
         printError(&err, 0);
@@ -137,17 +140,76 @@ int createXMLObjectAtPosInList(int *list, int stackPos, int type, int pos, int i
 
     return 1;
 }
+/*--------------------------------------------------------------------------*/
+int isXMLDoc(int * mlist)
+{
+    return compareStrToMlistType(XMLObjects, 1, mlist);
+}
+/*--------------------------------------------------------------------------*/
+int isXMLElem(int * mlist)
+{
+    return compareStrToMlistType(XMLObjects + 1, 1, mlist);
+}
+/*--------------------------------------------------------------------------*/
+int isXMLAttr(int * mlist)
+{
+    return compareStrToMlistType(XMLObjects + 2, 1, mlist);
+}
+/*--------------------------------------------------------------------------*/
+int isXMLNs(int * mlist)
+{
+    return compareStrToMlistType(XMLObjects + 3, 1, mlist);
+}
+/*--------------------------------------------------------------------------*/
+int isXMLList(int * mlist)
+{
+    return compareStrToMlistType(XMLObjects + 4, 1, mlist);
+}
+/*--------------------------------------------------------------------------*/
+int isXMLNotHandled(int * mlist)
+{
+    return compareStrToMlistType(XMLObjects + 5, 1, mlist);
+}
+/*--------------------------------------------------------------------------*/
+int isXMLSet(int * mlist)
+{
+    return compareStrToMlistType(XMLObjects + 6, 1, mlist);
+}
+/*--------------------------------------------------------------------------*/
+int isXMLObject(int * mlist)
+{
+    return compareStrToMlistType(XMLObjects, NB_XMLOBJECTS, mlist);
+}
+/*--------------------------------------------------------------------------*/
+int getXMLObjectId(int * mlist)
+{
+    int *id = NULL;
+    int row, col;
+
+    SciErr err = getMatrixOfInteger32InList(pvApiCtx, mlist, 2, &row, &col, &id);
 
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return -1;
+    }
+
+    return *id;
+}
 /*--------------------------------------------------------------------------*/
 /**
- * Compare a string to the mlist type
+ * Compare a strings to the mlist type
+ * @param str an array of string
+ * @param nb the strings number
+ * @param mlist the mlist address
+ * @return 0 if one of the strings is not the mlist type
  */
-static int compareStrToMlistType(const char **str, int nb, int *mlist)
+static int compareStrToMlistType(const char ** str, int nb, int * mlist)
 {
-    char **mlist_type = NULL;
+    char ** mlist_type = NULL;
     int i = 0, type;
     int rows, cols;
-    int *lengths = NULL;
+    int * lengths = NULL;
     int cmp = 0;
 
     SciErr err = getVarType(pvApiCtx, mlist, &type);
@@ -198,62 +260,4 @@ static int compareStrToMlistType(const char **str, int nb, int *mlist)
 
     return cmp;
 }
-
-/*--------------------------------------------------------------------------*/
-int isXMLDoc(int *mlist)
-{
-    return compareStrToMlistType(XMLObjects, 1, mlist);
-}
-
 /*--------------------------------------------------------------------------*/
-int isXMLElem(int *mlist)
-{
-    return compareStrToMlistType(XMLObjects + 1, 1, mlist);
-}
-
-/*--------------------------------------------------------------------------*/
-int isXMLAttr(int *mlist)
-{
-    return compareStrToMlistType(XMLObjects + 2, 1, mlist);
-}
-
-/*--------------------------------------------------------------------------*/
-int isXMLNs(int *mlist)
-{
-    return compareStrToMlistType(XMLObjects + 3, 1, mlist);
-}
-
-/*--------------------------------------------------------------------------*/
-int isXMLList(int *mlist)
-{
-    return compareStrToMlistType(XMLObjects + 4, 1, mlist);
-}
-
-/*--------------------------------------------------------------------------*/
-int isXMLNotHandled(int *mlist)
-{
-    return compareStrToMlistType(XMLObjects + 5, 1, mlist);
-}
-
-/*--------------------------------------------------------------------------*/
-int isXMLObject(int *mlist)
-{
-    return compareStrToMlistType(XMLObjects, NB_XMLOBJECTS, mlist);
-}
-
-/*--------------------------------------------------------------------------*/
-int getXMLObjectId(int *mlist)
-{
-    int *id = NULL;
-    int row, col;
-
-    SciErr err = getMatrixOfInteger32InList(pvApiCtx, mlist, 2, &row, &col, &id);
-
-    if (err.iErr)
-    {
-        printError(&err, 0);
-        return -1;
-    }
-
-    return *id;
-}
index d6814c7..a252465 100644 (file)
 
 namespace org_modules_xml
 {
-    VariableScope::VariableScope(int initialSize_)
+    xmlFreeFunc VariableScope::XMLFreeFunc = 0;
+    std::map<void *, XMLObject *> * VariableScope::mapLibXMLToXMLObject = new std::map<void *, XMLObject *>();
+
+    VariableScope::VariableScope(int _initialSize)
     {
         position = -1;
-        this->initialSize = initialSize_;
-        this->scope = new XMLObject*[initialSize_];
-       std::fill(this->scope, this->scope + initialSize_, static_cast<XMLObject *>(0));
-       this->freePlaces = new std::stack<int>();
+        initialSize = _initialSize;
+        scope = new XMLObject*[initialSize];
+        std::fill(scope, scope + initialSize, static_cast<XMLObject *>(0));
+        freePlaces = new std::stack<int>();
+        initXMLMemory();
     }
 
     VariableScope::~VariableScope()
@@ -52,8 +56,8 @@ namespace org_modules_xml
             {
                 int newSize = initialSize * 2;
                 XMLObject ** newScope = new XMLObject*[newSize];
-               std::fill(this->scope, this->scope + initialSize, static_cast<XMLObject *>(0));
-               for (int i = 0; i < initialSize; i++)
+                std::fill(newScope + initialSize, newScope + newSize, static_cast<XMLObject *>(0));
+                for (int i = 0; i < initialSize; i++)
                 {
                     newScope[i] = scope[i];
                 }
@@ -77,4 +81,50 @@ namespace org_modules_xml
 
         return 0;
     }
+
+    void VariableScope::registerPointers(void * libxml, XMLObject * obj)
+    {
+        if (libxml)
+        {
+            (*mapLibXMLToXMLObject)[libxml] = obj;
+        }
+    }
+
+    void VariableScope::unregisterPointer(void * libxml)
+    {
+        if (libxml)
+        {
+            mapLibXMLToXMLObject->erase(libxml);
+        }
+    }
+
+    void VariableScope::initXMLMemory()
+    {
+        xmlFreeFunc freeFunc;
+        xmlMallocFunc mallocFunc;
+        xmlReallocFunc reallocFunc;
+        xmlStrdupFunc strdupFunc;
+
+        xmlMemGet(&freeFunc, &mallocFunc, &reallocFunc, &strdupFunc);
+        freeFunc = getFreeFunc(freeFunc);
+        xmlMemSetup(freeFunc, mallocFunc, reallocFunc, strdupFunc);
+    }
+
+    xmlFreeFunc VariableScope::getFreeFunc(xmlFreeFunc freeFunc)
+    {
+        VariableScope::XMLFreeFunc = freeFunc;
+        return &_xmlFreeFunc;
+    }
+
+    void VariableScope::_xmlFreeFunc(void * mem)
+    {
+        std::map<void *, XMLObject *>::const_iterator it = mapLibXMLToXMLObject->find(mem);
+        if (it != mapLibXMLToXMLObject->end())
+        {
+            delete it->second;
+        }
+
+        VariableScope::XMLFreeFunc(mem);
+    }
 }
+
index 2c52a1a..0b66441 100644 (file)
  *
  */
 
+#ifndef __VARIABLESCOPE_HXX__
+#define __VARIABLESCOPE_HXX__
+
+#include <map>
 #include <stack>
-#include <iostream>
+
+extern "C"
+{
+#include <libxml/xmlmemory.h>
+}
 
 namespace org_modules_xml
 {
     class XMLObject;
 
+    /**
+     * @file
+     * @author Calixte DENIZET <calixte.denizet@scilab.org>
+     *
+     * Class to handle the mapping between XMLObjects and their id
+     */
     class VariableScope
     {
 
-        XMLObject **scope;
+        XMLObject ** scope;
         int position;
         int initialSize;
-        std::stack<int> *freePlaces;
+        std::stack<int> * freePlaces;
+        static std::map<void *, XMLObject *> * mapLibXMLToXMLObject;
+        static xmlFreeFunc XMLFreeFunc;
 
     public :
+
+        /**
+         * Registers a pointer and its associated object.
+         * The aim of this mapping is to delete an existing object when a pointer
+         * in the xml tree is freed.
+         * @param libxml a pointer in the xml tree
+         * @param obj the corresponding object
+         */
+        static void registerPointers(void * libxml, XMLObject * obj);
+
+        /**
+         * Unregisters a pointer. It can be used when a pointer in the tree is freed or
+         * locally to avoid cyclic dependencies on removal.
+         * @param libxml a pointer in the xml tree
+         */
+        static void unregisterPointer(void * libxml);
+
+        /**
+         * Default constructor
+         * @param initialSize the default size of the scope
+         */
         VariableScope(int initialSize);
+
+        /**
+         * Destructor
+         */
         ~VariableScope();
 
+        /**
+         * Gets the variable id from the objec
+         * @param obj the object
+         * @return the corresponding id
+         */
         int getVariableId(const XMLObject & obj);
+
+        /**
+         * Gets the object from the id
+         * @param id the object id
+         * @return the object pointer or 0 if not found
+         */
         XMLObject * getVariableFromId(int id);
-       
+
+        /**
+         * Remove an id from the scope
+         * @param id the id
+         */
         template <class T> void removeId(int id)
-           {
-               if (id >= 0 && id < initialSize && scope[id])
-               {
-                   removeDependencies<T>(scope[id]);
-                   scope[id] = static_cast<XMLObject *>(0);
-                   freePlaces->push(id);
-               }
-           }
+            {
+                if (id >= 0 && id < initialSize && scope[id])
+                {
+                    removeDependencies<T>(scope[id]);
+                    scope[id] = static_cast<XMLObject *>(0);
+                    freePlaces->push(id);
+                }
+            }
 
     private :
-       template <class T> void removeDependencies(XMLObject * obj)
-           {
-               for (int i = 0; i <= position; i++)
-               {
-                   if (scope[i] && reinterpret_cast<T *>(scope[i])->getXMLObjectParent() == obj)
-                   {
-                       delete reinterpret_cast<T *>(scope[i]);
-                   }
-               }
-           }
+        static void _xmlFreeFunc(void * mem);
+        static void initXMLMemory();
+        static xmlFreeFunc getFreeFunc(xmlFreeFunc freeFunc);
+
+        /**
+         * Remove the object dependencies if they exist
+         * @param obj the object
+         */
+        template <class T> void removeDependencies(XMLObject * obj)
+            {
+                for (int i = 0; i <= position; i++)
+                {
+                    if (scope[i] && reinterpret_cast<T *>(scope[i])->getXMLObjectParent() == obj)
+                    {
+                        delete reinterpret_cast<T *>(scope[i]);
+                    }
+                }
+            }
     };
 }
+
+#endif
index c973417..2d9b5bd 100644 (file)
 #include "XMLObject.hxx"
 #include "XMLAttr.hxx"
 #include "XMLElement.hxx"
+#include "XMLDocument.hxx"
 #include "VariableScope.hxx"
 
 namespace org_modules_xml
 {
-    XMLAttr::XMLAttr(XMLElement * elem)
-        : XMLObject()
+    XMLAttr::XMLAttr(const XMLElement & _elem) : XMLObject(), elem(_elem)
     {
-        this->elem = elem;
-       scilabType = XMLATTRIBUTE;
+        scilabType = XMLATTRIBUTE;
     }
 
     XMLAttr::~XMLAttr()
@@ -32,14 +31,14 @@ namespace org_modules_xml
         scope.removeId<XMLAttr>(id);
     }
 
-    XMLObject * XMLAttr::getXMLObjectParent()
+    const XMLObject * XMLAttr::getXMLObjectParent() const
     {
-        return elem;
+        return &elem;
     }
 
-    const char * XMLAttr::getAttributeValue(const char * name)
+    const char * XMLAttr::getAttributeValue(const char * name) const
     {
-        xmlNode * node = elem->getRealNode();
+        xmlNode * node = elem.getRealNode();
         xmlAttr * attrs = xmlHasProp(node, (const xmlChar *)name);
         if (attrs)
         {
@@ -49,9 +48,9 @@ namespace org_modules_xml
         return 0;
     }
 
-    const char * XMLAttr::getAttributeValue(const char * ns, const char * name)
+    const char * XMLAttr::getAttributeValue(const char * ns, const char * name) const
     {
-        xmlNode * node = elem->getRealNode();
+        xmlNode * node = elem.getRealNode();
         xmlAttr * attrs = 0;
         for (xmlAttr * cur = node->properties; cur; cur = cur->next)
         {
@@ -70,24 +69,102 @@ namespace org_modules_xml
         return 0;
     }
 
-    std::string * XMLAttr::toString()
+    void XMLAttr::setAttributeValue(const char * prefix, const char * name, const char * value) const
     {
-       std::string str = "XML Attributes\n";
-       xmlNode * node = elem->getRealNode();
+        xmlNode * node = elem.getRealNode();
         xmlAttr * attrs = 0;
+        for (xmlAttr * cur = node->properties; cur; cur = cur->next)
+        {
+            if (cur->ns && !strcmp(name, (const char *)cur->name) && (!strcmp(prefix, (const char *)cur->ns->prefix) || !strcmp(prefix, (const char *)cur->ns->href)))
+            {
+                attrs = cur;
+                break;
+            }
+        }
+
+        if (attrs)
+        {
+            if (strlen(value))
+            {
+                xmlSetNsProp(node, attrs->ns, (const xmlChar *)name, (const xmlChar *)value);
+            }
+            else
+            {
+                xmlUnsetNsProp(node, attrs->ns, (const xmlChar *)name);
+            }
+        }
+        else if (strlen(value))
+        {
+            xmlNs * ns = 0;
+            if (!strncmp(prefix, "http://", strlen("http://")))
+            {
+                ns = xmlSearchNsByHref(elem.getXMLDocument().getRealDocument(), node, (const xmlChar *)prefix);
+            }
+            else
+            {
+                ns = xmlSearchNs(elem.getXMLDocument().getRealDocument(), node, (const xmlChar *)prefix);
+            }
+
+            if (ns)
+            {
+                xmlSetNsProp(node, ns, (const xmlChar *)name, (const xmlChar *)value);
+            }
+            else
+            {
+                xmlSetProp(node, (const xmlChar *)name, (const xmlChar *)value);
+            }
+        }
+    }
+
+    void XMLAttr::setAttributeValue(const char * name, const char * value) const
+    {
+        xmlNode * node = elem.getRealNode();
+        xmlAttr * attrs = xmlHasProp(node, (const xmlChar *)name);
+        if (attrs)
+        {
+            if (strlen(value))
+            {
+                xmlSetProp(node, (const xmlChar *)name, (const xmlChar *)value);
+            }
+            else
+            {
+                xmlUnsetProp(node, (const xmlChar *)name);
+            }
+        }
+        else
+        {
+            if (strlen(value))
+            {
+                xmlNewProp(node, (const xmlChar *)name, (const xmlChar *)value);
+            }
+        }
+    }
+
+    int XMLAttr::getSize() const
+    {
+        int i = 0;
+        for (xmlAttr * cur = elem.getRealNode()->properties; cur; cur = cur->next, i++);
+
+        return i;
+    }
+
+    const std::string XMLAttr::toString() const
+    {
+        std::string str = "XML Attributes\n";
+        xmlNode * node = elem.getRealNode();
 
         for (xmlAttr * cur = node->properties; cur; cur = cur->next)
         {
-           if (cur->ns)
-           {
-               str += " " + std::string((const char *)cur->ns->prefix) + ":" + std::string((const char *)cur->name) + " --> " + std::string((const char *)cur->children->content) + "\n"; 
-           }
-           else
-           {
-               str += " " + std::string((const char *)cur->name) + " --> " + std::string((const char *)cur->children->content) + "\n"; 
-           }
-       }
-
-       return new std::string(str);
+            if (cur->ns)
+            {
+                str += " " + std::string((const char *)cur->ns->prefix) + ":" + std::string((const char *)cur->name) + " --> " + std::string((const char *)cur->children->content) + "\n";
+            }
+            else
+            {
+                str += " " + std::string((const char *)cur->name) + " --> " + std::string((const char *)cur->children->content) + "\n";
+            }
+        }
+
+        return str;
     }
 }
index 07a7119..708750e 100644 (file)
@@ -10,6 +10,9 @@
  *
  */
 
+#ifndef __XMLATTR_HXX__
+#define __XMLATTR_HXX__
+
 #include <string>
 
 #include "xml.h"
@@ -21,15 +24,59 @@ namespace org_modules_xml
 
     class XMLAttr : public XMLObject
     {
-       XMLElement * elem;
+        const XMLElement & elem;
 
     public :
-       XMLAttr(XMLElement * elem);
-       ~XMLAttr();
 
-       const char * getAttributeValue(const char * name);
-       const char * getAttributeValue(const char * prefix, const char * name);
-       XMLObject * getXMLObjectParent();
-       std::string * toString();
+        /**
+         * Default constructor
+         * @param elem the element which has this attributes
+         */
+        XMLAttr(const XMLElement & elem);
+
+        ~XMLAttr();
+
+        int getSize() const;
+
+        /**
+         * Gets the attribute value.
+         * @param name the attribute name
+         * @return the attribute value
+         */
+        const char * getAttributeValue(const char * name) const;
+
+        /**
+         * Gets the attribute value with a prefix namespace.
+         * @param prefix the namespace prefix or the namespace itself
+         * @param name the attribute name
+         * @return the attribute value
+         */
+        const char * getAttributeValue(const char * prefix, const char * name) const;
+
+        /**
+         * Sets the attribute value.
+         * @param name the attribute name
+         * @param value the attribute value
+         */
+        void setAttributeValue(const char * name, const char * value) const;
+
+        /**
+         * Sets the attribute value with a prefix namespace.
+         * @param prefix the namespace prefix or the namespace itself
+         * @param name the attribute name
+         * @param value the attribute value
+         */
+        void setAttributeValue(const char * prefix, const char * name, const char * value) const;
+
+        /**
+         * Gets the element associated with this object
+         * @return the associated object
+         */
+        const XMLElement & getElement() const { return elem; }
+
+        const XMLObject * getXMLObjectParent() const;
+        const std::string toString() const;
     };
 }
+
+#endif
index 1839556..382a1c3 100644 (file)
@@ -25,33 +25,63 @@ extern "C" {
 
 namespace org_modules_xml
 {
+
     std::string * XMLDocument::errorBuffer = 0;
     std::string * XMLDocument::errorXPathBuffer = 0;
     std::list<XMLDocument *> & XMLDocument::openDocs = *new std::list<XMLDocument *>();
 
-    /**
-     * Default constructor
-     * @param path the path to the file (can be an url)
-     * @param error will contain parsing errors if exists
-     */
-    XMLDocument::XMLDocument(const char * path, char ** error)
-        : XMLObject()
+    XMLDocument::XMLDocument(const char * path, bool validate, char ** error) : XMLObject()
     {
         char * expandedPath = expandPathVariable(const_cast<char *>(path));
-        document = readDocument(const_cast<const char *>(expandedPath), error);
+        document = readDocument(const_cast<const char *>(expandedPath), validate, error);
         FREE(expandedPath);
         if (document)
         {
             openDocs.push_back(this);
         }
-       scilabType = XMLDOCUMENT;
+        scope.registerPointers(document, this);
+        scilabType = XMLDOCUMENT;
+    }
+
+    XMLDocument::XMLDocument(const std::string & xmlCode, bool validate, char ** error) : XMLObject()
+    {
+        document = readDocument(xmlCode, validate, error);
+        if (document)
+        {
+            openDocs.push_back(this);
+        }
+        scope.registerPointers(document, this);
+        scilabType = XMLDOCUMENT;
+    }
+
+    XMLDocument::XMLDocument(char * uri, char * version) : XMLObject()
+    {
+        char * newUri = 0;
+        char * expandedPath = 0;
+
+        if (!version)
+        {
+            version = const_cast<char *>("1.0");
+        }
+        document = xmlNewDoc((xmlChar *)version);
+        openDocs.push_back(this);
+        scope.registerPointers(document, this);
+        scilabType = XMLDOCUMENT;
+
+        expandedPath = expandPathVariable(const_cast<char *>(uri));
+
+        if (expandedPath)
+        {
+            newUri = (char *)xmlMalloc(sizeof(char *) * (strlen(expandedPath) + 1));
+            memcpy(newUri, expandedPath, sizeof(char) * (strlen(expandedPath) + 1));
+            document->URL = (xmlChar *)newUri;
+            FREE(expandedPath);
+        }
     }
 
-    /**
-     * Destructor
-     */
     XMLDocument::~XMLDocument()
     {
+        scope.unregisterPointer(document);
         scope.removeId<XMLDocument>(id);
         if (document)
         {
@@ -70,7 +100,7 @@ namespace org_modules_xml
         }
     }
 
-    XMLXPath * XMLDocument::makeXPathQuery(const char * query, char ** error)
+    const XMLXPath * XMLDocument::makeXPathQuery(const char * query, char ** namespaces, int length, char ** error)
     {
         if (errorXPathBuffer)
         {
@@ -85,6 +115,14 @@ namespace org_modules_xml
             return 0;
         }
 
+        if (namespaces)
+        {
+            for (int i = 0; i < length; i++)
+            {
+                xmlXPathRegisterNs(ctxt, (const xmlChar *)namespaces[i], (const xmlChar *)namespaces[i + length]);
+            }
+        }
+
         xmlSetStructuredErrorFunc(ctxt, XMLDocument::errorXPathFunction);
         xmlXPathCompExpr * expr = xmlXPathCtxtCompile(ctxt, (const xmlChar *)query);
         if (!expr)
@@ -100,39 +138,85 @@ namespace org_modules_xml
             return 0;
         }
 
-        return new XMLXPath(this, xpath);
+        return new XMLXPath(*this, xpath);
     }
 
-    XMLObject * XMLDocument::getXMLObjectParent()
+    const XMLObject * XMLDocument::getXMLObjectParent() const
     {
         return 0;
     }
 
-    std::string  * XMLDocument::toString()
+    const std::string XMLDocument::toString() const
     {
         std::string str = "XML Document\n";
         str += "URL: " + std::string(getDocumentURL());
 
-        return new std::string(str);
+        return str;
     }
 
-    std::string * XMLDocument::dump()
+    const std::string XMLDocument::dump() const
     {
         xmlChar * buffer = 0;
         int size = 0;
         xmlDocDumpFormatMemory(document, &buffer, &size, 1);
-        std::string * str = new std::string((const char *)buffer);
+        std::string str = std::string((const char *)buffer);
         xmlFree(buffer);
 
         return str;
     }
 
-    /**
-     * @return the root element of this XMLDocument
-     */
-    XMLElement * XMLDocument::getRoot(void)
+    const XMLElement * XMLDocument::getRoot() const
+    {
+        return new XMLElement(*this, xmlDocGetRootElement(document));
+    }
+
+    void XMLDocument::setRoot(const XMLElement & elem) const
+    {
+        xmlNode * root = xmlDocGetRootElement(document);
+        if (root != elem.getRealNode())
+        {
+            xmlNode * cpy = xmlCopyNodeList(elem.getRealNode());
+            xmlUnlinkNode(cpy);
+            xmlDocSetRootElement(document, cpy);
+        }
+    }
+
+    void XMLDocument::setRoot(const std::string & xmlCode, char ** error) const
+    {
+        XMLDocument doc = XMLDocument(xmlCode, false, error);
+
+        if (!*error)
+        {
+            setRoot(*doc.getRoot());
+        }
+    }
+
+    const char * XMLDocument::getDocumentURL() const
     {
-        return new XMLElement(this, xmlDocGetRootElement(document));
+        if (document->URL)
+        {
+            return (const char *)document->URL;
+        }
+        else
+        {
+            return "Undefined";
+        }
+    }
+
+    void XMLDocument::setDocumentURL(const std::string & url) const
+    {
+        char * expandedPath = 0;
+        char * newURL = 0;
+        expandedPath = expandPathVariable(const_cast<char *>(url.c_str()));
+
+        if (expandedPath)
+        {
+            xmlFree((void *)document->URL);
+            newURL = (char *)xmlMalloc(sizeof(char *) * (strlen(expandedPath) + 1));
+            memcpy(newURL, expandedPath, sizeof(char) * (strlen(expandedPath) + 1));
+            document->URL = (xmlChar *)newURL;
+            FREE(expandedPath);
+        }
     }
 
     std::list<XMLDocument *> & XMLDocument::getOpenDocuments()
@@ -140,16 +224,84 @@ namespace org_modules_xml
         return openDocs;
     }
 
+    void XMLDocument::closeAllDocuments()
+    {
+        int size = openDocs.size();
+        XMLDocument * arr[size];
+        int j = 0;
+        for (std::list<XMLDocument *>::iterator i = openDocs.begin(); i != openDocs.end(); i++, j++)
+        {
+            arr[j] = *i;
+        }
+        for (j = 0; j < size; j++)
+        {
+            delete arr[j];
+        }
+    }
+
+    xmlDoc * XMLDocument::readDocument(const char * filename, bool validate, char ** error)
+    {
+        xmlParserCtxt * ctxt = initContext(error, validate);
+        xmlDoc * doc;
+        int options = XML_PARSE_NSCLEAN;
+
+        if (validate)
+        {
+            options = options | XML_PARSE_DTDVALID;
+        }
+
+        if (!ctxt)
+        {
+            return 0;
+        }
+
+        doc = xmlCtxtReadFile(ctxt, filename, 0, options);
+        if (!doc || !ctxt->valid)
+        {
+            *error = const_cast<char *>(errorBuffer->c_str());
+        }
+
+        xmlFreeParserCtxt(ctxt);
+
+        return doc;
+    }
+
     /**
      * Read and parse a document
      * @param filename the file name
      * @param error a string where to write the parsing errors
      * @return a pointer on a xmlDoc
      */
-    xmlDoc * XMLDocument::readDocument(const char * filename, char **error)
+    xmlDoc * XMLDocument::readDocument(const std::string & xmlCode, bool validate, char ** error)
     {
-        xmlParserCtxtPtr ctxt;
+        xmlParserCtxt * ctxt = initContext(error, validate);
         xmlDoc * doc;
+        int options = XML_PARSE_NSCLEAN;
+
+        if (validate)
+        {
+            options = options | XML_PARSE_DTDVALID;
+        }
+
+        if (!ctxt)
+        {
+            return 0;
+        }
+
+        doc = xmlCtxtReadDoc(ctxt, (const xmlChar *)xmlCode.c_str(), 0, 0, options);
+        if (!doc || !ctxt->valid)
+        {
+            *error = const_cast<char *>(errorBuffer->c_str());
+        }
+
+        xmlFreeParserCtxt(ctxt);
+
+        return doc;
+    }
+
+    xmlParserCtxt * XMLDocument::initContext(char ** error, bool validate)
+    {
+        xmlParserCtxt * ctxt;
 
         if (errorBuffer)
         {
@@ -164,23 +316,16 @@ namespace org_modules_xml
             return 0;
         }
 
-        xmlSetGenericErrorFunc(ctxt, XMLDocument::errorFunction);
-
-        doc = xmlCtxtReadFile(ctxt, filename, 0, 0);
-        if (!doc)
+        if (validate)
         {
-            *error = const_cast<char *>(errorBuffer->c_str());
+            ctxt->vctxt.error = (xmlValidityErrorFunc) errorFunction;
         }
 
-        return doc;
+        xmlSetGenericErrorFunc(ctxt, XMLDocument::errorFunction);
+
+        return ctxt;
     }
 
-    /**
-     * Error function to use in the parser (see xmlSetGenericErrorFunc)
-     * @param ctx the context
-     * @param msg the error message
-     * @param ... the arguments to format the error message
-     */
     void XMLDocument::errorFunction(void * ctx, const char * msg, ...)
     {
         char str[BUFFER_SIZE];
index a5b4a24..5376268 100644 (file)
  *
  */
 
+#ifndef __XMLDOCUMENT_HXX__
+#define __XMLDOCUMENT_HXX__
+
 #include <cstdio>
 #include <list>
+#include <cstring>
 #include <string>
 
 #include "xml.h"
 
+extern "C"
+{
+#ifndef XML_XPATH_CHECKNS
+#define XML_XPATH_CHECKNS
+#endif
+}
+
 namespace org_modules_xml
 {
     class XMLElement;
     class XMLObject;
     class XMLXPath;
 
+    /**
+     * @file
+     * @author Calixte DENIZET <calixte.denizet@scilab.org>
+     *
+     * Class to wrap a xmlDoc
+     * @see http://xmlsoft.org/html/libxml-tree.html#xmlDoc
+     */
     class XMLDocument : public XMLObject
     {
-       static std::list<XMLDocument *> & openDocs;
+        static std::list<XMLDocument *> & openDocs;
         xmlDoc * document;
-       
+
     public :
-        XMLDocument(const char * path, char **error);
-       ~XMLDocument();
 
-       static std::list<XMLDocument *> & getOpenDocuments();
+        /**
+         * Gets the list of open docs
+         * @return the list
+         */
+        static std::list<XMLDocument *> & getOpenDocuments();
+
+        /**
+         * Closes all the open documents
+         */
+        static void closeAllDocuments();
+
+        /**
+         * Builds a document with a given path (can be an url)
+         * @param path the document path
+         * @param validate a boolean to indicate if the document must be validated in using a DTD
+         * @param error a pointer to a string which will receive the error message
+         */
+        XMLDocument(const char * path, bool validate, char ** error);
+
+        /**
+         * Builds a document with a given code
+         * @param xmlCode the XML code
+         * @param validate a boolean to indicate if the document must be validated in using a DTD
+         * @param error a pointer to a string which will receive the error message
+         */
+        XMLDocument(const std::string & xmlCode, bool validate, char ** error);
+
+        /**
+         * Builds a simple document
+         * @param uri the document uri
+         * @param version the xml version
+         */
+        XMLDocument(char * uri, char * version);
+
+        ~XMLDocument();
+
+        /**
+         * @return the xmlDoc behind this XMLDocument
+         */
+        xmlDoc * getRealDocument() const { return document; }
+
+        /**
+         * @return the document root
+         */
+        const XMLElement * getRoot() const;
 
-       xmlDoc * getRealDocument() { return document; }
-        XMLElement * getRoot();
-       XMLXPath * makeXPathQuery(const char * query, char ** error);
-        const char * getDocumentURL() { return (const char *)document->URL; }
-        XMLObject * getXMLObjectParent();
-       std::string * dump();
-       std::string * toString();
+        /**
+         * @param value the root to set
+         */
+        void setRoot(const XMLElement & value) const;
+
+        /**
+         * Replaces the root element by the the root of the xmlCode/
+         * @param xmlCode the XML code
+         * @param error a pointer to a string which will receive the error message
+         */
+        void setRoot(const std::string & xmlCode, char ** error) const;
+
+        /**
+         * @return the document URL
+         */
+        const char * getDocumentURL() const;
+
+        /**
+         * @param value the document URL to set
+         */
+        void setDocumentURL(const std::string & value) const;
+
+        /**
+         * Makes an XPath query on the document
+         * @param query the XPath query
+         * @param namespaces an a matrix nx2 containing mapping between prefix and href
+         * @param length the number of namespaces
+         * @param error a pointer to a string which will receive the error message
+         * @return a pointer on a XPath object
+         */
+        const XMLXPath * makeXPathQuery(const char * query, char ** namespaces, int length, char ** error);
+
+        const XMLObject * getXMLObjectParent() const;
+        const std::string dump() const;
+        const std::string toString() const;
 
     private :
-       static void errorFunction(void * ctx, const char * msg, ...);
-       static void errorXPathFunction(void * ctx, xmlError * error);
-       static xmlDoc * readDocument(const char * filename, char ** error);
 
-       static std::string * errorBuffer;
-       static std::string * errorXPathBuffer;
+        /**
+         * Error function for the XML parser
+         * @see http://xmlsoft.org/html/libxml-xmlerror.html#xmlGenericErrorFunc
+         */
+        static void errorFunction(void * ctx, const char * msg, ...);
+
+        /**
+         * Error function used when the XPath query is compiled/
+         * @see http://xmlsoft.org/html/libxml-xmlerror.html#xmlStructuredErrorFunc
+         */
+        static void errorXPathFunction(void * ctx, xmlError * error);
+
+        /**
+         * Reads and parses a document given in a file.
+         * @param filename the file name
+         * @param validate a boolean to indicate if the document must be validated in using a DTD
+         * @param error a string where to write the parsing errors
+         * @return a pointer on a xmlDoc
+         */
+        static xmlDoc * readDocument(const char * filename, bool validate, char ** error);
+
+        /**
+         * Read and parse a document given in a string.
+         * @param xmlCode the XML code
+         * @param validate a boolean to indicate if the document must be validated in using a DTD
+         * @param error a string where to write the parsing errors
+         * @return a pointer on a xmlDoc
+         */
+        static xmlDoc * readDocument(const std::string & xmlCode, bool validate, char ** error);
+
+        /**
+         * Initializes the context
+         * @param error a string where to write the parsing errors
+         * @param validate a boolean to indicate if the document must be validated in using a DTD
+         * @return a pointer on a context
+         */
+        static xmlParserCtxt * initContext(char ** error, bool validate);
+
+        static std::string * errorBuffer;
+        static std::string * errorXPathBuffer;
     };
 }
+
+#endif
index 9844514..3c604e9 100644 (file)
@@ -24,84 +24,199 @@ extern "C" {
 
 namespace org_modules_xml
 {
-    XMLElement::XMLElement(XMLDocument * doc, xmlNode * node)
-        : XMLObject()
+
+    XMLElement::XMLElement(const XMLDocument & _doc, xmlNode * _node) : XMLObject(), doc(_doc)
     {
-        this->node = node;
-        this->doc = doc;
-       scilabType = XMLELEMENT;
+        node = _node;
+        scope.registerPointers(node, this);
+        scilabType = XMLELEMENT;
+    }
+
+    XMLElement::XMLElement(const XMLDocument & _doc, const char * name) : XMLObject(), doc(_doc)
+    {
+        node = xmlNewNode(0, (const xmlChar *)name);
+        scope.registerPointers(node, this);
+        scilabType = XMLELEMENT;
     }
 
     XMLElement::~XMLElement()
     {
+        scope.unregisterPointer(node);
         scope.removeId<XMLElement>(id);
     }
 
-    XMLObject * XMLElement::getXMLObjectParent()
+    const XMLObject * XMLElement::getXMLObjectParent() const
     {
-        return doc;
+        return &doc;
     }
 
-    const char * XMLElement::getNodeContent()
+    const char * XMLElement::getNodeContent() const
     {
         return (const char *)xmlNodeGetContent(node);
     }
 
-    std::string * XMLElement::dump()
+    void XMLElement::setNodeName(const std::string & name) const
+    {
+        xmlNodeSetName(node, (const xmlChar *)name.c_str());
+    }
+
+    void XMLElement::setNodeNameSpace(const XMLNs & ns) const
+    {
+        xmlNs * n = ns.getRealNs();
+        if (n)
+        {
+            if (!n->prefix || !xmlSearchNs(doc.getRealDocument(), node, n->prefix))
+            {
+                n = xmlNewNs(node, (const xmlChar *)ns.getHref(), (const xmlChar *)ns.getPrefix());
+            }
+            xmlSetNs(node, n);
+        }
+    }
+
+    void XMLElement::setNodeContent(const std::string & content) const
+    {
+        xmlNodeSetContent(node, (const xmlChar *)content.c_str());
+    }
+
+    void XMLElement::setAttributes(const XMLAttr & attrs) const
+    {
+        xmlNode * attrNode = attrs.getElement().getRealNode();
+        if (node != attrNode)
+        {
+            xmlFreePropList(node->properties);
+            node->properties = 0;
+            xmlCopyPropList(node, attrNode->properties);
+        }
+    }
+
+    void XMLElement::setChildren(const XMLElement & elem) const
+    {
+        xmlNode * n = elem.getRealNode();
+        if (n && n->parent != node)
+        {
+            xmlNode * cpy = xmlCopyNode(n, 1);
+            xmlUnlinkNode(cpy);
+            xmlUnlinkNode(node->children);
+            xmlFreeNodeList(node->children);
+            node->children = 0;
+            xmlAddChild(node, cpy);
+            xmlMemoryDump();
+        }
+    }
+
+    void XMLElement::setChildren(const XMLNodeList & list) const
+    {
+        xmlNode * n = list.getRealNode();
+        if (n && n->parent != node)
+        {
+            xmlNode * cpy = xmlCopyNodeList(n);
+            xmlUnlinkNode(node->children);
+            xmlFreeNodeList(node->children);
+            node->children = 0;
+            xmlAddChildList(node, cpy);
+        }
+    }
+
+    void XMLElement::setChildren(const std::string & xmlCode) const
+    {
+        char * error = 0;
+        XMLDocument document = XMLDocument(xmlCode, false, &error);
+
+        if (!error)
+        {
+            setChildren(*document.getRoot());
+        }
+        else
+        {
+            xmlNode * n = xmlNewText((xmlChar *)xmlCode.c_str());
+            setChildren(XMLElement(doc, n));
+        }
+    }
+
+    void XMLElement::addNamespace(const XMLNs & ns) const
+    {
+        xmlNewNs(node, (const xmlChar *)ns.getHref(), (const xmlChar *)ns.getPrefix());
+    }
+
+    const XMLNs * XMLElement::getNamespaceByPrefix(const char * prefix) const
+    {
+        return new XMLNs(*this, xmlSearchNs(doc.getRealDocument(), node, (const xmlChar *)prefix));
+    }
+
+    const XMLNs * XMLElement::getNamespaceByHref(const char * href) const
+    {
+        return new XMLNs(*this, xmlSearchNsByHref(doc.getRealDocument(), node, (const xmlChar *)href));
+    }
+
+    const std::string XMLElement::dump() const
     {
         xmlBufferPtr buffer = xmlBufferCreate();
-        xmlNodeDump(buffer, doc->getRealDocument(), node, 0, 1);
-       std::string * str = new std::string((const char *)buffer->content);
+        xmlNodeDump(buffer, doc.getRealDocument(), node, 0, 1);
+        std::string str = std::string((const char *)buffer->content);
         xmlBufferFree(buffer);
 
         return str;
     }
 
-    std::string * XMLElement::toString()
+    const std::string XMLElement::toString() const
     {
-       std::string ns = "";
-       std::string prefix = "";
-
-       if (node->ns)
-       {
-           if (node->ns->href)
-           {
-               ns = std::string((const char *)node->ns->href);
-           }
-
-           if (node->ns->prefix)
-           {
-               prefix = std::string((const char *)node->ns->prefix);
-           }
-       }
+        std::string ns = "";
+        std::string prefix = "";
+
+        if (node->ns)
+        {
+            if (node->ns->href)
+            {
+                ns = std::string((const char *)node->ns->href);
+            }
+
+            if (node->ns->prefix)
+            {
+                prefix = std::string((const char *)node->ns->prefix);
+            }
+        }
 
         std::string str = "XML Element\n";
         str += "name: " + std::string(getNodeName()) + "\n";
-       str += "namespace URI: " + ns + "\n";
+        str += "namespace href: " + ns + "\n";
         str += "namespace prefix: " + prefix + "\n";
-       str += "type: " + std::string(nodes_type[getNodeType() - 1]) + "\n";
+        str += "type: " + std::string(nodes_type[getNodeType() - 1]) + "\n";
         str += "definition line: " + intToStr(node->line);
-       
-        return new std::string(str);
+
+        return str;
     }
 
-    XMLNs * XMLElement::getNodeNameSpace(void)
+    const XMLNs * XMLElement::getNodeNameSpace() const
     {
-        return new XMLNs(this, node->ns);
+        if (node->ns)
+        {
+            return new XMLNs(*this, node->ns);
+        }
+        else
+        {
+            return 0;
+        }
     }
 
-    XMLNodeList * XMLElement::getChildren(void)
+    const XMLNodeList * XMLElement::getChildren() const
     {
-        return new XMLNodeList(new XMLElement(doc, node->children));
+        return new XMLNodeList(doc, node);
     }
 
-    XMLAttr * XMLElement::getAttributes(void)
+    const XMLAttr * XMLElement::getAttributes() const
     {
-        return new XMLAttr(this);
+        return new XMLAttr(*this);
     }
 
-    XMLElement * XMLElement::getParentElement(void)
+    const XMLElement * XMLElement::getParentElement() const
     {
-        return new XMLElement(doc, node->parent);
+        if (node->parent && node->parent->type == XML_ELEMENT_NODE)
+        {
+            return new XMLElement(doc, node->parent);
+        }
+        else
+        {
+            return 0;
+        }
     }
 }
index 3831b03..8edc82e 100644 (file)
@@ -10,6 +10,9 @@
  *
  */
 
+#ifndef __XMLELEMENT_HXX__
+#define __XMLELEMENT_HXX__
+
 #include <string>
 
 #include "xml.h"
@@ -22,26 +25,152 @@ namespace org_modules_xml
     class XMLNs;
     class XMLAttr;
 
+    /**
+     * @file
+     * @author Calixte DENIZET <calixte.denizet@scilab.org>
+     *
+     * Class to wrap a xmlNode
+     * @see http://xmlsoft.org/html/libxml-tree.html#xmlNode
+     */
     class XMLElement : public XMLObject
     {
         xmlNode * node;
-        XMLDocument * doc;
+        const XMLDocument & doc;
 
     public:
-        XMLElement(XMLDocument * doc, xmlNode * node);
+
+        /**
+         * @param doc the owner document of this XMLElement
+         * @param node the xmlNode to wrap
+         */
+        XMLElement(const XMLDocument & doc, xmlNode * node);
+
+        /**
+         * @param doc the owner document of this XMLElement
+         * @param name the name of the XMLElement
+         */
+        XMLElement(const XMLDocument & doc, const char * name);
+
         ~XMLElement();
 
-        const char * getNodeName(void) { return (const char *)node->name; }
-        XMLNs * getNodeNameSpace(void);
-        const char * getNodeContent(void);
-        int getNodeType(void) { return node->type; }
-        XMLAttr * getAttributes(void);
-        XMLElement * getParentElement(void);
-        XMLNodeList * getChildren(void);
-        xmlNode * getRealNode() { return node; }
-        XMLDocument * getXMLDocument() { return doc; }
-       XMLObject * getXMLObjectParent();
-       std::string * dump();
-        std::string * toString();
+        /**
+         * @return the node name
+         */
+        const char * getNodeName(void) const { return node->name ? (const char *)node->name : ""; }
+
+        /**
+         * Sets the node name
+         * @param name the node name
+         */
+        void setNodeName(const std::string & name) const;
+
+        /**
+         * @return the namespace associated to this node
+         */
+        const XMLNs * getNodeNameSpace() const;
+
+        /**
+         * Sets the namespace of this node
+         * @param ns the namespace
+         */
+        void setNodeNameSpace(const XMLNs & ns) const;
+
+        /**
+         * Gets the node contents
+         * @see http://xmlsoft.org/html/libxml-tree.html#xmlNodeGetContent
+         * @return the node content
+         */
+        const char * getNodeContent() const;
+
+        /**
+         * Sets the node content
+         * @param content the new node contents
+         */
+        void setNodeContent(const std::string & content) const;
+
+        /**
+         * @return the node type
+         * @see http://xmlsoft.org/html/libxml-tree.html#xmlElementType
+         */
+        int getNodeType(void) const { return node->type; }
+
+        /**
+         * @return the attributes of this node
+         */
+        const XMLAttr * getAttributes(void) const;
+
+        /**
+         * Sets the attributes of this node
+         * @param attrs the new attributes
+         */
+        void setAttributes(const XMLAttr & attrs) const;
+
+        /**
+         * @return the parent XMLElement
+         */
+        const XMLElement * getParentElement() const;
+
+        /**
+         * @return a list of the children of this node
+         */
+        const XMLNodeList * getChildren() const;
+
+        /**
+         * Replaces the children of this node by an XMLElement
+         * @param elem the new child
+         */
+        void setChildren(const XMLElement & elem) const;
+
+        /**
+         * Replaces the children of this node by a list of nodes
+         * @param list the new children
+         */
+        void setChildren(const XMLNodeList & list) const;
+
+        /**
+         * Replaces the children of this node by a new one given by a XML code
+         * @param xmlCode the XML code of the new child
+         */
+        void setChildren(const std::string & xmlCode) const;
+
+        /**
+         * Adds a namespace to this node which can be used by the children
+         * @param ns the namespace to add
+         */
+        void addNamespace(const XMLNs & ns) const;
+
+        /**
+         * Gets the namespace which has a given prefix. If it is not found in this
+         * node, then it will be searched in the parents.
+         * @see http://xmlsoft.org/html/libxml-tree.html#xmlSearchNs
+         * @param prefix the prefix
+         * @return the corresponding namespace or 0 if not found
+         */
+        const XMLNs * getNamespaceByPrefix(const char * prefix) const;
+
+        /**
+         * Gets the namespace which has a given href. If it is not found in this
+         * node, then it will be searched in the parents.
+         * @see http://xmlsoft.org/html/libxml-tree.html#xmlSearchNsByHref
+         * @param href the href
+         * @return the corresponding namespace or 0 if not found
+         */
+        const XMLNs * getNamespaceByHref(const char * href) const;
+
+        /**
+         * @return the libxml node behind this object
+         */
+        xmlNode * getRealNode() const { return node; }
+
+        /**
+         * @return the XMLDocument which is the parent or this XMLElement
+         */
+        const XMLDocument & getXMLDocument() const { return doc; }
+
+        const XMLObject * getXMLObjectParent() const;
+        const std::string dump() const;
+        const std::string toString() const;
     };
 }
+
+#endif
index 5dd81b6..29a5406 100644 (file)
 
 namespace org_modules_xml
 {
-    XMLList::XMLList()
-        : XMLObject()
+    XMLList::XMLList() : XMLObject()
     {
-       scilabType = XMLLIST;
+        scilabType = XMLLIST;
     }
 
-    std::string * XMLList::toString()
+    const std::string XMLList::toString() const
     {
-       std::string str = "XML List\n";
+        std::string str = "XML List\n";
         str += "size: " + intToStr(getSize());
-       
-        return new std::string(str);
+
+        return str;
     }
 }
index 1d8a9cb..126e1b2 100644 (file)
@@ -10,6 +10,9 @@
  *
  */
 
+#ifndef __XMLLIST_HXX__
+#define __XMLLIST_HXX__
+
 #include <string>
 
 #include "xml.h"
@@ -18,19 +21,75 @@ namespace org_modules_xml
 {
     class XMLObject;
 
+    /**
+     * @file
+     * @author Calixte DENIZET <calixte.denizet@scilab.org>
+     *
+     * Virtual class to handle a list of XMLObjects
+     */
     class XMLList : public XMLObject
     {
 
     public :
-       XMLList();
 
-       virtual XMLObject * getListElement(int index) = 0;
+        /**
+         * Gets the element with the given index.
+         * @param index the element index
+         * @return the corresponding object
+         */
+        virtual const XMLObject * getListElement(int index) = 0;
+
+        /**
+         * Default constructor
+         */
+        XMLList();
 
-       int getSize() { return size; }
-       std::string * toString();
+        /**
+         * @return the list size
+         */
+        int getSize() const { return size; }
+
+        const std::string toString() const;
 
     protected :
-       int size;
+        int size;
+
+        /**
+         * Gets an element in a linked list with a given index.
+         * The element is reached from a previous element which has an index.
+         * This way to search the element is faster in a for loop where the indexes are
+         * consecutives.
+         * @param index the searched index
+         * @param max the the max
+         * @param prev a pointer on the previous index (*prev is modified by this function)
+         * @param prevElem a pointer on the previous element (*prevElem is modified by this function)
+         * @return the found element
+         */
+        template <typename T>
+        static T * getListElement(int index, int max, int * prev, T ** prevElem)
+            {
+                if (index >= 1 && index <= max)
+                {
+                    if (index != *prev)
+                    {
+                        if (index < *prev)
+                        {
+                            for (int i = *prev; i > index; i--, *prevElem = (*prevElem)->prev);
+                        }
+                        else
+                        {
+                            for (int i = *prev; i < index; i++, *prevElem = (*prevElem)->next);
+                        }
+                        *prev = index;
+                    }
 
+                    return *prevElem;
+                }
+
+                return 0;
+            }
     };
 }
+
+#endif
+
diff --git a/scilab/modules/xml/src/cpp/XMLList_insertion.hpp b/scilab/modules/xml/src/cpp/XMLList_insertion.hpp
new file mode 100644 (file)
index 0000000..857ed9f
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#ifndef __XMLLIST_INSERT_HPP__
+#define __XMLLIST_INSERT_HPP__
+
+#include "XMLRhsValue.hxx"
+
+extern "C"
+{
+#include <stdio.h>
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+
+/**
+ * Function to handle insertion in XMLNodeList
+ * @param fname the function name
+ * @param fname_len the function name length
+ */
+template <class T>
+int sci_XMLList_insertion(char * fname, unsigned long fname_len)
+{
+    XMLNodeList * a;
+    T * b;
+    int lhsid;
+    bool success;
+    double index;
+    SciErr err;
+    int * indexaddr = 0;
+    int * rhsaddr = 0;
+    int * lhsaddr = 0;
+
+    CheckLhs(1, 1);
+    CheckRhs(3, 3);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &indexaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isDoubleType(pvApiCtx, indexaddr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A double expected.\n"), fname, 1);
+        return 0;
+    }
+
+    getScalarDouble(pvApiCtx, indexaddr, &index);
+
+    err = getVarAddressFromPosition(pvApiCtx, 2, &rhsaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 3, &lhsaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    lhsid = getXMLObjectId(lhsaddr);
+    a = XMLObject::getFromId<XMLNodeList>(lhsid);
+    if (!a)
+    {
+        Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
+        return 0;
+    }
+
+    success = XMLRhsValue::get(fname, rhsaddr, &b);
+    if (!success)
+    {
+        Scierror(999, gettext("%s: Error in getting rhs argument.\n"), fname);
+        return 0;
+    }
+
+    a->setElementAtPosition(index, *b);
+
+    if (typeid(T) == typeid(std::string))
+    {
+        delete b;
+    }
+
+    if (a->createOnStack(Rhs + 1))
+    {
+        LhsVar(1) = Rhs + 1;
+    }
+    else
+    {
+        LhsVar(1) = 0;
+    }
+
+    PutLhsVar();
+
+    return 0;
+}
+
+#endif
index 6aac247..14a30ff 100644 (file)
@@ -13,6 +13,7 @@
 #include <string>
 
 #include "XMLObject.hxx"
+#include "XMLDocument.hxx"
 #include "XMLElement.hxx"
 #include "XMLNodeList.hxx"
 #include "VariableScope.hxx"
 namespace org_modules_xml
 {
 
-    int XMLNodeList::getNodeListSize(xmlNode * node)
+    XMLNodeList::XMLNodeList(const XMLDocument & _doc, xmlNode * _parent) : XMLList(), doc(_doc)
     {
-        xmlNode * n = node;
-        int i = 0;
-        for (; n; n = n->next, i++);
+        parent = _parent;
+        size = getNodeListSize(parent->children);
+        prev = 1;
+        prevNode = parent->children;
+        scope.registerPointers(parent->children, this);
+    }
 
-        return i;
+    XMLNodeList::~XMLNodeList()
+    {
+        scope.unregisterPointer(parent->children);
+        scope.removeId<XMLNodeList>(id);
     }
 
-    XMLNodeList::XMLNodeList(XMLElement * elem)
-        : XMLList()
+    const XMLObject * XMLNodeList::getXMLObjectParent() const
     {
-        this->elem = elem;
-        this->size = getNodeListSize(elem->getRealNode());
-        this->prev = 1;
-        this->prevNode = elem->getRealNode();
+        return &doc;
     }
 
-    XMLNodeList::~XMLNodeList()
+    const std::string XMLNodeList::dump() const
     {
-        scope.removeId<XMLNodeList>(id);
+        xmlBufferPtr buffer = xmlBufferCreate();
+        for (xmlNode * cur = parent->children; cur; cur = cur->next)
+        {
+            xmlNodeDump(buffer, doc.getRealDocument(), cur, 0, 1);
+            xmlBufferAdd(buffer, (xmlChar *)"\n", strlen("\n"));
+        }
+        std::string str = std::string((const char *)buffer->content);
+        xmlBufferFree(buffer);
+
+        return str;
     }
 
-    XMLObject * XMLNodeList::getXMLObjectParent()
+    const XMLObject * XMLNodeList::getListElement(int index)
     {
-        return elem;
+        xmlNode * n = getListNode(index);
+        if (n)
+        {
+            return new XMLElement(doc, n);
+        }
+
+        return 0;
     }
 
-    XMLObject * XMLNodeList::getListElement(int index)
+    void XMLNodeList::removeElementAtPosition(int index)
     {
-        if (index >= 1 && index <= size)
+        if (size && index >= 1 && index <= size)
         {
-            if (index != prev)
+            if (index == 1)
             {
-                if (index < prev)
+                xmlNode * n = parent->children;
+                scope.unregisterPointer(n);
+                xmlUnlinkNode(n);
+                xmlFreeNode(n);
+                size--;
+                if (size == 0)
                 {
-                    for (int i = prev; i > index; i--, prevNode = prevNode->prev);
+                    parent->children = 0;
                 }
-                else
+                prevNode = parent->children;
+                prev = 1;
+            }
+            else
+            {
+                xmlNode * n = getListNode(index);
+                if (n)
                 {
-                    for (int i = prev; i < index; i++, prevNode = prevNode->next);
+                    xmlNode * next = n->next;
+                    prevNode = prevNode->prev;
+                    prev--;
+                    xmlUnlinkNode(n);
+                    xmlFreeNode(n);
+                    prevNode->next = next;
+                    size--;
                 }
-                prev = index;
             }
+        }
+    }
+
+    void XMLNodeList::setElementAtPosition(double index, const XMLElement & elem)
+    {
+        if (size == 0)
+        {
+            insertAtEnd(elem);
+            prevNode = parent->children;
+            prev = 1;
+        }
+        else if (index < 1)
+        {
+            insertAtBeginning(elem);
+        }
+        else if (index > size)
+        {
+            insertAtEnd(elem);
+        }
+        else if ((int)index == index)
+        {
+            replaceAtIndex((int)index, elem);
+        }
+        else
+        {
+            insertAtIndex((int)index, elem);
+        }
+    }
 
-            return new XMLElement(elem->getXMLDocument(), prevNode);
+    void XMLNodeList::setElementAtPosition(double index, const XMLDocument & document)
+    {
+        const XMLElement * e = document.getRoot();
+        setElementAtPosition(index, *e);
+        delete e;
+    }
+
+    void XMLNodeList::setElementAtPosition(double index, const std::string & xmlCode)
+    {
+        char * error = 0;
+        XMLDocument document = XMLDocument(xmlCode, false, &error);
+
+        if (!error)
+        {
+            setElementAtPosition(index, document);
+        }
+        else
+        {
+            xmlNode * n = xmlNewText((xmlChar *)xmlCode.c_str());
+            setElementAtPosition(index, XMLElement(doc, n));
         }
+    }
 
-        return 0;
+    void XMLNodeList::setElementAtPosition(double index, const XMLNodeList & list)
+    {
+        if (list.getSize() && list.getRealNode() != parent)
+        {
+            int pos = index;
+
+            if (index < 1)
+            {
+                pos = 1;
+            }
+            else if (index > size)
+            {
+                pos = size++;
+            }
+            else if ((int)index != index)
+            {
+                pos++;
+            }
+
+            setElementAtPosition(index, XMLElement(doc, list.getRealNode()));
+            for (xmlNode * cur = list.getRealNode()->next; cur; cur = cur->next)
+            {
+                setElementAtPosition((double)(pos++) + 0.5d, XMLElement(doc, cur));
+            }
+        }
+    }
+
+    void XMLNodeList::replaceAtIndex(int index, const XMLElement & elem)
+    {
+        xmlNode * n = getListNode(index);
+        if (n)
+        {
+            if (index == 1)
+            {
+                scope.unregisterPointer(parent->children);
+            }
+            xmlNode * previous = n->prev;
+            xmlNode * next = n->next;
+            xmlNode * cpy = xmlCopyNode(elem.getRealNode(), 1);
+            xmlUnlinkNode(cpy);
+            xmlReplaceNode(n, cpy);
+            xmlFreeNode(n);
+            prevNode = cpy;
+            cpy->prev = previous;
+            cpy->next = next;
+            if (index == 1)
+            {
+                scope.registerPointers(parent->children, this);
+            }
+        }
+    }
+
+    void XMLNodeList::insertAtEnd(const XMLElement & elem)
+    {
+        xmlNode * cpy = xmlCopyNode(elem.getRealNode(), 1);
+        xmlUnlinkNode(cpy);
+        xmlAddChild(parent, cpy);
+        size++;
+    }
+
+    void XMLNodeList::insertAtBeginning(const XMLElement & elem)
+    {
+        xmlNode * cpy = xmlCopyNode(elem.getRealNode(), 1);
+        xmlUnlinkNode(cpy);
+        scope.unregisterPointer(parent->children);
+        xmlAddPrevSibling(parent->children, cpy);
+        scope.registerPointers(parent->children, this);
+        size++;
+    }
+
+    void XMLNodeList::insertAtIndex(int index, const XMLElement & elem)
+    {
+        xmlNode * n = getListNode(index);
+        if (n)
+        {
+            xmlNode * cpy = xmlCopyNode(elem.getRealNode(), 1);
+            xmlUnlinkNode(cpy);
+            xmlAddNextSibling(n, cpy);
+            size++;
+        }
+    }
+
+    xmlNode * XMLNodeList::getListNode(int index)
+    {
+        return XMLList::getListElement<xmlNode>(index, size, &prev, &prevNode);
+    }
+
+    inline int XMLNodeList::getNodeListSize(xmlNode * node)
+    {
+        int i = 0;
+        for (xmlNode * n = node; n; n = n->next, i++);
+
+        return i;
     }
 }
index 806ef4f..159f624 100644 (file)
  *
  */
 
-#include "XMLList.hxx"
+#ifndef __XMLNODELIST_HXX__
+#define __XMLNODELIST_HXX__
 
+#include "XMLList.hxx"
 #include "xml.h"
 
 namespace org_modules_xml
 {
     class XMLElement;
-    
+    class XMLDocument;
+
+    /**
+     * @file
+     * @author Calixte DENIZET <calixte.denizet@scilab.org>
+     *
+     * Class to wrap the list of the children of a node
+     */
     class XMLNodeList : public XMLList
     {
-       
-       XMLElement * elem;
-       int prev;
-       xmlNode * prevNode; 
+
+        const XMLDocument & doc;
+        xmlNode * parent;
+        int prev;
+        xmlNode * prevNode;
 
     public :
-       XMLNodeList(XMLElement * elem);
-       ~XMLNodeList();
 
-       XMLObject * getListElement(int index);
-       XMLObject * getXMLObjectParent();
+        /**
+         * Default constructor
+         * @param doc the XMLDocument where this nodelist is
+         * @param parent the parent node
+         */
+        XMLNodeList(const XMLDocument & doc, xmlNode * parent);
+
+        ~XMLNodeList();
+
+        /**
+         * Removes an element
+         * @param index the index of the element to remove
+         */
+        void removeElementAtPosition(int index);
+
+        /**
+         * @anchor setElementAtPosition
+         * Sets an element at a given index.
+         * If the index is an integer, then according to the index value the element
+         * will be inserted at tail, or will replaced the existing one.
+         * If the index is not an integer, then the element will be inserted between the
+         * elements with indexes floor(index) and floor(index)+1.
+         * @param index the index
+         * @param elem the element to insert
+         */
+        void setElementAtPosition(double index, const XMLElement & elem);
+
+        /**
+         * See @ref setElementAtPosition
+         * @param index the index
+         * @param document the document containing the root which will be inserted
+         */
+        void setElementAtPosition(double index, const XMLDocument & document);
+
+        /**
+         * See @ref setElementAtPosition
+         * @param index the index
+         * @param xmlCode the XML code for the element which will be inserted
+         */
+        void setElementAtPosition(double index, const std::string & xmlCode);
+
+        /**
+         * See @ref setElementAtPosition
+         * @param index the index
+         * @param list the list of the elements which will be inserted
+         */
+        void setElementAtPosition(double index, const XMLNodeList & list);
+
+        /**
+         * Gets the parent node behind this children list.
+         * @return the parent node
+         */
+        xmlNode * getRealNode() const { return parent->children; }
+
+        const XMLObject * getXMLObjectParent() const;
+        const std::string dump() const;
+        const XMLObject * getListElement(int index);
+
+    protected :
+
+        /**
+         * Replaces an element at a given index
+         * @param index the index
+         * @param elem the new element
+         */
+        void replaceAtIndex(int index, const XMLElement & elem);
+
+        /**
+         * Inserts an element at beginning
+         * @param elem the element to insert
+         */
+        void insertAtEnd(const XMLElement & elem);
+
+        /**
+         * Inserts an element at end
+         * @param elem the element to insert
+         */
+        void insertAtBeginning(const XMLElement & elem);
+
+        /**
+         * Inserts an element at a given index
+         * @param index the index
+         * @param elem the element to insert
+         */
+        void insertAtIndex(int index, const XMLElement & elem);
 
     private :
-       static int getNodeListSize(xmlNode * node);
+
+        /**
+         * Gets the node list size
+         * @param node the xmlNode
+         * @return the size
+         */
+        static int getNodeListSize(xmlNode * node);
+
+        /**
+         * Gets a node at a given index
+         * @param index the index
+         * @return the correspionding node
+         */
+        xmlNode * getListNode(int index);
+
     };
 }
+
+#endif
index 5908954..fcc6061 100644 (file)
 namespace org_modules_xml
 {
 
-    XMLNodeSet::XMLNodeSet(XMLDocument * doc, xmlNodeSet * nodeSet)
-        : XMLList()
+    XMLNodeSet::XMLNodeSet(const XMLDocument & _doc, xmlNodeSet * _nodeSet) : XMLList(), doc(_doc)
     {
-        this->doc = doc;
-        this->nodeSet = nodeSet;
-       if (nodeSet)
-       {
-           this->size = nodeSet->nodeNr;
-       }
-       else
-       {
-           this->size = 0;
-       }
+        nodeSet = _nodeSet;
+        if (nodeSet)
+        {
+            scope.registerPointers(nodeSet, this);
+            size = nodeSet->nodeNr;
+        }
+        else
+        {
+            size = 0;
+        }
+        scilabType = XMLSET;
     }
 
     XMLNodeSet::~XMLNodeSet()
     {
+        scope.unregisterPointer(nodeSet);
         scope.removeId<XMLNodeSet>(id);
     }
 
-    XMLObject * XMLNodeSet::getXMLObjectParent()
+    const XMLObject * XMLNodeSet::getXMLObjectParent() const
     {
-        return doc;
+        return &doc;
     }
 
-    XMLObject * XMLNodeSet::getListElement(int index)
+    const XMLObject * XMLNodeSet::getListElement(int index)
     {
         if (nodeSet && index >= 1 && index <= size)
         {
-           xmlNode * node = nodeSet->nodeTab[index - 1];
-           switch (node->type)
-           {
-           case XML_ELEMENT_NODE :
-           case XML_TEXT_NODE :
-           case XML_CDATA_SECTION_NODE :
-           case XML_COMMENT_NODE :
-               return new XMLElement(doc, node);
-           case XML_ATTRIBUTE_NODE :
-               return new XMLAttr(new XMLElement(doc, node->parent));
-           case XML_NAMESPACE_DECL :
-               return new XMLNs(doc, (xmlNs *) node);
-           case XML_ELEMENT_DECL :
-           case XML_ATTRIBUTE_DECL :
-           case XML_ENTITY_DECL :
-           case XML_XINCLUDE_START :
-           case XML_XINCLUDE_END:
-               return new XMLNotHandledElement(doc, node);
-           }
+            xmlNode * node = nodeSet->nodeTab[index - 1];
+            switch (node->type)
+            {
+            case XML_ELEMENT_NODE :
+            case XML_TEXT_NODE :
+            case XML_CDATA_SECTION_NODE :
+            case XML_COMMENT_NODE :
+                return new XMLElement(doc, node);
+            case XML_ATTRIBUTE_NODE :
+                return new XMLAttr(XMLElement(doc, node->parent));
+            case XML_NAMESPACE_DECL :
+                return new XMLNs(doc, (xmlNs *)node);
+            case XML_ELEMENT_DECL :
+            case XML_ATTRIBUTE_DECL :
+            case XML_ENTITY_DECL :
+            case XML_XINCLUDE_START :
+            case XML_XINCLUDE_END :
+            case XML_DOCUMENT_NODE :
+                return new XMLNotHandledElement(doc, node);
+            default :
+                break;
+            }
+        }
 
-       }
-       
         return 0;
     }
 }
index df2d3db..9334ab5 100644 (file)
  *
  */
 
-#include "xml.h"
+#ifndef __XMLNODESET_HXX__
+#define __XMLNODESET_HXX__
+
 #include "XMLList.hxx"
+#include "xml.h"
 
 namespace org_modules_xml
 {
     class XMLDocument;
     class XMLElement;
 
+    /**
+     * @file
+     * @author Calixte DENIZET <calixte.denizet@scilab.org>
+     *
+     * Class to wrap the list of the elements returned by a XPath query
+     */
     class XMLNodeSet : public XMLList
     {
 
-        XMLDocument * doc;
+        const XMLDocument & doc;
         xmlNodeSet * nodeSet;
 
     public :
-        XMLNodeSet(XMLDocument * doc, xmlNodeSet * nodeSet);
+
+        /**
+         * Default constructor
+         * @param doc the document where the node set is existing
+         * @param nodeSet a xmlNodeSet
+         */
+        XMLNodeSet(const XMLDocument & doc, xmlNodeSet * nodeSet);
+
         ~XMLNodeSet();
 
-       XMLObject * getXMLObjectParent();
-        XMLObject * getListElement(int index);
+        const XMLObject * getXMLObjectParent() const;
+        const XMLObject * getListElement(int index);
     };
 }
+
+#endif
index 0cb0810..9572e97 100644 (file)
@@ -20,12 +20,10 @@ extern "C" {
 
 namespace org_modules_xml
 {
-    XMLNotHandledElement::XMLNotHandledElement(XMLObject * parent_, xmlNode * node_)
-        : XMLObject()
+    XMLNotHandledElement::XMLNotHandledElement(const XMLObject & _parent, xmlNode * _node) : XMLObject(), parent(_parent)
     {
-        this->parent = parent_;
-       this->node = node_;
-       scilabType = XMLNOTHANDLED;
+        node = _node;
+        scilabType = XMLNOTHANDLED;
     }
 
     XMLNotHandledElement::~XMLNotHandledElement()
@@ -33,13 +31,13 @@ namespace org_modules_xml
         scope.removeId<XMLNotHandledElement>(id);
     }
 
-    XMLObject * XMLNotHandledElement::getXMLObjectParent()
+    const XMLObject * XMLNotHandledElement::getXMLObjectParent() const
     {
-        return parent;
+        return &parent;
     }
 
-    std::string * XMLNotHandledElement::toString()
+    const std::string XMLNotHandledElement::toString() const
     {
-        return new std::string("Not handled XML Element\ntype" + std::string(nodes_type[node->type - 1]));
+        return std::string("Not handled XML Element\ntype") + std::string(nodes_type[node->type - 1]);
     }
 }
index 0af4601..5072295 100644 (file)
@@ -10,6 +10,9 @@
  *
  */
 
+#ifndef __XMLNOTHANDLEDELEMENT_HXX__
+#define __XMLNOTHANDLEDELEMENT_HXX__
+
 #include <string>
 
 #include "xml.h"
 namespace org_modules_xml
 {
     class XMLObject;
-    
+
+    /**
+     * @file
+     * @author Calixte DENIZET <calixte.denizet@scilab.org>
+     *
+     * Class for not handled nodes.
+     */
     class XMLNotHandledElement : public XMLObject
     {
-       XMLObject * parent;
-       xmlNode * node;
-       
+        const XMLObject & parent;
+        xmlNode * node;
+
     public:
-       XMLNotHandledElement(XMLObject * parent, xmlNode * node);
-       ~XMLNotHandledElement();
-       
-       XMLObject * getXMLObjectParent();
-       std::string * toString();
+        /**
+         * Default constructor
+         * @param parent the parent
+         * @param node the not handled node
+         */
+        XMLNotHandledElement(const XMLObject & parent, xmlNode * node);
+
+        ~XMLNotHandledElement();
+
+        const XMLObject * getXMLObjectParent() const;
+        const std::string toString() const;
     };
 }
+
+#endif
+
index 7497fb1..8c0e404 100644 (file)
 
 namespace org_modules_xml
 {
-    XMLNs::XMLNs(XMLObject * parent, xmlNs * ns)
-        : XMLObject()
+
+    XMLNs::XMLNs(const XMLObject & _parent, xmlNs * _ns) : XMLObject(), parent(_parent)
+    {
+        ns = _ns;
+        scope.registerPointers(ns, this);
+        scilabType = XMLNAMESPACE;
+    }
+
+    XMLNs::XMLNs(const XMLElement & elem, char * prefix, char * href) : XMLObject(), parent(elem)
     {
-        this->ns = ns;
-        this->parent = parent;
-       scilabType = XMLNAMESPACE;
+        ns = xmlNewNs(elem.getRealNode(), (const xmlChar *)href, (const xmlChar *)prefix);
+        scope.registerPointers(ns, this);
+        scilabType = XMLNAMESPACE;
     }
 
     XMLNs::~XMLNs()
     {
+        scope.unregisterPointer(ns);
         scope.removeId<XMLNs>(id);
     }
 
-    XMLObject * XMLNs::getXMLObjectParent()
+    const XMLObject * XMLNs::getXMLObjectParent() const
     {
-        return parent;
+        return &parent;
     }
 
-    std::string * XMLNs::toString()
+    const std::string XMLNs::toString() const
     {
         std::string str = "XML Namespace\n";
-        str += "uri: " + std::string(this->getURI()) + "\n";
-        str += "prefix: " + std::string(this->getPrefix());
+        str += "href: " + std::string(getHref()) + "\n";
+        str += "prefix: " + std::string(getPrefix());
 
-        return new std::string(str);
+        return str;
     }
 }
index a3582e4..70c55f3 100644 (file)
  *
  */
 
+#ifndef __XMLNS_HXX__
+#define __XMLNS_HXX__
+
 #include <string>
 
 #include "xml.h"
 
 namespace org_modules_xml
 {
+
     class XMLElement;
     class XMLObject;
-    
+
+    /**
+     * @file
+     * @author Calixte DENIZET <calixte.denizet@scilab.org>
+     *
+     * Class to wrap a namespace xmlNs.
+     * @see http://xmlsoft.org/html/libxml-tree.html#xmlNs
+     */
     class XMLNs : public XMLObject
     {
-       XMLObject * parent;
-       xmlNs * ns;
-       
+        const XMLObject & parent;
+        xmlNs * ns;
+
     public:
-       XMLNs(XMLObject * parent, xmlNs * ns);
-       ~XMLNs();
-       
-       const char * getURI(void) { return ns == 0 ? "" : (const char *)ns->href; }
-       const char * getPrefix(void) { return ns == 0 ? "" : (const char *)ns->prefix; }
-       XMLObject * getXMLObjectParent();
-       std::string * toString();
+
+        /**
+         * @param parent the parent XML object
+         * @param ns the xml namespace
+         */
+        XMLNs(const XMLObject & parent, xmlNs * ns);
+
+        /**
+         * @param elem the parent XMLElement
+         * @param prefix the namespace prefix
+         * @param href the namespace href
+         */
+        XMLNs(const XMLElement & elem, char * prefix, char * href);
+
+        ~XMLNs();
+
+        /**
+         * @return the namespace href
+         */
+        const char * getHref() const { return ns == 0 ? "" : (const char *)ns->href; }
+
+        /**
+         * @return the namespace prefix
+         */
+        const char * getPrefix() const { return ns == 0 ? "" : (const char *)ns->prefix; }
+
+        /**
+         * @return the xmlNs behind this object
+         */
+        xmlNs * getRealNs() const { return ns; }
+
+        const XMLObject * getXMLObjectParent() const;
+        const std::string toString() const;
     };
 }
+
+#endif
index 60e7417..3876b66 100644 (file)
@@ -21,22 +21,22 @@ namespace org_modules_xml
 
     XMLObject::XMLObject()
     {
-       this->id = scope.getVariableId(*this);
-       scilabType = -1;
+        id = scope.getVariableId(*this);
+        scilabType = -1;
     }
 
     XMLObject * XMLObject::getVariableFromId(int id)
     {
-       return scope.getVariableFromId(id);
+        return scope.getVariableFromId(id);
     }
 
-    int XMLObject::createOnStack(int pos)
+    int XMLObject::createOnStack(int pos) const
     {
-       if (scilabType != -1)
-       {
-           return createXMLObjectAtPos(scilabType, pos, id);
-       }
+        if (scilabType != -1)
+        {
+            return createXMLObjectAtPos(scilabType, pos, id);
+        }
 
-       return 0;
+        return 0;
     }
 }
index 05aa400..15be702 100644 (file)
  *
  */
 
+#ifndef __XMLOBJECTS_HXX__
+#define __XMLOBJECTS_HXX__
+
 #include <string>
 #include <sstream>
+#include <typeinfo>
 
 extern "C" {
 #include "xml_mlist.h"
@@ -21,38 +25,86 @@ namespace org_modules_xml
 {
     class VariableScope;
 
+    /**
+     * @file
+     * @author Calixte DENIZET <calixte.denizet@scilab.org>
+     *
+     * Base class for the XML objects.
+     */
     class XMLObject
     {
-       
+
     public :
+
+        /**
+         * Default constructor
+         */
         XMLObject();
+
+        /**
+         * Destructor
+         */
         virtual ~XMLObject() { }
 
-        virtual XMLObject * getXMLObjectParent() = 0;
-       virtual std::string * toString() {return new std::string("");};
-       virtual std::string * dump() { return new std::string(""); }
+        /**
+         * Gets a XML parent object. A set of dependencies is created between the objects
+         * to be sure that all the XML objects will be freed when a document will be destroyed.
+         * @return the parent XMLObject
+         */
+        virtual const XMLObject * getXMLObjectParent() const { return 0; }
+
+        /**
+         * @return the string representation of this object
+         */
+        virtual const std::string toString() const { return std::string(""); }
+
+        /**
+         * @return a dump of this object
+         */
+        virtual const std::string dump() const { return std::string(""); }
 
-       int getId() { return id; }
-       int createOnStack(int pos);
+        /**
+         * @return the object id
+         */
+        int getId() const { return id; }
 
+        /**
+         * Creates the Scilab's variable corresponding to this object
+         * @param pos the stack position
+         * @return 1 if all is ok, else 0
+         */
+        int createOnStack(int pos) const;
+
+        /**
+         * @param id the object id
+         * @return the object which has the corresponding id or 0 if not found
+         */
         template <class T>
-        static T* getFromId(int id) { return static_cast<T*>(getVariableFromId(id)); }
-       
-       static std::string intToStr(int n)
-           {
-               std::stringstream oss;
-               oss << n;
-               return oss.str();
-           }
+        static T * getFromId(int id) { return static_cast<T *>(getVariableFromId(id)); }
+
+        /**
+         * Convert a number into a string
+         */
+        static const std::string intToStr(int n)
+            {
+                std::stringstream oss;
+                oss << n;
+                return oss.str();
+            }
 
     protected :
         int id;
-       int scilabType;
-       
+        int scilabType;
+
         static VariableScope & scope;
 
     private :
+        /**
+         * @param id the id
+         * @return XMLObject corresponding to the id or 0 if not found
+         */
         static XMLObject * getVariableFromId(int id);
-
     };
 }
+
+#endif
diff --git a/scilab/modules/xml/src/cpp/XMLRhsValue.hxx b/scilab/modules/xml/src/cpp/XMLRhsValue.hxx
new file mode 100644 (file)
index 0000000..92c14f3
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#ifndef __XMLRHSVALUE_HXX__
+#define __XMLRHSVALUE_HXX__
+
+#include "xmlObjects.h"
+
+extern "C"
+{
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+}
+
+namespace org_modules_xml
+{
+
+    /**
+     * @file
+     * @author Calixte DENIZET <calixte.denizet@scilab.org>
+     *
+     * Base class for the XML objects.
+     */
+    class XMLRhsValue
+    {
+
+    public :
+
+        /**
+         * @anchor get
+         * @param fname the function name
+         * @param addr the Scilab's variable address
+         * @param obj a pointer to the object to retrieve
+         * @return true if all is ok
+         */
+        static bool get(char * fname, int * addr, XMLDocument ** obj) { return get<XMLDocument>(fname, addr, obj); }
+
+        /**
+         * @ref get
+         */
+        static bool get(char * fname, int * addr, XMLElement ** obj) { return get<XMLElement>(fname, addr, obj); }
+
+        /**
+         * @ref get
+         */
+        static bool get(char * fname, int * addr, XMLAttr ** obj) { return get<XMLAttr>(fname, addr, obj); }
+
+        /**
+         * @ref get
+         */
+        static bool get(char * fname, int * addr, XMLNs ** obj) { return get<XMLNs>(fname, addr, obj); }
+
+        /**
+         * @ref get
+         */
+        static bool get(char * fname, int * addr, XMLNodeList ** obj) { return get<XMLNodeList>(fname, addr, obj); }
+
+        /**
+         * @ref get
+         */
+        static bool get(char * fname, int * addr, std::string ** obj)
+            {
+                char ** str = 0;
+               int row = 0;
+               int col = 0;
+                std::string * code = new std::string("");
+
+                if (getAllocatedMatrixOfString(pvApiCtx, addr, &row, &col, &str))
+                {
+                    return false;
+                }
+
+                for (int i = 0; i < row; i++)
+                {
+                    for (int j = 0; j < col; j++)
+                    {
+                        *code += str[i + row * j];
+                    }
+
+                    if (i != row - 1)
+                    {
+                        *code += "\n";
+                    }
+                }
+                freeAllocatedMatrixOfString(row, col, str);
+                *obj = code;
+
+                return true;
+            }
+
+    private :
+
+        /**
+         * @ref get
+         */
+        template <class T>
+        static bool get(char * fname, int * addr, T ** obj)
+            {
+                int id = getXMLObjectId(addr);
+                *obj = XMLObject::getFromId<T>(id);
+                if (!*obj)
+                {
+                    Scierror(999, "%s: XML object does not exist\n", fname);
+                    return false;
+                }
+
+                return true;
+            }
+    };
+}
+
+#endif
index d44dcf5..6ec7100 100644 (file)
 
 namespace org_modules_xml
 {
-    XMLXPath::XMLXPath(XMLDocument * doc, xmlXPathObject * xpath)
-        : XMLObject()
+    XMLXPath::XMLXPath(const XMLDocument & _doc, xmlXPathObject * _xpath) : XMLObject(), doc(_doc)
     {
-        this->doc = doc;
-        this->xpath = xpath;
+        xpath = _xpath;
+        scope.registerPointers(xpath, this);
     }
 
     XMLXPath::~XMLXPath()
     {
+        scope.unregisterPointer(xpath);
         scope.removeId<XMLXPath>(id);
     }
 
-    XMLObject * XMLXPath::getXMLObjectParent()
+    const XMLObject * XMLXPath::getXMLObjectParent() const
     {
-        return doc;
+        return &doc;
     }
 
-    XMLNodeSet * XMLXPath::getNodeSet()
+    const XMLNodeSet * XMLXPath::getNodeSet() const
     {
-       return new XMLNodeSet(doc, xpath->nodesetval);
+        return new XMLNodeSet(doc, xpath->nodesetval);
     }
 }
index 1960692..15e93ba 100644 (file)
@@ -10,7 +10,8 @@
  *
  */
 
-#include <string>
+#ifndef __XMLXPATH_HXX__
+#define __XMLXPATH_HXX__
 
 #include "xml.h"
 
@@ -22,18 +23,21 @@ namespace org_modules_xml
 
     class XMLXPath : public XMLObject
     {
-        XMLDocument * doc;
+        const XMLDocument & doc;
         xmlXPathObject * xpath;
 
     public:
-        XMLXPath(XMLDocument * doc, xmlXPathObject * xpath);
-        ~XMLXPath();
-
-        int getBooleanValue(void) { return xpath->boolval; }
-        double getFloatValue(void) { return xpath->floatval; }
-        const char * getStringValue(void) { return (const char *)xpath->stringval; }
-        int getResultType(void) { return xpath->type; }
-        XMLNodeSet * getNodeSet(void);
-        XMLObject * getXMLObjectParent();
+        XMLXPath(const XMLDocument & doc, xmlXPathObject * xpath);
+       ~XMLXPath();
+
+        int getBooleanValue() const { return xpath->boolval; }
+        double getFloatValue() const { return xpath->floatval; }
+        const char * getStringValue() const { return (const char *)xpath->stringval; }
+        int getResultType() const { return xpath->type; }
+        const XMLNodeSet * getNodeSet() const;
+        const XMLObject * getXMLObjectParent() const;
+
     };
 }
+
+#endif
index 54b25c0..65bd25c 100644 (file)
@@ -10,6 +10,8 @@
  *
  */
 
+#include <vector>
+
 #include "XMLObject.hxx"
 #include "XMLDocument.hxx"
 #include "XMLElement.hxx"
@@ -26,11 +28,20 @@ extern "C"
 #include "api_scilab.h"
 #include "xml_mlist.h"
 #include "xml_constants.h"
+#include "localization.h"
 }
 
 using namespace org_modules_xml;
 
 /*--------------------------------------------------------------------------*/
+
+/**
+ * Creates a string on stack
+ * @param fname the function name
+ * @param str the string to put
+ * @param pos the stack position
+ * @return 1 if all is ok, else 0
+ */
 int createStringOnStack(char * fname, const char * str, int pos)
 {
     SciErr err;
@@ -39,7 +50,36 @@ int createStringOnStack(char * fname, const char * str, int pos)
     {
         str = "";
     }
-    err = createMatrixOfString(pvApiCtx, pos, 1, 1, const_cast<const char * const *>(&str));
+
+    if (strchr(str, '\n'))
+    {
+        char * tok = strdup(str);
+        char * stok = tok;
+        std::vector<char *> vector = std::vector<char *>();
+
+        tok = strtok(tok, "\n");
+        while (tok)
+        {
+            vector.push_back(tok);
+            tok = strtok(0, "\n");
+        }
+
+        if (vector.size())
+        {
+            err = createMatrixOfString(pvApiCtx, pos, vector.size(), 1, const_cast<const char * const *>(&(vector[0])));
+        }
+        else
+        {
+            err = createMatrixOfDouble(pvApiCtx, pos, 0, 0, 0);
+        }
+
+        free(stok);
+    }
+    else
+    {
+        err = createMatrixOfString(pvApiCtx, pos, 1, 1, const_cast<const char * const *>(&str));
+    }
+
     if (err.iErr)
     {
         printError(&err, 0);
@@ -49,11 +89,19 @@ int createStringOnStack(char * fname, const char * str, int pos)
     return 1;
 }
 /*--------------------------------------------------------------------------*/
-int createVariableOnStack(char * fname, org_modules_xml::XMLDocument & doc, const char * field, int pos)
+/**
+ * Creates a new variable on stack according to the requested field
+ * @param fname the function name
+ * @param doc the document
+ * @param field the field name
+ * @param pos the stack position
+ * @return 1 if all is ok, else 0
+ */
+int createVariableOnStack(char * fname, XMLDocument & doc, const char * field, int pos)
 {
     if (!strcmp("root", field))
     {
-       return doc.getRoot()->createOnStack(pos);
+        return doc.getRoot()->createOnStack(pos);
     }
     else if (!strcmp("url", field))
     {
@@ -61,13 +109,20 @@ int createVariableOnStack(char * fname, org_modules_xml::XMLDocument & doc, cons
     }
     else
     {
-        Scierror(999, "%s: Unknown field: %s\n", fname, field);
+        Scierror(999, gettext("%s: Unknown field: %s\n"), fname, field);
         return 0;
     }
-
-    return 1;
 }
 /*--------------------------------------------------------------------------*/
+
+/**
+ * Creates a new variable on stack according to the requested field
+ * @param fname the function name
+ * @param elem the element
+ * @param field the field name
+ * @param pos the stack position
+ * @return 1 if all is ok, else 0
+ */
 int createVariableOnStack(char * fname, XMLElement & elem, const char * field, int pos)
 {
     if (!strcmp("name", field))
@@ -76,14 +131,23 @@ int createVariableOnStack(char * fname, XMLElement & elem, const char * field, i
     }
     else if (!strcmp("namespace", field))
     {
-        return elem.getNodeNameSpace()->createOnStack(pos);
+        const XMLNs * ns = elem.getNodeNameSpace();
+        if (ns)
+        {
+            return ns->createOnStack(pos);
+        }
+        else
+        {
+            createMatrixOfDouble(pvApiCtx, pos, 0, 0, 0);
+            return 1;
+        }
     }
     else if (!strcmp("content", field))
     {
         const char * content = elem.getNodeContent();
-        int ierr = createStringOnStack(fname, content, pos);
+        int ret = createStringOnStack(fname, content, pos);
         xmlFree(const_cast<char *>(content));
-        return ierr;
+        return ret;
     }
     else if (!strcmp("type", field))
     {
@@ -91,7 +155,16 @@ int createVariableOnStack(char * fname, XMLElement & elem, const char * field, i
     }
     else if (!strcmp("parent", field))
     {
-        return elem.getParentElement()->createOnStack(pos);
+        const XMLElement * parent = elem.getParentElement();
+        if (parent)
+        {
+            return parent->createOnStack(pos);
+        }
+        else
+        {
+            createMatrixOfDouble(pvApiCtx, pos, 0, 0, 0);
+            return 1;
+        }
     }
     else if (!strcmp("attributes", field))
     {
@@ -103,42 +176,58 @@ int createVariableOnStack(char * fname, XMLElement & elem, const char * field, i
     }
     else
     {
-        Scierror(999, "%s: Unknown field: %s\n", fname, field);
+        Scierror(999, gettext("%s: Unknown field: %s\n"), fname, field);
     }
     return 0;
 }
 /*--------------------------------------------------------------------------*/
+
+/**
+ * Creates a new variable on stack according to the requested field
+ * @param fname the function name
+ * @param ns the namespace
+ * @param field the field name
+ * @param pos the stack position
+ * @return 1 if all is ok, else 0
+ */
 int createVariableOnStack(char * fname, XMLNs & ns, const char * field, int pos)
 {
-    if (!strcmp("uri", field))
+    if (!strcmp("href", field))
     {
-        createStringOnStack(fname, ns.getURI(), pos);
+        return createStringOnStack(fname, ns.getHref(), pos);
     }
     else if (!strcmp("prefix", field))
     {
-        createStringOnStack(fname, ns.getPrefix(), pos);
+        return createStringOnStack(fname, ns.getPrefix(), pos);
     }
     else
     {
-        Scierror(999, "%s: Unknown field: %s\n", fname, field);
+        Scierror(999, gettext("%s: Unknown field: %s\n"), fname, field);
         return 0;
     }
-
-    return 1;
 }
 /*--------------------------------------------------------------------------*/
+
+/**
+ * Creates a new variable on stack according to the requested field
+ * @param fname the function name
+ * @param attr the attributes
+ * @param field the field name
+ * @param pos the stack position
+ * @return 1 if all is ok, else 0
+ */
 int createVariableOnStack(char * fname, XMLAttr & attr, const char * field, int pos)
 {
     const char * value = attr.getAttributeValue(field);
-    int ret = createStringOnStack(fname, value, pos);
-    if (value)
-    {
-        xmlFree(const_cast<char *>(value));
-    }
-
-    return ret;
+    return createStringOnStack(fname, value, pos);
 }
 /*--------------------------------------------------------------------------*/
+
+/**
+ * Function to handle extraction in different XMLObjects
+ * @param fname the function name
+ * @param fname_len the function name length
+ */
 template<class T>
 int sci_extraction(char * fname, unsigned long fname_len)
 {
@@ -162,7 +251,7 @@ int sci_extraction(char * fname, unsigned long fname_len)
 
     if (!isStringType(pvApiCtx, fieldaddr))
     {
-        Scierror(999, "%s: Wrong type for input argument %i: String expected\n", fname, 1);
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, 1);
         return 0;
     }
 
@@ -177,10 +266,9 @@ int sci_extraction(char * fname, unsigned long fname_len)
     id = getXMLObjectId(mlistaddr);
 
     t = XMLObject::getFromId<T>(id);
-
     if (!t)
     {
-        Scierror(999, "%s: XML object does not exist\n", fname);
+        Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
         return 0;
     }
 
diff --git a/scilab/modules/xml/src/cpp/insertion.hpp b/scilab/modules/xml/src/cpp/insertion.hpp
new file mode 100644 (file)
index 0000000..71b4e8b
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#ifndef __INSERTION_HPP__
+#define __INSERTION_HPP__
+
+#include "XMLRhsValue.hxx"
+
+extern "C"
+{
+#include <stdio.h>
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+#define __XML_CHECK_TYPE__(TYPEIN,REQUIREDTYPE,FIELD) if (typeid(TYPEIN) != typeid(REQUIREDTYPE)) \
+    {                                                                   \
+        Scierror(999, gettext("%s: Wrong type to set %s field.\n"), fname, FIELD); \
+        return false;                                                   \
+    }
+/*--------------------------------------------------------------------------*/
+
+/**
+ * Sets the properties of a XMLDocument
+ * A value will have the type T
+ * @param fname function name
+ * @param doc the XMLDocument
+ * @param field te field name
+ * @param value the new value
+ */
+template <class T>
+bool setProperty(char * fname, XMLDocument & doc, const char * field, T & value)
+{
+    if (!strcmp("root", field))
+    {
+        if (typeid(T &) != typeid(XMLElement &) && typeid(T &) != typeid(std::string &))
+        {
+            Scierror(999, gettext("%s: Wrong type to set %s field.\n"), fname, "root");
+            return false;
+        }
+        if (typeid(T &) == typeid(XMLElement &))
+        {
+            doc.setRoot((XMLElement &)value);
+        }
+        else
+        {
+            char * error = 0;
+            doc.setRoot((std::string &)value, &error);
+            if (error)
+            {
+                Scierror(999, gettext("%s: Not valid xml for root.\n"), fname);
+                return false;
+            }
+        }
+    }
+    else if (!strcmp("url", field))
+    {
+        __XML_CHECK_TYPE__(T &, std::string &, "url");
+        doc.setDocumentURL((std::string &)value);
+    }
+    else
+    {
+        Scierror(999, gettext("%s: Unknown field: %s\n"), fname, field);
+        return false;
+    }
+
+    return true;
+}
+/*--------------------------------------------------------------------------*/
+
+/**
+ * Sets the properties of a XMLElement
+ * A value will have the type T
+ * @param fname function name
+ * @param elem the XMLElement
+ * @param field te field name
+ * @param value the new value
+ */
+template <class T>
+bool setProperty(char * fname, XMLElement & elem, const char * field, T & value)
+{
+    if (!strcmp("name", field))
+    {
+        __XML_CHECK_TYPE__(T &, std::string &, "name");
+        elem.setNodeName((std::string &)value);
+    }
+    else if (!strcmp("namespace", field))
+    {
+        __XML_CHECK_TYPE__(T &, XMLNs &, "namespace");
+        elem.setNodeNameSpace((XMLNs &)value);
+    }
+    else if (!strcmp("content", field))
+    {
+        __XML_CHECK_TYPE__(T &, std::string &, "content");
+        elem.setNodeContent((std::string &)value);
+    }
+    else if (!strcmp("type", field))
+    {
+        Scierror(999, gettext("%s: Field %s is not modifiable: %s\n"), fname, "type");
+        return false;
+    }
+    else if (!strcmp("parent", field))
+    {
+        Scierror(999, gettext("%s: Field %s is not modifiable: %s\n"), fname, "parent");
+        return false;
+    }
+    else if (!strcmp("attributes", field))
+    {
+        __XML_CHECK_TYPE__(T &, XMLAttr &, "attributes");
+        elem.setAttributes((XMLAttr &)value);
+    }
+    else if (!strcmp("children", field))
+    {
+        if (typeid(T &) != typeid(XMLElement &) && typeid(T &) != typeid(XMLNodeList &) && typeid(T &) != typeid(std::string &))
+        {
+            Scierror(999, gettext("%s: Wrong type to set %s field.\n"), fname, "children");
+            return false;
+        }
+        if (typeid(T &) == typeid(XMLElement &))
+        {
+            elem.setChildren((XMLElement &)value);
+        }
+        else if (typeid(T &) == typeid(XMLNodeList &))
+        {
+            elem.setChildren((XMLNodeList &)value);
+        }
+        else
+        {
+            elem.setChildren((std::string &)value);
+        }
+    }
+    else
+    {
+        Scierror(999, gettext("%s: Unknown field: %s\n"), fname, field);
+        return false;
+    }
+
+    return true;
+}
+/*--------------------------------------------------------------------------*/
+
+/**
+ * Function to handle insertion in different XMLObjects
+ * @param fname the function name
+ * @param fname_len the function name length
+ */
+template<class T, class U>
+int sci_insertion(char * fname, unsigned long fname_len)
+{
+    T * a;
+    U * b;
+    int lhsid;
+    SciErr err;
+    int * fieldaddr = 0;
+    int * rhsaddr = 0;
+    int * lhsaddr = 0;
+    char * field = 0;
+    bool success;
+
+    CheckLhs(1, 1);
+    CheckRhs(3, 3);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &fieldaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isStringType(pvApiCtx, fieldaddr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A string expected.\n"), fname, 1);
+        return 0;
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 2, &rhsaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 3, &lhsaddr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    getAllocatedSingleString(pvApiCtx, fieldaddr, &field);
+    lhsid = getXMLObjectId(lhsaddr);
+
+    a = XMLObject::getFromId<T>(lhsid);
+    if (!a)
+    {
+        Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
+        return 0;
+    }
+
+    success = XMLRhsValue::get(fname, rhsaddr, &b);
+    if (!success)
+    {
+        Scierror(999, gettext("%s: Error in getting rhs argument.\n"), fname);
+        return 0;
+    }
+
+    success = setProperty<U>(fname, *a, const_cast<char *>(field), *b);
+
+    if (typeid(U) == typeid(std::string))
+    {
+        delete b;
+    }
+
+    if (a->createOnStack(Rhs + 1))
+    {
+        LhsVar(1) = Rhs + 1;
+    }
+    else
+    {
+        LhsVar(1) = 0;
+    }
+
+    PutLhsVar();
+
+    return 0;
+}
+
+#endif