From 47a201bf893ffb4e1f2c8a88ce83c2d4a9516659 Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Wed, 4 Jan 2006 20:20:33 +0000 Subject: [PATCH] treat XMLCh properly using %typemaps_string git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8213 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Examples/perl5/xmlstring/Makefile | 19 ++++++ Examples/perl5/xmlstring/example.cxx | 1 + Examples/perl5/xmlstring/example.h | 36 +++++++++++ Examples/perl5/xmlstring/example.i | 10 +++ Lib/perl5/xmlstring.i | 95 ++++++++++++++++++---------- 5 files changed, 126 insertions(+), 35 deletions(-) create mode 100644 Examples/perl5/xmlstring/Makefile create mode 100644 Examples/perl5/xmlstring/example.cxx create mode 100644 Examples/perl5/xmlstring/example.h create mode 100644 Examples/perl5/xmlstring/example.i diff --git a/Examples/perl5/xmlstring/Makefile b/Examples/perl5/xmlstring/Makefile new file mode 100644 index 000000000..f53361730 --- /dev/null +++ b/Examples/perl5/xmlstring/Makefile @@ -0,0 +1,19 @@ +TOP = ../.. +SWIG = $(TOP)/../preinst-swig +CXXSRCS = example.cxx +TARGET = example +INTERFACE = example.i +LIBS = -lm + +all:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' perl5_cpp + +static:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + TARGET='myperl' INTERFACE='$(INTERFACE)' perl5_cpp_static + +clean:: + $(MAKE) -f $(TOP)/Makefile perl5_clean + +check: all diff --git a/Examples/perl5/xmlstring/example.cxx b/Examples/perl5/xmlstring/example.cxx new file mode 100644 index 000000000..370dd9ea9 --- /dev/null +++ b/Examples/perl5/xmlstring/example.cxx @@ -0,0 +1 @@ +#include "example.h" diff --git a/Examples/perl5/xmlstring/example.h b/Examples/perl5/xmlstring/example.h new file mode 100644 index 000000000..a1ccf2185 --- /dev/null +++ b/Examples/perl5/xmlstring/example.h @@ -0,0 +1,36 @@ +#include + + +class XMLChTest +{ + XMLCh *_val; + +public: + + XMLChTest() : _val(0) + { + } + + void set(const XMLCh *v) + { + size_t len = XERCES_CPP_NAMESPACE::XMLString::stringLen(v); + delete[] _val; + _val = new XMLCh[len + 1]; + for (int i = 0; i < len; ++i) { + _val[i] = v[i]; + } + _val[len] = 0; + } + + const XMLCh *get() + { + return _val; + } + + XMLCh get_first() + { + return _val[0]; + } + +}; + diff --git a/Examples/perl5/xmlstring/example.i b/Examples/perl5/xmlstring/example.i new file mode 100644 index 000000000..8a9e02e40 --- /dev/null +++ b/Examples/perl5/xmlstring/example.i @@ -0,0 +1,10 @@ +%module example + +%include + +%{ +#include "example.h" +%} + + +%include example.h diff --git a/Lib/perl5/xmlstring.i b/Lib/perl5/xmlstring.i index 6782c993d..6fd70c7d8 100644 --- a/Lib/perl5/xmlstring.i +++ b/Lib/perl5/xmlstring.i @@ -1,43 +1,66 @@ -%include %include +%fragment("","header") %{ -/* include here XMLCh/XMString declaration */ +#include +#include +#include %} +%fragment("SWIG_UTF8Transcoder","header",fragment="") { +SWIGINTERN XERCES_CPP_NAMESPACE::XMLTranscoder* +SWIG_UTF8Transcoder() { + using namespace XERCES_CPP_NAMESPACE; + static int init = 0; + static XMLTranscoder* UTF8_TRANSCODER = NULL; + static XMLCh* UTF8_ENCODING = NULL; + if (!init) { + XMLTransService::Codes failReason; + XMLPlatformUtils::Initialize(); // first we must create the transservice + UTF8_ENCODING = XMLString::transcode("UTF-8"); + UTF8_TRANSCODER = XMLPlatformUtils::fgTransService->makeNewTranscoderFor(UTF8_ENCODING, + failReason, + 1024); + init = 1; + } + return UTF8_TRANSCODER; +} +} -%fragment("SWIG_AsPtrXMLChPtr","header",fragment="SWIG_AsCharPtrAndSize") { +%fragment("SWIG_AsXMLChPtrAndSize","header",fragment="SWIG_AsCharPtrAndSize",fragment="SWIG_UTF8Transcoder") { SWIGINTERN int -SWIG_AsPtrXMLChPtr(SV *obj, XMLCh **val) +SWIG_AsXMLChPtrAndSize(SV *obj, XMLCh **val, size_t* psize, int *alloc) { if (!val) { return SWIG_AsCharPtrAndSize(obj, 0, 0, 0); } else { size_t size; - char *ptr = 0; - int alloc = SWIG_OLDOBJ; - int res = SWIG_AsCharPtrAndSize(obj, &ptr, &size, &alloc); + char *cptr = 0; + int calloc = SWIG_OLDOBJ; + int res = SWIG_AsCharPtrAndSize(obj, &cptr, &size, &calloc); if (SWIG_IsOK(res)) { STRLEN length = size - 1; - if (SvUTF8(input)) { + if (SvUTF8(obj)) { unsigned int charsEaten = 0; unsigned char* sizes = %new_array(size, unsigned char); *val = %new_array(size, XMLCh); unsigned int chars_stored = - UTF8_TRANSCODER->transcodeFrom((const XMLByte*) ptr, - (unsigned int) length, - (XMLCh*) *val, - (unsigned int) length, - charsEaten, - (unsigned char*)sizes - ); + SWIG_UTF8Transcoder()->transcodeFrom((const XMLByte*) cptr, + (unsigned int) length, + (XMLCh*) *val, + (unsigned int) length, + charsEaten, + (unsigned char*)sizes + ); %delete_array(sizes); // indicate the end of the string (*val)[chars_stored] = '\0'; } else { - *val = XMLChPtr::transcode(ptr); + *val = XERCES_CPP_NAMESPACE::XMLString::transcode(cptr); } - if (SWIG_IsNewObj(res)) %delete_array(ptr); + if (psize) *psize = size; + if (alloc) *alloc = SWIG_NEWOBJ; + if (calloc == SWIG_NEWOBJ) %delete_array(cptr); return SWIG_NEWOBJ; } else { return res; @@ -46,34 +69,36 @@ SWIG_AsPtrXMLChPtr(SV *obj, XMLCh **val) } } -%fragment("SWIG_FromXMLChPtr","header") { +%fragment("SWIG_FromXMLChPtrAndSize","header",fragment="SWIG_UTF8Transcoder") { SWIGINTERNINLINE SV * -SWIG_FromXMLChPtr(XMLCh* input) +SWIG_FromXMLChPtrAndSize(const XMLCh* input, size_t size) { SV *output = sv_newmortal(); unsigned int charsEaten = 0; - int length = XMLChPtr::stringLen(input); // string length - XMLByte* res = new XMLByte[length * UTF8_MAXLEN]; // output string + int length = size; // string length + XMLByte* res = %new_array(length * UTF8_MAXLEN, XMLByte); // output string unsigned int total_chars = - UTF8_TRANSCODER->transcodeTo((const XMLCh*) input, - (unsigned int) length, - (XMLByte*) res, - (unsigned int) length*UTF8_MAXLEN, - charsEaten, - XMLTranscoder::UnRep_Throw - ); + SWIG_UTF8Transcoder()->transcodeTo((const XMLCh*) input, + (unsigned int) length, + (XMLByte*) res, + (unsigned int) length*UTF8_MAXLEN, + charsEaten, + XERCES_CPP_NAMESPACE::XMLTranscoder::UnRep_Throw + ); res[total_chars] = '\0'; sv_setpv((SV*)output, (char *)res ); SvUTF8_on((SV*)output); - delete[] res; + %delete_array(res); return output; } } -%typemaps_asptrfrom(%checkcode(STRING), - SWIG_AsPtrXMLChPtr, - SWIG_FromXMLChPtr, - "SWIG_AsPtrXMLChPtr", - "SWIG_FromXMLChPtr", - XMLCh *); +%include +%typemaps_string(XMLCh, XMLCh, + SWIG_AsXMLChPtrAndSize, + SWIG_FromXMLChPtrAndSize, + XERCES_CPP_NAMESPACE::XMLString::stringLen, + "", INT_MIN, INT_MAX); + +