1 %include <perlstrings.swg>
3 %fragment("<XMLCh.h>","header")
5 #include <xercesc/util/XMLString.hpp>
6 #include <xercesc/util/TransService.hpp>
7 #include <xercesc/util/XMLUTF8Transcoder.hpp>
10 %fragment("SWIG_UTF8Transcoder","header",fragment="<XMLCh.h>") {
11 SWIGINTERN XERCES_CPP_NAMESPACE::XMLTranscoder*
12 SWIG_UTF8Transcoder() {
13 using namespace XERCES_CPP_NAMESPACE;
15 static XMLTranscoder* UTF8_TRANSCODER = NULL;
16 static XMLCh* UTF8_ENCODING = NULL;
18 XMLTransService::Codes failReason;
19 XMLPlatformUtils::Initialize(); // first we must create the transservice
20 UTF8_ENCODING = XMLString::transcode("UTF-8");
21 UTF8_TRANSCODER = XMLPlatformUtils::fgTransService->makeNewTranscoderFor(UTF8_ENCODING,
26 return UTF8_TRANSCODER;
30 %fragment("SWIG_AsXMLChPtrAndSize","header",fragment="SWIG_AsCharPtrAndSize",fragment="SWIG_UTF8Transcoder") {
32 SWIG_AsXMLChPtrAndSize(SV *obj, XMLCh **val, size_t* psize, int *alloc)
35 return SWIG_AsCharPtrAndSize(obj, 0, 0, 0);
39 int calloc = SWIG_OLDOBJ;
40 int res = SWIG_AsCharPtrAndSize(obj, &cptr, &size, &calloc);
42 STRLEN length = size - 1;
44 unsigned int charsEaten = 0;
45 unsigned char* sizes = %new_array(size, unsigned char);
46 *val = %new_array(size, XMLCh);
47 unsigned int chars_stored =
48 SWIG_UTF8Transcoder()->transcodeFrom((const XMLByte*) cptr,
49 (unsigned int) length,
51 (unsigned int) length,
56 // indicate the end of the string
57 (*val)[chars_stored] = '\0';
59 *val = XERCES_CPP_NAMESPACE::XMLString::transcode(cptr);
61 if (psize) *psize = size;
62 if (alloc) *alloc = SWIG_NEWOBJ;
63 if (calloc == SWIG_NEWOBJ) %delete_array(cptr);
72 %fragment("SWIG_FromXMLChPtrAndSize","header",fragment="SWIG_UTF8Transcoder") {
74 SWIG_FromXMLChPtrAndSize(const XMLCh* input, size_t size)
76 SV *output = sv_newmortal();
77 unsigned int charsEaten = 0;
78 int length = size; // string length
79 XMLByte* res = %new_array(length * UTF8_MAXLEN, XMLByte); // output string
80 unsigned int total_chars =
81 SWIG_UTF8Transcoder()->transcodeTo((const XMLCh*) input,
82 (unsigned int) length,
84 (unsigned int) length*UTF8_MAXLEN,
86 XERCES_CPP_NAMESPACE::XMLTranscoder::UnRep_Throw
88 res[total_chars] = '\0';
89 sv_setpv((SV*)output, (char *)res );
90 SvUTF8_on((SV*)output);
97 if (!SWIG_UTF8Transcoder()) {
98 croak("ERROR: XML::Xerces: INIT: Could not create UTF-8 transcoder");
103 %include <typemaps/strings.swg>
104 %typemaps_string(%checkcode(UNISTRING), %checkcode(UNICHAR),
106 SWIG_AsXMLChPtrAndSize,
107 SWIG_FromXMLChPtrAndSize,
108 XERCES_CPP_NAMESPACE::XMLString::stringLen,
109 "<XMLCh.h>", INT_MIN, INT_MAX);