tng 2002/12/31 10:42:54 Modified: c/src/xercesc/util/Transcoders/IconvGNU IconvGNUTransService.cpp Log: [Bug 15608] IconvLCPTranscoder::transcode() is wrong at wcstombs() usage. Revision Changes Path 1.4 +533 -530 xml-xerces/c/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp Index: IconvGNUTransService.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- IconvGNUTransService.cpp 4 Nov 2002 15:14:34 -0000 1.3 +++ IconvGNUTransService.cpp 31 Dec 2002 18:42:54 -0000 1.4 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.4 2002/12/31 18:42:54 tng + * [Bug 15608] IconvLCPTranscoder::transcode() is wrong at wcstombs() usage. + * * Revision 1.3 2002/11/04 15:14:34 tng * C++ Namespace Support. * @@ -83,15 +86,15 @@ // Description of encoding schemas, supported by iconv() // --------------------------------------------------------------------------- typedef struct __IconvGNUEncoding { - const char* fSchema; // schema name - size_t fUChSize; // size of the character - unsigned int fUBO; // byte order, relative to the host + const char* fSchema; // schema name + size_t fUChSize; // size of the character + unsigned int fUBO; // byte order, relative to the host } IconvGNUEncoding; -static const IconvGNUEncoding gIconvGNUEncodings[] = { - { "UCS-2LE", 2, LITTLE_ENDIAN }, - { "ucs-2-internal", 2, LITTLE_ENDIAN }, - { NULL, 0, 0 } +static const IconvGNUEncoding gIconvGNUEncodings[] = { + { "UCS-2LE", 2, LITTLE_ENDIAN }, + { "ucs-2-internal", 2, LITTLE_ENDIAN }, + { NULL, 0, 0 } }; //-------------------------------------------------- @@ -100,59 +103,59 @@ // and encoding schemas. # if BYTE_ORDER == LITTLE_ENDIAN -# define IXMLCh2WC16(x,w) \ - *(w) = ((*(x)) >> 8) & 0xFF; \ - *((w)+1) = (*(x)) & 0xFF -# define IWC162XMLCh(w,x) *(x) = ((*(w)) << 8) | (*((w)+1)) -# define XMLCh2WC16(x,w) \ - *(w) = (*(x)) & 0xFF; \ - *((w)+1) = ((*(x)) >> 8) & 0xFF -# define WC162XMLCh(w,x) *(x) = ((*((w)+1)) << 8) | (*(w)) - -# define IXMLCh2WC32(x,w) \ - *(w) = ((*(x)) >> 24) & 0xFF; \ - *((w)+1) = ((*(x)) >> 16) & 0xFF; \ - *((w)+2) = ((*(x)) >> 8) & 0xFF; \ - *((w)+3) = (*(x)) & 0xFF -# define IWC322XMLCh(w,x) \ - *(x) = ((*(w)) << 24) | ((*((w)+1)) << 16) | \ - ((*((w)+2)) << 8) | (*((w)+3)) -# define XMLCh2WC32(x,w) \ - *((w)+3) = ((*(x)) >> 24) & 0xFF; \ - *((w)+2) = ((*(x)) >> 16) & 0xFF; \ - *((w)+1) = ((*(x)) >> 8) & 0xFF; \ - *(w) = (*(x)) & 0xFF -# define WC322XMLCh(w,x) \ - *(x) = ((*((w)+3)) << 24) | ((*((w)+2)) << 16) | \ - ((*((w)+1)) << 8) | (*(w)) +# define IXMLCh2WC16(x,w) \ + *(w) = ((*(x)) >> 8) & 0xFF; \ + *((w)+1) = (*(x)) & 0xFF +# define IWC162XMLCh(w,x) *(x) = ((*(w)) << 8) | (*((w)+1)) +# define XMLCh2WC16(x,w) \ + *(w) = (*(x)) & 0xFF; \ + *((w)+1) = ((*(x)) >> 8) & 0xFF +# define WC162XMLCh(w,x) *(x) = ((*((w)+1)) << 8) | (*(w)) + +# define IXMLCh2WC32(x,w) \ + *(w) = ((*(x)) >> 24) & 0xFF; \ + *((w)+1) = ((*(x)) >> 16) & 0xFF; \ + *((w)+2) = ((*(x)) >> 8) & 0xFF; \ + *((w)+3) = (*(x)) & 0xFF +# define IWC322XMLCh(w,x) \ + *(x) = ((*(w)) << 24) | ((*((w)+1)) << 16) | \ + ((*((w)+2)) << 8) | (*((w)+3)) +# define XMLCh2WC32(x,w) \ + *((w)+3) = ((*(x)) >> 24) & 0xFF; \ + *((w)+2) = ((*(x)) >> 16) & 0xFF; \ + *((w)+1) = ((*(x)) >> 8) & 0xFF; \ + *(w) = (*(x)) & 0xFF +# define WC322XMLCh(w,x) \ + *(x) = ((*((w)+3)) << 24) | ((*((w)+2)) << 16) | \ + ((*((w)+1)) << 8) | (*(w)) # else /* BYTE_ORDER != LITTLE_ENDIAN */ -# define XMLCh2WC16(x,w) \ - *(w) = ((*(x)) >> 8) & 0xFF; \ - *((w)+1) = (*(x)) & 0xFF -# define WC162XMLCh(w,x) *(x) = ((*(w)) << 8) | (*((w)+1)) -# define IXMLCh2WC16(x,w) \ - *(w) = (*(x)) & 0xFF; \ - *((w)+1) = ((*(x)) >> 8) & 0xFF -# define IWC162XMLCh(w,x) *(x) = ((*((w)+1)) << 8) | (*(w)) - -# define XMLCh2WC32(x,w) \ - *(w) = ((*(x)) >> 24) & 0xFF; \ - *((w)+1) = ((*(x)) >> 16) & 0xFF; \ - *((w)+2) = ((*(x)) >> 8) & 0xFF; \ - *((w)+3) = (*(x)) & 0xFF -# define WC322XMLCh(w,x) \ - *(x) = ((*(w)) << 24) | ((*((w)+1)) << 16) | \ - ((*((w)+2)) << 8) | (*((w)+3)) -# define IXMLCh2WC32(x,w) \ - *((w)+3) = ((*(x)) >> 24) & 0xFF; \ - *((w)+2) = ((*(x)) >> 16) & 0xFF; \ - *((w)+1) = ((*(x)) >> 8) & 0xFF; \ - *(w) = (*(x)) & 0xFF -# define IWC322XMLCh(w,x) \ - *(x) = ((*((w)+3)) << 24) | ((*((w)+2)) << 16) | \ - ((*((w)+1)) << 8) | (*(w)) +# define XMLCh2WC16(x,w) \ + *(w) = ((*(x)) >> 8) & 0xFF; \ + *((w)+1) = (*(x)) & 0xFF +# define WC162XMLCh(w,x) *(x) = ((*(w)) << 8) | (*((w)+1)) +# define IXMLCh2WC16(x,w) \ + *(w) = (*(x)) & 0xFF; \ + *((w)+1) = ((*(x)) >> 8) & 0xFF +# define IWC162XMLCh(w,x) *(x) = ((*((w)+1)) << 8) | (*(w)) + +# define XMLCh2WC32(x,w) \ + *(w) = ((*(x)) >> 24) & 0xFF; \ + *((w)+1) = ((*(x)) >> 16) & 0xFF; \ + *((w)+2) = ((*(x)) >> 8) & 0xFF; \ + *((w)+3) = (*(x)) & 0xFF +# define WC322XMLCh(w,x) \ + *(x) = ((*(w)) << 24) | ((*((w)+1)) << 16) | \ + ((*((w)+2)) << 8) | (*((w)+3)) +# define IXMLCh2WC32(x,w) \ + *((w)+3) = ((*(x)) >> 24) & 0xFF; \ + *((w)+2) = ((*(x)) >> 16) & 0xFF; \ + *((w)+1) = ((*(x)) >> 8) & 0xFF; \ + *(w) = (*(x)) & 0xFF +# define IWC322XMLCh(w,x) \ + *(x) = ((*((w)+3)) << 24) | ((*((w)+2)) << 16) | \ + ((*((w)+1)) << 8) | (*(w)) # endif /* BYTE_ORDER == LITTLE_ENDIAN */ #include <wchar.h> @@ -172,8 +175,8 @@ // --------------------------------------------------------------------------- // Local, const data // --------------------------------------------------------------------------- -static const unsigned int gTempBuffArraySize = 4096; -static const XMLCh gMyServiceId[] = +static const unsigned int gTempBuffArraySize = 4096; +static const XMLCh gMyServiceId[] = { chLatin_I, chLatin_C, chLatin_o, chLatin_n, chLatin_v, chNull }; @@ -199,8 +202,8 @@ #include <xercesc/util/Mutexes.hpp> // Iconv() access syncronization point -static XMLMutex *gIconvMutex = NULL; -# define ICONV_LOCK XMLMutexLock lockConverter(gIconvMutex); +static XMLMutex *gIconvMutex = NULL; +# define ICONV_LOCK XMLMutexLock lockConverter(gIconvMutex); #else /* APP_NO_THREADS */ @@ -219,15 +222,15 @@ { } -IconvGNUWrapper::IconvGNUWrapper ( iconv_t cd_from, - iconv_t cd_to, - size_t uchsize, - unsigned int ubo ) +IconvGNUWrapper::IconvGNUWrapper ( iconv_t cd_from, + iconv_t cd_to, + size_t uchsize, + unsigned int ubo ) : fUChSize(uchsize), fUBO(ubo), fCDTo(cd_to), fCDFrom(cd_from) { if (fCDFrom == (iconv_t) -1 || fCDTo == (iconv_t) -1) { - XMLPlatformUtils::panic (XMLPlatformUtils::Panic_NoTransService); + XMLPlatformUtils::panic (XMLPlatformUtils::Panic_NoTransService); } } @@ -236,66 +239,66 @@ } // Convert "native unicode" character into XMLCh -void IconvGNUWrapper::mbcToXMLCh (const char *mbc, XMLCh *toRet) const +void IconvGNUWrapper::mbcToXMLCh (const char *mbc, XMLCh *toRet) const { if (fUBO == LITTLE_ENDIAN) { - if (fUChSize == sizeof(XMLCh)) - *toRet = *((XMLCh*) mbc); - else if (fUChSize == 2) { - WC162XMLCh( mbc, toRet ); - } else { - WC322XMLCh( mbc, toRet ); - } + if (fUChSize == sizeof(XMLCh)) + *toRet = *((XMLCh*) mbc); + else if (fUChSize == 2) { + WC162XMLCh( mbc, toRet ); + } else { + WC322XMLCh( mbc, toRet ); + } } else { - if (fUChSize == 2) { - IWC162XMLCh( mbc, toRet ); - } else { - IWC322XMLCh( mbc, toRet ); - } + if (fUChSize == 2) { + IWC162XMLCh( mbc, toRet ); + } else { + IWC322XMLCh( mbc, toRet ); + } } } // Convert XMLCh into "native unicode" character -void IconvGNUWrapper::xmlChToMbc (XMLCh xch, char *mbc) const +void IconvGNUWrapper::xmlChToMbc (XMLCh xch, char *mbc) const { if (fUBO == LITTLE_ENDIAN) { - if (fUChSize == sizeof(XMLCh)) { - memcpy (mbc, &xch, fUChSize); - return; - } - if (fUChSize == 2) { - XMLCh2WC16( &xch, mbc ); - } else { - XMLCh2WC32( &xch, mbc ); - } + if (fUChSize == sizeof(XMLCh)) { + memcpy (mbc, &xch, fUChSize); + return; + } + if (fUChSize == 2) { + XMLCh2WC16( &xch, mbc ); + } else { + XMLCh2WC32( &xch, mbc ); + } } else { - if (fUChSize == 2) { - IXMLCh2WC16( &xch, mbc ); - } else { - IXMLCh2WC32( &xch, mbc ); - } + if (fUChSize == 2) { + IXMLCh2WC16( &xch, mbc ); + } else { + IXMLCh2WC32( &xch, mbc ); + } } } // Return uppercase equivalent for XMLCh -XMLCh IconvGNUWrapper::toUpper (const XMLCh ch) const +XMLCh IconvGNUWrapper::toUpper (const XMLCh ch) const { if (ch <= 0x7F) - return toupper(ch); + return toupper(ch); - char wcbuf[fUChSize * 2]; + char wcbuf[fUChSize * 2]; xmlChToMbc (ch, wcbuf); - char tmpArr[4]; - char* ptr = wcbuf; - size_t len = fUChSize; - char *pTmpArr = tmpArr; - size_t bLen = 2; + char tmpArr[4]; + char* ptr = wcbuf; + size_t len = fUChSize; + char *pTmpArr = tmpArr; + size_t bLen = 2; ICONV_LOCK; if (::iconv (fCDTo, &ptr, &len, - &pTmpArr, &bLen) == (size_t) -1) - return 0; + &pTmpArr, &bLen) == (size_t) -1) + return 0; tmpArr[1] = toupper (*((unsigned char *)tmpArr)); *tmpArr = tmpArr[1]; len = 1; @@ -303,31 +306,31 @@ bLen = fUChSize; ptr = tmpArr; if (::iconv (fCDFrom, &ptr, &len, - &pTmpArr, &bLen) == (size_t) -1) - return 0; + &pTmpArr, &bLen) == (size_t) -1) + return 0; mbcToXMLCh (wcbuf, (XMLCh*) &ch); return ch; } // Return lowercase equivalent for XMLCh -XMLCh IconvGNUWrapper::toLower (const XMLCh ch) const +XMLCh IconvGNUWrapper::toLower (const XMLCh ch) const { if (ch <= 0x7F) - return tolower(ch); + return tolower(ch); - char wcbuf[fUChSize * 2]; + char wcbuf[fUChSize * 2]; xmlChToMbc (ch, wcbuf); - char tmpArr[4]; - char* ptr = wcbuf; - size_t len = fUChSize; - char *pTmpArr = tmpArr; - size_t bLen = 2; + char tmpArr[4]; + char* ptr = wcbuf; + size_t len = fUChSize; + char *pTmpArr = tmpArr; + size_t bLen = 2; ICONV_LOCK; if (::iconv (fCDTo, &ptr, &len, - &pTmpArr, &bLen) == (size_t) -1) - return 0; + &pTmpArr, &bLen) == (size_t) -1) + return 0; tmpArr[1] = tolower (*((unsigned char*)tmpArr)); *tmpArr = tmpArr[1]; len = 1; @@ -335,131 +338,131 @@ bLen = fUChSize; ptr = tmpArr; if (::iconv (fCDFrom, &ptr, &len, - &pTmpArr, &bLen) == (size_t) -1) - return 0; + &pTmpArr, &bLen) == (size_t) -1) + return 0; mbcToXMLCh (wcbuf, (XMLCh*) &ch); return ch; } // Check if passed characters belongs to the :space: class -bool IconvGNUWrapper::isSpace(const XMLCh toCheck) const +bool IconvGNUWrapper::isSpace(const XMLCh toCheck) const { if (toCheck <= 0x7F) - return isspace(toCheck); + return isspace(toCheck); - char wcbuf[fUChSize * 2]; - char tmpArr[4]; + char wcbuf[fUChSize * 2]; + char tmpArr[4]; xmlChToMbc (toCheck, wcbuf); - char* ptr = wcbuf; - size_t len = fUChSize; - char *pTmpArr = tmpArr; - size_t bLen = 2; + char* ptr = wcbuf; + size_t len = fUChSize; + char *pTmpArr = tmpArr; + size_t bLen = 2; { - ICONV_LOCK; - if (::iconv (fCDTo, &ptr, &len, - &pTmpArr, &bLen) == (size_t) -1) - return 0; + ICONV_LOCK; + if (::iconv (fCDTo, &ptr, &len, + &pTmpArr, &bLen) == (size_t) -1) + return 0; } return isspace(*tmpArr); } // Fill array of XMLCh characters with data, supplyed in the array // of "native unicode" characters. -XMLCh* IconvGNUWrapper::mbsToXML +XMLCh* IconvGNUWrapper::mbsToXML ( - const char* mbs_str - , size_t mbs_cnt - , XMLCh* xml_str - , size_t xml_cnt + const char* mbs_str + , size_t mbs_cnt + , XMLCh* xml_str + , size_t xml_cnt ) const { if (mbs_str == NULL || mbs_cnt == 0 || xml_str == NULL || xml_cnt == 0) - return NULL; - size_t cnt = (mbs_cnt < xml_cnt) ? mbs_cnt : xml_cnt; + return NULL; + size_t cnt = (mbs_cnt < xml_cnt) ? mbs_cnt : xml_cnt; if (fUBO == LITTLE_ENDIAN) { - if (fUChSize == sizeof(XMLCh)) { - // null-transformation - memcpy (xml_str, mbs_str, fUChSize * cnt); - return xml_str; - } - if (fUChSize == 2) - for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize) { - WC162XMLCh( mbs_str, xml_str + i); - } - else - for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize) { - WC322XMLCh( mbs_str, xml_str + i ); - } + if (fUChSize == sizeof(XMLCh)) { + // null-transformation + memcpy (xml_str, mbs_str, fUChSize * cnt); + return xml_str; + } + if (fUChSize == 2) + for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize) { + WC162XMLCh( mbs_str, xml_str + i); + } + else + for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize) { + WC322XMLCh( mbs_str, xml_str + i ); + } } else { - if (fUChSize == 2) - for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize) { - IWC162XMLCh( mbs_str, xml_str + i ); - } - else - for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize) { - IWC322XMLCh( mbs_str, xml_str + i ); - } + if (fUChSize == 2) + for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize) { + IWC162XMLCh( mbs_str, xml_str + i ); + } + else + for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize) { + IWC322XMLCh( mbs_str, xml_str + i ); + } } return xml_str; } // Fill array of "native unicode" characters with data, supplyed // in the array of XMLCh characters. -char* IconvGNUWrapper::xmlToMbs +char* IconvGNUWrapper::xmlToMbs ( - const XMLCh* xml_str - , size_t xml_cnt - , char* mbs_str - , size_t mbs_cnt + const XMLCh* xml_str + , size_t xml_cnt + , char* mbs_str + , size_t mbs_cnt ) const { if (mbs_str == NULL || mbs_cnt == 0 || xml_str == NULL || xml_cnt == 0) - return NULL; - size_t cnt = (mbs_cnt < xml_cnt) ? mbs_cnt : xml_cnt; - char *toReturn = mbs_str; + return NULL; + size_t cnt = (mbs_cnt < xml_cnt) ? mbs_cnt : xml_cnt; + char *toReturn = mbs_str; if (fUBO == LITTLE_ENDIAN) { - if (fUChSize == sizeof(XMLCh)) { - // null-transformation - memcpy (mbs_str, xml_str, fUChSize * cnt); - return toReturn; - } - if (fUChSize == 2) - for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize, xml_str++) { - XMLCh2WC16( xml_str, mbs_str ); - } - else - for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize, xml_str++) { - XMLCh2WC32( xml_str, mbs_str ); - } + if (fUChSize == sizeof(XMLCh)) { + // null-transformation + memcpy (mbs_str, xml_str, fUChSize * cnt); + return toReturn; + } + if (fUChSize == 2) + for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize, xml_str++) { + XMLCh2WC16( xml_str, mbs_str ); + } + else + for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize, xml_str++) { + XMLCh2WC32( xml_str, mbs_str ); + } } else { - if (fUChSize == 2) - for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize, xml_str++) { - IXMLCh2WC16( xml_str, mbs_str ); - } - else - for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize, xml_str++) { - IXMLCh2WC32( xml_str, mbs_str ); - } + if (fUChSize == 2) + for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize, xml_str++) { + IXMLCh2WC16( xml_str, mbs_str ); + } + else + for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize, xml_str++) { + IXMLCh2WC32( xml_str, mbs_str ); + } } return toReturn; } -size_t IconvGNUWrapper::iconvFrom ( const char *fromPtr, - size_t *fromLen, - char **toPtr, - size_t toLen ) const +size_t IconvGNUWrapper::iconvFrom ( const char *fromPtr, + size_t *fromLen, + char **toPtr, + size_t toLen ) const { ICONV_LOCK; char ** tmpPtr = (char**)&fromPtr; return ::iconv (fCDFrom, tmpPtr, fromLen, toPtr, &toLen); } -size_t IconvGNUWrapper::iconvTo ( const char *fromPtr, - size_t *fromLen, - char **toPtr, - size_t toLen ) const +size_t IconvGNUWrapper::iconvTo ( const char *fromPtr, + size_t *fromLen, + char **toPtr, + size_t toLen ) const { ICONV_LOCK; char ** tmpPtr = (char**)&fromPtr; @@ -477,111 +480,111 @@ #if !defined(APP_NO_THREADS) // Create global lock object if (gIconvMutex == NULL) { - gIconvMutex = new XMLMutex; - if (gIconvMutex == NULL) - XMLPlatformUtils::panic (XMLPlatformUtils::Panic_NoTransService); + gIconvMutex = new XMLMutex; + if (gIconvMutex == NULL) + XMLPlatformUtils::panic (XMLPlatformUtils::Panic_NoTransService); } #endif // Try to obtain local (host) characterset through the environment - char* fLocalCP = setlocale (LC_CTYPE, ""); + char* fLocalCP = setlocale (LC_CTYPE, ""); if (fLocalCP == NULL) - fLocalCP = "iso-8859-1"; // fallback locale + fLocalCP = "iso-8859-1"; // fallback locale else { - char *ptr = strchr (fLocalCP, '.'); - if (ptr == NULL) - fLocalCP = "iso-8859-1"; // fallback locale - else - fLocalCP = ptr + 1; + char *ptr = strchr (fLocalCP, '.'); + if (ptr == NULL) + fLocalCP = "iso-8859-1"; // fallback locale + else + fLocalCP = ptr + 1; } // Select the native unicode characters encoding schema - const IconvGNUEncoding *eptr; + const IconvGNUEncoding *eptr; // first - try to use the schema with character size, equil to XMLCh for (eptr = gIconvGNUEncodings; eptr->fSchema; eptr++) { - if (eptr->fUChSize != sizeof(XMLCh)) - continue; - ICONV_LOCK; - // try to create conversion descriptor - iconv_t cd_to = iconv_open(fLocalCP, eptr->fSchema); - if (cd_to == (iconv_t)-1) - continue; - iconv_t cd_from = iconv_open(eptr->fSchema, fLocalCP); - if (cd_to == (iconv_t)-1) { - iconv_close (cd_to); - continue; - } - // got it - setUChSize(eptr->fUChSize); - setUBO(eptr->fUBO); - setCDTo(cd_to); - setCDFrom(cd_from); - fUnicodeCP = eptr->fSchema; - break; + if (eptr->fUChSize != sizeof(XMLCh)) + continue; + ICONV_LOCK; + // try to create conversion descriptor + iconv_t cd_to = iconv_open(fLocalCP, eptr->fSchema); + if (cd_to == (iconv_t)-1) + continue; + iconv_t cd_from = iconv_open(eptr->fSchema, fLocalCP); + if (cd_to == (iconv_t)-1) { + iconv_close (cd_to); + continue; + } + // got it + setUChSize(eptr->fUChSize); + setUBO(eptr->fUBO); + setCDTo(cd_to); + setCDFrom(cd_from); + fUnicodeCP = eptr->fSchema; + break; } if (fUnicodeCP == NULL) - // try to use any known schema - for (eptr = gIconvGNUEncodings; eptr->fSchema; eptr++) { - // try to create conversion descriptor - ICONV_LOCK; - iconv_t cd_to = iconv_open(fLocalCP, eptr->fSchema); - if (cd_to == (iconv_t)-1) - continue; - iconv_t cd_from = iconv_open(eptr->fSchema, fLocalCP); - if (cd_to == (iconv_t)-1) { - iconv_close (cd_to); - continue; - } - // got it - setUChSize(eptr->fUChSize); - setUBO(eptr->fUBO); - setCDTo(cd_to); - setCDFrom(cd_from); - fUnicodeCP = eptr->fSchema; - break; - } + // try to use any known schema + for (eptr = gIconvGNUEncodings; eptr->fSchema; eptr++) { + // try to create conversion descriptor + ICONV_LOCK; + iconv_t cd_to = iconv_open(fLocalCP, eptr->fSchema); + if (cd_to == (iconv_t)-1) + continue; + iconv_t cd_from = iconv_open(eptr->fSchema, fLocalCP); + if (cd_to == (iconv_t)-1) { + iconv_close (cd_to); + continue; + } + // got it + setUChSize(eptr->fUChSize); + setUBO(eptr->fUBO); + setCDTo(cd_to); + setCDFrom(cd_from); + fUnicodeCP = eptr->fSchema; + break; + } if (fUnicodeCP == NULL || cdTo() == (iconv_t)-1 || cdFrom() == (iconv_t)-1) - XMLPlatformUtils::panic (XMLPlatformUtils::Panic_NoTransService); + XMLPlatformUtils::panic (XMLPlatformUtils::Panic_NoTransService); } IconvGNUTransService::~IconvGNUTransService() { if (cdTo() != (iconv_t) -1) { - iconv_close (cdTo()); - setCDTo ((iconv_t)-1); + iconv_close (cdTo()); + setCDTo ((iconv_t)-1); } if (cdFrom() != (iconv_t) -1) { - iconv_close (cdFrom()); - setCDFrom ((iconv_t)-1); + iconv_close (cdFrom()); + setCDFrom ((iconv_t)-1); } } // --------------------------------------------------------------------------- // IconvGNUTransService: The virtual transcoding service API // --------------------------------------------------------------------------- -int IconvGNUTransService::compareIString(const XMLCh* const comp1 - , const XMLCh* const comp2) +int IconvGNUTransService::compareIString(const XMLCh* const comp1 + , const XMLCh* const comp2) { const XMLCh* cptr1 = comp1; const XMLCh* cptr2 = comp2; - XMLCh c1 = toUpper(*cptr1); - XMLCh c2 = toUpper(*cptr2); + XMLCh c1 = toUpper(*cptr1); + XMLCh c2 = toUpper(*cptr2); while ( (*cptr1 != 0) && (*cptr2 != 0) ) { if (c1 != c2) break; - c1 = toUpper(*(++cptr1)); - c2 = toUpper(*(++cptr2)); + c1 = toUpper(*(++cptr1)); + c2 = toUpper(*(++cptr2)); } return (int) ( c1 - c2 ); } -int IconvGNUTransService::compareNIString(const XMLCh* const comp1 - , const XMLCh* const comp2 - , const unsigned int maxChars) +int IconvGNUTransService::compareNIString(const XMLCh* const comp1 + , const XMLCh* const comp2 + , const unsigned int maxChars) { unsigned int n = 0; const XMLCh* cptr1 = comp1; @@ -589,10 +592,10 @@ while (true && maxChars) { - XMLCh c1 = toUpper(*cptr1); - XMLCh c2 = toUpper(*cptr2); + XMLCh c1 = toUpper(*cptr1); + XMLCh c2 = toUpper(*cptr2); - if (c1 != c2) + if (c1 != c2) return (int) (c1 - c2); // If either ended, then both ended, so equal @@ -642,43 +645,43 @@ XMLTranscoder* IconvGNUTransService::makeNewXMLTranscoder ( - const XMLCh* const encodingName - , XMLTransService::Codes& resValue - , const unsigned int blockSize + const XMLCh* const encodingName + , XMLTransService::Codes& resValue + , const unsigned int blockSize ) { resValue = XMLTransService::UnsupportedEncoding; - IconvGNUTranscoder *newTranscoder = NULL; + IconvGNUTranscoder *newTranscoder = NULL; - char *encLocal = XMLString::transcode(encodingName); - iconv_t cd_from, cd_to; + char *encLocal = XMLString::transcode(encodingName); + iconv_t cd_from, cd_to; { - ICONV_LOCK; - cd_from = iconv_open (fUnicodeCP, encLocal); - if (cd_from == (iconv_t)-1) { - resValue = XMLTransService::SupportFilesNotFound; - if (encLocal) - delete [] encLocal; - return NULL; - } - cd_to = iconv_open (encLocal, fUnicodeCP); - if (cd_to == (iconv_t)-1) { - resValue = XMLTransService::SupportFilesNotFound; - iconv_close (cd_from); - if (encLocal) - delete [] encLocal; - return NULL; - } - newTranscoder = new IconvGNUTranscoder (encodingName, - blockSize, - cd_from, cd_to, - uChSize(), UBO()); + ICONV_LOCK; + cd_from = iconv_open (fUnicodeCP, encLocal); + if (cd_from == (iconv_t)-1) { + resValue = XMLTransService::SupportFilesNotFound; + if (encLocal) + delete [] encLocal; + return NULL; + } + cd_to = iconv_open (encLocal, fUnicodeCP); + if (cd_to == (iconv_t)-1) { + resValue = XMLTransService::SupportFilesNotFound; + iconv_close (cd_from); + if (encLocal) + delete [] encLocal; + return NULL; + } + newTranscoder = new IconvGNUTranscoder (encodingName, + blockSize, + cd_from, cd_to, + uChSize(), UBO()); } if (newTranscoder) - resValue = XMLTransService::Ok; + resValue = XMLTransService::Ok; if (encLocal) - delete [] encLocal; + delete [] encLocal; return newTranscoder; } @@ -687,7 +690,7 @@ XMLCh* outPtr = toUpperCase; while (*outPtr) { - *outPtr = toUpper(*outPtr); + *outPtr = toUpper(*outPtr); outPtr++; } } @@ -697,7 +700,7 @@ XMLCh* outPtr = toLowerCase; while (*outPtr) { - *outPtr = toLower(*outPtr); + *outPtr = toLower(*outPtr); outPtr++; } } @@ -716,21 +719,21 @@ if (len == 0) return 0; - char tmpWideArr[gTempBuffArraySize]; - size_t totalLen = 0; + char tmpWideArr[gTempBuffArraySize]; + size_t totalLen = 0; for (;;) { - char *pTmpArr = tmpWideArr; - const char *ptr = srcText + srcLen - len; - size_t rc = iconvFrom(ptr, &len, &pTmpArr, gTempBuffArraySize); - if (rc == (size_t) -1 && errno != E2BIG) { - ThrowXML(TranscodingException, XMLExcepts::Trans_BadSrcSeq); - /* return 0; */ - } - rc = pTmpArr - (char *) tmpWideArr; - totalLen += rc; - if (rc == 0 || len == 0) - break; + char *pTmpArr = tmpWideArr; + const char *ptr = srcText + srcLen - len; + size_t rc = iconvFrom(ptr, &len, &pTmpArr, gTempBuffArraySize); + if (rc == (size_t) -1 && errno != E2BIG) { + ThrowXML(TranscodingException, XMLExcepts::Trans_BadSrcSeq); + /* return 0; */ + } + rc = pTmpArr - (char *) tmpWideArr; + totalLen += rc; + if (rc == 0 || len == 0) + break; } return totalLen / uChSize(); } @@ -745,43 +748,43 @@ if (wLent == 0) return 0; - char tmpWBuff[gTempBuffArraySize]; - char *wBuf = 0; - char *wBufPtr = 0; + char tmpWBuff[gTempBuffArraySize]; + char *wBuf = 0; + char *wBufPtr = 0; size_t len = wLent * uChSize(); if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { - if (len > gTempBuffArraySize) { - wBufPtr = new char[len]; - if (wBufPtr == NULL) - return 0; - wBuf = wBufPtr; - } else - wBuf = tmpWBuff; - xmlToMbs (srcText, wLent, wBuf, wLent); + if (len > gTempBuffArraySize) { + wBufPtr = new char[len]; + if (wBufPtr == NULL) + return 0; + wBuf = wBufPtr; + } else + wBuf = tmpWBuff; + xmlToMbs (srcText, wLent, wBuf, wLent); } else - wBuf = (char *) srcText; + wBuf = (char *) srcText; - char tmpBuff[gTempBuffArraySize]; - size_t totalLen = 0; - char *srcEnd = wBuf + wLent * uChSize(); + char tmpBuff[gTempBuffArraySize]; + size_t totalLen = 0; + char *srcEnd = wBuf + wLent * uChSize(); for (;;) { - char *pTmpArr = tmpBuff; - const char *ptr = srcEnd - len; - size_t rc = iconvTo(ptr, &len, &pTmpArr, gTempBuffArraySize); - if (rc == (size_t) -1 && errno != E2BIG) { - if (wBufPtr) - delete [] wBufPtr; - ThrowXML(TranscodingException, XMLExcepts::Trans_BadSrcSeq); - /* return 0; */ - } - rc = pTmpArr - tmpBuff; - totalLen += rc; - if (rc == 0 || len == 0) - break; + char *pTmpArr = tmpBuff; + const char *ptr = srcEnd - len; + size_t rc = iconvTo(ptr, &len, &pTmpArr, gTempBuffArraySize); + if (rc == (size_t) -1 && errno != E2BIG) { + if (wBufPtr) + delete [] wBufPtr; + ThrowXML(TranscodingException, XMLExcepts::Trans_BadSrcSeq); + /* return 0; */ + } + rc = pTmpArr - tmpBuff; + totalLen += rc; + if (rc == 0 || len == 0) + break; } if (wBufPtr) - delete [] wBufPtr; + delete [] wBufPtr; return totalLen; } @@ -796,57 +799,57 @@ unsigned int wLent = getWideCharLength(toTranscode); // Calc needed size. - const size_t neededLen = calcRequiredSize (toTranscode); + const size_t neededLen = calcRequiredSize (toTranscode); if (neededLen == 0) return 0; - // allocate output buffer + // allocate output buffer retVal = new char[neededLen + 1]; - if (retVal == NULL) + if (retVal == NULL) + return 0; + // prepare the original + char tmpWBuff[gTempBuffArraySize]; + char *wideCharBuf = 0; + char *wBufPtr = 0; + size_t len = wLent * uChSize(); + + if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { + if (len > gTempBuffArraySize) { + wBufPtr = new char[len]; + if (wBufPtr == NULL) + return 0; + wideCharBuf = wBufPtr; + } else + wideCharBuf = tmpWBuff; + xmlToMbs (toTranscode, wLent, wideCharBuf, wLent); + } else + wideCharBuf = (char *) toTranscode; + + // perform conversion + wLent *= uChSize(); + char *ptr = retVal; + size_t rc = iconvTo(wideCharBuf, (size_t *) &wLent, &ptr, neededLen); + if (rc == (size_t)-1) { + if (wBufPtr) + delete [] wBufPtr; return 0; - // prepare the original - char tmpWBuff[gTempBuffArraySize]; - char *wideCharBuf = 0; - char *wBufPtr = 0; - size_t len = wLent * uChSize(); - - if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { - if (len > gTempBuffArraySize) { - wBufPtr = new char[len]; - if (wBufPtr == NULL) - return 0; - wideCharBuf = wBufPtr; - } else - wideCharBuf = tmpWBuff; - xmlToMbs (toTranscode, wLent, wideCharBuf, wLent); - } else - wideCharBuf = (char *) toTranscode; - - // perform conversion - wLent *= uChSize(); - char *ptr = retVal; - size_t rc = iconvTo(wideCharBuf, (size_t *) &wLent, &ptr, neededLen); - if (rc == (size_t)-1) { - if (wBufPtr) - delete [] wBufPtr; - return 0; - } - if (wBufPtr) - delete [] wBufPtr; + } + if (wBufPtr) + delete [] wBufPtr; retVal[neededLen] = 0; } else { retVal = new char[1]; - if (retVal == NULL) - return 0; + if (retVal == NULL) + return 0; retVal[0] = 0; } return retVal; } -bool IconvGNULCPTranscoder::transcode( const XMLCh* const toTranscode - , char* const toFill - , const unsigned int maxBytes) +bool IconvGNULCPTranscoder::transcode( const XMLCh* const toTranscode + , char* const toFill + , const unsigned int maxBytes) { // Watch for a couple of pyscho corner cases if (!toTranscode || !maxBytes) { @@ -863,36 +866,36 @@ wLent = maxBytes; // Fill the "unicode" string - char tmpWBuff[gTempBuffArraySize]; - char *wideCharBuf = 0; - char *wBufPtr = 0; + char tmpWBuff[gTempBuffArraySize]; + char *wideCharBuf = 0; + char *wBufPtr = 0; size_t len = wLent * uChSize(); if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { - if (len > gTempBuffArraySize) { - wBufPtr = new char[len]; - if (wBufPtr == NULL) - return 0; - wideCharBuf = wBufPtr; - } else - wideCharBuf = tmpWBuff; - xmlToMbs (toTranscode, wLent, wideCharBuf, wLent); + if (len > gTempBuffArraySize) { + wBufPtr = new char[len]; + if (wBufPtr == NULL) + return 0; + wideCharBuf = wBufPtr; + } else + wideCharBuf = tmpWBuff; + xmlToMbs (toTranscode, wLent, wideCharBuf, wLent); } else - wideCharBuf = (char *) toTranscode; + wideCharBuf = (char *) toTranscode; // Ok, go ahead and try the transcoding. If it fails, then ... - char *ptr = toFill; - size_t rc = iconvTo(wideCharBuf, &len, &ptr, maxBytes); + char *ptr = toFill; + size_t rc = iconvTo(wideCharBuf, &len, &ptr, maxBytes); if (rc == (size_t)-1) { - if (wBufPtr) - delete [] wBufPtr; - return false; + if (wBufPtr) + delete [] wBufPtr; + return false; } if (wBufPtr) - delete [] wBufPtr; + delete [] wBufPtr; // Cap it off just in case - toFill[wLent] = 0; + toFill[rc] = 0; return true; } @@ -912,52 +915,52 @@ return retVal; } - char tmpWBuff[gTempBuffArraySize]; - char *wideCharBuf = 0; - char *wBufPtr = 0; - size_t len = wLent * uChSize(); - - retVal = new XMLCh[wLent + 1]; - if (retVal == NULL) - return NULL; - if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { - if (len > gTempBuffArraySize) { - wBufPtr = new char[len]; - if (wBufPtr == NULL) - return 0; - wideCharBuf = wBufPtr; - } else - wideCharBuf = tmpWBuff; - } else - wideCharBuf = (char *) retVal; - - size_t flen = strlen(toTranscode); - char *ptr = wideCharBuf; - size_t rc = iconvFrom(toTranscode, &flen, &ptr, len); - if (rc == (size_t) -1) { - if (wBufPtr) - delete [] wBufPtr; - return NULL; - } - if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) - mbsToXML (wideCharBuf, wLent, retVal, wLent); - if (wBufPtr) - delete [] wBufPtr; + char tmpWBuff[gTempBuffArraySize]; + char *wideCharBuf = 0; + char *wBufPtr = 0; + size_t len = wLent * uChSize(); + + retVal = new XMLCh[wLent + 1]; + if (retVal == NULL) + return NULL; + if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { + if (len > gTempBuffArraySize) { + wBufPtr = new char[len]; + if (wBufPtr == NULL) + return 0; + wideCharBuf = wBufPtr; + } else + wideCharBuf = tmpWBuff; + } else + wideCharBuf = (char *) retVal; + + size_t flen = strlen(toTranscode); + char *ptr = wideCharBuf; + size_t rc = iconvFrom(toTranscode, &flen, &ptr, len); + if (rc == (size_t) -1) { + if (wBufPtr) + delete [] wBufPtr; + return NULL; + } + if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) + mbsToXML (wideCharBuf, wLent, retVal, wLent); + if (wBufPtr) + delete [] wBufPtr; retVal[wLent] = 0x00; } else { retVal = new XMLCh[1]; - if (retVal == NULL ) - return 0; + if (retVal == NULL ) + return 0; retVal[0] = 0; } return retVal; } -bool IconvGNULCPTranscoder::transcode(const char* const toTranscode - , XMLCh* const toFill - , const unsigned int maxChars) +bool IconvGNULCPTranscoder::transcode(const char* const toTranscode + , XMLCh* const toFill + , const unsigned int maxChars) { // Check for a couple of psycho corner cases if (!toTranscode || !maxChars) @@ -976,35 +979,35 @@ if (wLent > maxChars) wLent = maxChars; - char tmpWBuff[gTempBuffArraySize]; - char *wideCharBuf = 0; - char *wBufPtr = 0; - size_t len = wLent * uChSize(); + char tmpWBuff[gTempBuffArraySize]; + char *wideCharBuf = 0; + char *wBufPtr = 0; + size_t len = wLent * uChSize(); if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { - if (len > gTempBuffArraySize) { - wBufPtr = new char[len]; - if (wBufPtr == NULL) - return 0; - wideCharBuf = wBufPtr; - } else - wideCharBuf = tmpWBuff; + if (len > gTempBuffArraySize) { + wBufPtr = new char[len]; + if (wBufPtr == NULL) + return 0; + wideCharBuf = wBufPtr; + } else + wideCharBuf = tmpWBuff; } else - wideCharBuf = (char *) toFill; + wideCharBuf = (char *) toFill; - size_t flen = strlen(toTranscode); // wLent; - char *ptr = wideCharBuf; - size_t rc = iconvFrom(toTranscode, &flen, &ptr, len); + size_t flen = strlen(toTranscode); // wLent; + char *ptr = wideCharBuf; + size_t rc = iconvFrom(toTranscode, &flen, &ptr, len); if (rc == (size_t)-1) { - if (wBufPtr) - delete [] wBufPtr; - return false; + if (wBufPtr) + delete [] wBufPtr; + return false; } if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) - mbsToXML (wideCharBuf, wLent, toFill, wLent); + mbsToXML (wideCharBuf, wLent, toFill, wLent); if (wBufPtr) - delete [] wBufPtr; + delete [] wBufPtr; toFill[wLent] = 0x00; return true; @@ -1016,10 +1019,10 @@ // --------------------------------------------------------------------------- -IconvGNULCPTranscoder::IconvGNULCPTranscoder (iconv_t cd_from, - iconv_t cd_to, - size_t uchsize, - unsigned int ubo) +IconvGNULCPTranscoder::IconvGNULCPTranscoder (iconv_t cd_from, + iconv_t cd_to, + size_t uchsize, + unsigned int ubo) : IconvGNUWrapper (cd_from, cd_to, uchsize, ubo) { } @@ -1033,12 +1036,12 @@ // --------------------------------------------------------------------------- // IconvGNUTranscoder: Constructors and Destructor // --------------------------------------------------------------------------- -IconvGNUTranscoder::IconvGNUTranscoder (const XMLCh* const encodingName - , const unsigned int blockSize - , iconv_t cd_from - , iconv_t cd_to - , size_t uchsize - , unsigned int ubo +IconvGNUTranscoder::IconvGNUTranscoder (const XMLCh* const encodingName + , const unsigned int blockSize + , iconv_t cd_from + , iconv_t cd_to + , size_t uchsize + , unsigned int ubo ) : XMLTranscoder(encodingName, blockSize) , IconvGNUWrapper (cd_from, cd_to, uchsize, ubo) @@ -1049,19 +1052,19 @@ { ICONV_LOCK; if (cdTo() != (iconv_t)-1) { - iconv_close (cdTo()); - setCDTo ((iconv_t)-1); + iconv_close (cdTo()); + setCDTo ((iconv_t)-1); } if (cdFrom() != (iconv_t)-1) { - iconv_close (cdFrom()); - setCDFrom ((iconv_t)-1); + iconv_close (cdFrom()); + setCDFrom ((iconv_t)-1); } } // --------------------------------------------------------------------------- // IconvGNUTranscoder: Implementation of the virtual transcoder API // --------------------------------------------------------------------------- -unsigned int IconvGNUTranscoder::transcodeFrom +unsigned int IconvGNUTranscoder::transcodeFrom ( const XMLByte* const srcData , const unsigned int srcCount @@ -1074,92 +1077,92 @@ const char* startSrc = (const char*) srcData; const char* endSrc = (const char*) srcData + srcCount; - char tmpWBuff[gTempBuffArraySize]; - char *startTarget = 0; - char *wBufPtr = 0; - size_t len = maxChars * uChSize(); + char tmpWBuff[gTempBuffArraySize]; + char *startTarget = 0; + char *wBufPtr = 0; + size_t len = maxChars * uChSize(); if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { - if (len > gTempBuffArraySize) { - wBufPtr = new char[len]; - if (wBufPtr == NULL) - return 0; - startTarget = wBufPtr; - } else - startTarget = tmpWBuff; + if (len > gTempBuffArraySize) { + wBufPtr = new char[len]; + if (wBufPtr == NULL) + return 0; + startTarget = wBufPtr; + } else + startTarget = tmpWBuff; } else - startTarget = (char *) toFill; + startTarget = (char *) toFill; // Do character-by-character transcoding - char *orgTarget = startTarget; - size_t srcLen = srcCount; - size_t prevSrcLen = srcLen; + char *orgTarget = startTarget; + size_t srcLen = srcCount; + size_t prevSrcLen = srcLen; unsigned int toReturn = 0; bytesEaten = 0; for (size_t cnt = 0; cnt < maxChars && srcLen; cnt++) { - size_t rc = iconvFrom(startSrc, &srcLen, &orgTarget, uChSize()); - if (rc == (size_t)-1) { - if (errno != E2BIG || prevSrcLen == srcLen) { - if (wBufPtr) - delete [] wBufPtr; - ThrowXML(TranscodingException, XMLExcepts::Trans_BadSrcSeq); - } - } - charSizes[cnt] = prevSrcLen - srcLen; - prevSrcLen = srcLen; - bytesEaten += charSizes[cnt]; - startSrc = endSrc - srcLen; - toReturn++; + size_t rc = iconvFrom(startSrc, &srcLen, &orgTarget, uChSize()); + if (rc == (size_t)-1) { + if (errno != E2BIG || prevSrcLen == srcLen) { + if (wBufPtr) + delete [] wBufPtr; + ThrowXML(TranscodingException, XMLExcepts::Trans_BadSrcSeq); + } + } + charSizes[cnt] = prevSrcLen - srcLen; + prevSrcLen = srcLen; + bytesEaten += charSizes[cnt]; + startSrc = endSrc - srcLen; + toReturn++; } if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) - mbsToXML (startTarget, toReturn, toFill, toReturn); + mbsToXML (startTarget, toReturn, toFill, toReturn); if (wBufPtr) - delete [] wBufPtr; + delete [] wBufPtr; return toReturn; } -unsigned int IconvGNUTranscoder::transcodeTo +unsigned int IconvGNUTranscoder::transcodeTo ( - const XMLCh* const srcData - , const unsigned int srcCount - , XMLByte* const toFill - , const unsigned int maxBytes - , unsigned int& charsEaten - , const UnRepOpts options ) + const XMLCh* const srcData + , const unsigned int srcCount + , XMLByte* const toFill + , const unsigned int maxBytes + , unsigned int& charsEaten + , const UnRepOpts options ) { // Transcode FROM XMLCh - char tmpWBuff[gTempBuffArraySize]; - char *startSrc = tmpWBuff; - char *wBufPtr = 0; - size_t len = srcCount * uChSize(); + char tmpWBuff[gTempBuffArraySize]; + char *startSrc = tmpWBuff; + char *wBufPtr = 0; + size_t len = srcCount * uChSize(); if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { - if (len > gTempBuffArraySize) { - wBufPtr = new char[len]; - if (wBufPtr == NULL) - return 0; - startSrc = wBufPtr; - } else - startSrc = tmpWBuff; - xmlToMbs (srcData, srcCount, startSrc, srcCount); + if (len > gTempBuffArraySize) { + wBufPtr = new char[len]; + if (wBufPtr == NULL) + return 0; + startSrc = wBufPtr; + } else + startSrc = tmpWBuff; + xmlToMbs (srcData, srcCount, startSrc, srcCount); } else - startSrc = (char *) srcData; + startSrc = (char *) srcData; - char* startTarget = (char *) toFill; - size_t srcLen = len; - size_t rc = iconvTo (startSrc, &srcLen, &startTarget, maxBytes); + char* startTarget = (char *) toFill; + size_t srcLen = len; + size_t rc = iconvTo (startSrc, &srcLen, &startTarget, maxBytes); if (rc == (size_t)-1 && errno != E2BIG) { - if (wBufPtr) - delete [] wBufPtr; - ThrowXML(TranscodingException, XMLExcepts::Trans_BadSrcSeq); + if (wBufPtr) + delete [] wBufPtr; + ThrowXML(TranscodingException, XMLExcepts::Trans_BadSrcSeq); } charsEaten = srcCount - srcLen / uChSize(); if (wBufPtr) - delete [] wBufPtr; + delete [] wBufPtr; return startTarget - (char *)toFill; } -bool IconvGNUTranscoder::canTranscodeTo +bool IconvGNUTranscoder::canTranscodeTo ( const unsigned int toCheck ) const @@ -1168,21 +1171,21 @@ // If the passed value is really a surrogate embedded together, then // we need to break it out into its two chars. Else just one. // - char srcBuf[2 * uChSize()]; - unsigned int srcCount = 1; + char srcBuf[2 * uChSize()]; + unsigned int srcCount = 1; if (toCheck & 0xFFFF0000) { - XMLCh ch1 = (toCheck >> 10) + 0xD800; - XMLCh ch2 = toCheck & 0x3FF + 0xDC00; - xmlToMbs(&ch1, 1, srcBuf, 1); - xmlToMbs(&ch2, 1, srcBuf + uChSize(), 1); + XMLCh ch1 = (toCheck >> 10) + 0xD800; + XMLCh ch2 = toCheck & 0x3FF + 0xDC00; + xmlToMbs(&ch1, 1, srcBuf, 1); + xmlToMbs(&ch2, 1, srcBuf + uChSize(), 1); srcCount++; } else - xmlToMbs((const XMLCh*) &toCheck, 1, srcBuf, 1); - size_t len = srcCount * uChSize(); - char tmpBuf[64]; - char* pTmpBuf = tmpBuf; + xmlToMbs((const XMLCh*) &toCheck, 1, srcBuf, 1); + size_t len = srcCount * uChSize(); + char tmpBuf[64]; + char* pTmpBuf = tmpBuf; - size_t rc = iconvTo( srcBuf, &len, &pTmpBuf, 64); + size_t rc = iconvTo( srcBuf, &len, &pTmpBuf, 64); return (rc != (size_t)-1) && (len == 0); }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]