treat XMLCh properly using %typemaps_string
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8213 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
809530e8b1
commit
47a201bf89
5 changed files with 126 additions and 35 deletions
19
Examples/perl5/xmlstring/Makefile
Normal file
19
Examples/perl5/xmlstring/Makefile
Normal file
|
|
@ -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
|
||||||
1
Examples/perl5/xmlstring/example.cxx
Normal file
1
Examples/perl5/xmlstring/example.cxx
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
#include "example.h"
|
||||||
36
Examples/perl5/xmlstring/example.h
Normal file
36
Examples/perl5/xmlstring/example.h
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
#include <xercesc/util/XMLString.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
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];
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
10
Examples/perl5/xmlstring/example.i
Normal file
10
Examples/perl5/xmlstring/example.i
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
%module example
|
||||||
|
|
||||||
|
%include <xmlstring.i>
|
||||||
|
|
||||||
|
%{
|
||||||
|
#include "example.h"
|
||||||
|
%}
|
||||||
|
|
||||||
|
|
||||||
|
%include example.h
|
||||||
|
|
@ -1,43 +1,66 @@
|
||||||
%include <typemaps/ptrtypes.swg>
|
|
||||||
%include <perlstrings.swg>
|
%include <perlstrings.swg>
|
||||||
|
|
||||||
|
%fragment("<XMLCh.h>","header")
|
||||||
%{
|
%{
|
||||||
/* include here XMLCh/XMString declaration */
|
#include <xercesc/util/XMLString.hpp>
|
||||||
|
#include <xercesc/util/TransService.hpp>
|
||||||
|
#include <xercesc/util/XMLUTF8Transcoder.hpp>
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
%fragment("SWIG_UTF8Transcoder","header",fragment="<XMLCh.h>") {
|
||||||
|
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
|
SWIGINTERN int
|
||||||
SWIG_AsPtrXMLChPtr(SV *obj, XMLCh **val)
|
SWIG_AsXMLChPtrAndSize(SV *obj, XMLCh **val, size_t* psize, int *alloc)
|
||||||
{
|
{
|
||||||
if (!val) {
|
if (!val) {
|
||||||
return SWIG_AsCharPtrAndSize(obj, 0, 0, 0);
|
return SWIG_AsCharPtrAndSize(obj, 0, 0, 0);
|
||||||
} else {
|
} else {
|
||||||
size_t size;
|
size_t size;
|
||||||
char *ptr = 0;
|
char *cptr = 0;
|
||||||
int alloc = SWIG_OLDOBJ;
|
int calloc = SWIG_OLDOBJ;
|
||||||
int res = SWIG_AsCharPtrAndSize(obj, &ptr, &size, &alloc);
|
int res = SWIG_AsCharPtrAndSize(obj, &cptr, &size, &calloc);
|
||||||
if (SWIG_IsOK(res)) {
|
if (SWIG_IsOK(res)) {
|
||||||
STRLEN length = size - 1;
|
STRLEN length = size - 1;
|
||||||
if (SvUTF8(input)) {
|
if (SvUTF8(obj)) {
|
||||||
unsigned int charsEaten = 0;
|
unsigned int charsEaten = 0;
|
||||||
unsigned char* sizes = %new_array(size, unsigned char);
|
unsigned char* sizes = %new_array(size, unsigned char);
|
||||||
*val = %new_array(size, XMLCh);
|
*val = %new_array(size, XMLCh);
|
||||||
unsigned int chars_stored =
|
unsigned int chars_stored =
|
||||||
UTF8_TRANSCODER->transcodeFrom((const XMLByte*) ptr,
|
SWIG_UTF8Transcoder()->transcodeFrom((const XMLByte*) cptr,
|
||||||
(unsigned int) length,
|
(unsigned int) length,
|
||||||
(XMLCh*) *val,
|
(XMLCh*) *val,
|
||||||
(unsigned int) length,
|
(unsigned int) length,
|
||||||
charsEaten,
|
charsEaten,
|
||||||
(unsigned char*)sizes
|
(unsigned char*)sizes
|
||||||
);
|
);
|
||||||
%delete_array(sizes);
|
%delete_array(sizes);
|
||||||
// indicate the end of the string
|
// indicate the end of the string
|
||||||
(*val)[chars_stored] = '\0';
|
(*val)[chars_stored] = '\0';
|
||||||
} else {
|
} 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;
|
return SWIG_NEWOBJ;
|
||||||
} else {
|
} else {
|
||||||
return res;
|
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 *
|
SWIGINTERNINLINE SV *
|
||||||
SWIG_FromXMLChPtr(XMLCh* input)
|
SWIG_FromXMLChPtrAndSize(const XMLCh* input, size_t size)
|
||||||
{
|
{
|
||||||
SV *output = sv_newmortal();
|
SV *output = sv_newmortal();
|
||||||
unsigned int charsEaten = 0;
|
unsigned int charsEaten = 0;
|
||||||
int length = XMLChPtr::stringLen(input); // string length
|
int length = size; // string length
|
||||||
XMLByte* res = new XMLByte[length * UTF8_MAXLEN]; // output string
|
XMLByte* res = %new_array(length * UTF8_MAXLEN, XMLByte); // output string
|
||||||
unsigned int total_chars =
|
unsigned int total_chars =
|
||||||
UTF8_TRANSCODER->transcodeTo((const XMLCh*) input,
|
SWIG_UTF8Transcoder()->transcodeTo((const XMLCh*) input,
|
||||||
(unsigned int) length,
|
(unsigned int) length,
|
||||||
(XMLByte*) res,
|
(XMLByte*) res,
|
||||||
(unsigned int) length*UTF8_MAXLEN,
|
(unsigned int) length*UTF8_MAXLEN,
|
||||||
charsEaten,
|
charsEaten,
|
||||||
XMLTranscoder::UnRep_Throw
|
XERCES_CPP_NAMESPACE::XMLTranscoder::UnRep_Throw
|
||||||
);
|
);
|
||||||
res[total_chars] = '\0';
|
res[total_chars] = '\0';
|
||||||
sv_setpv((SV*)output, (char *)res );
|
sv_setpv((SV*)output, (char *)res );
|
||||||
SvUTF8_on((SV*)output);
|
SvUTF8_on((SV*)output);
|
||||||
delete[] res;
|
%delete_array(res);
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
%typemaps_asptrfrom(%checkcode(STRING),
|
%include <typemaps/strings.swg>
|
||||||
SWIG_AsPtrXMLChPtr,
|
%typemaps_string(XMLCh, XMLCh,
|
||||||
SWIG_FromXMLChPtr,
|
SWIG_AsXMLChPtrAndSize,
|
||||||
"SWIG_AsPtrXMLChPtr",
|
SWIG_FromXMLChPtrAndSize,
|
||||||
"SWIG_FromXMLChPtr",
|
XERCES_CPP_NAMESPACE::XMLString::stringLen,
|
||||||
XMLCh *);
|
"<XMLCh.h>", INT_MIN, INT_MAX);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue