IconvFBSDTransService.cpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:56k
源码类别:

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 2001 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 2001, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Log: IconvFBSDTransService.cpp,v $
  58.  * Revision 1.14  2003/05/17 16:32:17  knoaman
  59.  * Memory manager implementation : transcoder update.
  60.  *
  61.  * Revision 1.13  2003/05/16 21:37:00  knoaman
  62.  * Memory manager implementation: Modify constructors to pass in the memory manager.
  63.  *
  64.  * Revision 1.12  2003/05/15 18:47:04  knoaman
  65.  * Partial implementation of the configurable memory manager.
  66.  *
  67.  * Revision 1.11  2003/03/09 17:02:57  peiyongz
  68.  * PanicHandler
  69.  *
  70.  * Revision 1.10  2003/03/07 15:08:57  tng
  71.  * [Bug 17571] fix building IconvFBSD (namespaces) .  Patch from Bjoern A. Zeeb.
  72.  *
  73.  * Revision 1.9  2003/03/07 14:42:45  tng
  74.  * [Bug 17570] IconvFBSD build on alpha,sparc.  Patch from Bjoern A. Zeeb.
  75.  *
  76.  * Revision 1.8  2003/02/25 08:15:42  gareth
  77.  * Patch to fix compile problem in bug #17358. Patch by Michael Cahill.
  78.  *
  79.  * Revision 1.7  2002/12/31 18:42:43  tng
  80.  * [Bug 15608] IconvLCPTranscoder::transcode() is wrong at wcstombs() usage.
  81.  *
  82.  * Revision 1.6  2002/11/04 15:14:34  tng
  83.  * C++ Namespace Support.
  84.  *
  85.  * Revision 1.5  2002/07/04 18:20:18  tng
  86.  * [Bug 10253] Bugfix for the IconvFBSD transcoder.   Patch from Max Gotlib.
  87.  *
  88.  * Revision 1.4  2002/04/11 15:38:05  knoaman
  89.  * String lower case support for FreeBSD by Max Gotlib
  90.  *
  91.  * Revision 1.3  2002/04/09 15:44:00  knoaman
  92.  * Add lower case string support.
  93.  *
  94.  * Revision 1.2  2002/03/18 13:39:11  tng
  95.  * [Bug 7162 ] IconvFreeBSDTransService.cpp needs an #include statement fixed to use xercesc.
  96.  *
  97.  * Revision 1.1.1.1  2002/02/01 22:22:36  peiyongz
  98.  * sane_include
  99.  *
  100.  * Revision 1.4  2002/01/14 19:45:15  tng
  101.  * Support IconvFBSD in multi-threading environment with all the possible combinations of threading and transcoding options.  By Max Gotlib.
  102.  *
  103.  * Revision 1.3  2001/12/12 14:48:16  tng
  104.  * More bug fixes in IconvFBSD Transcoder.  By Max Gotlib.
  105.  *
  106.  * Revision 1.2  2001/12/11 15:10:14  tng
  107.  * More changes to IconvFBSDTransService.  Allow using "old" TransServece implementation (via '-t native' option to runConfigure) or
  108.  * to employ libiconv (it is a part of FreeBSD ports-collection) services.  By Max Gotlib.
  109.  *
  110.  * Revision 1.1  2001/12/03 14:45:11  tng
  111.  * FreeBSD native transcoder (IconvFBSD) added by Max Gotlib.
  112.  *
  113.  */
  114. // ---------------------------------------------------------------------------
  115. //  Includes
  116. // ---------------------------------------------------------------------------
  117. #include <ctype.h>
  118. #ifdef XML_USE_LIBICONV
  119. # include <locale.h>
  120. # include <iconv.h>
  121. # include <errno.h>
  122. # include <machine/endian.h>
  123. // ---------------------------------------------------------------------------
  124. // Description of encoding schemas, supported by iconv()
  125. // ---------------------------------------------------------------------------
  126. typedef struct __IconvFBSDEncoding {
  127.     const char*    fSchema;    // schema name
  128.     size_t    fUChSize;    // size of the character
  129.     unsigned int fUBO;        // byte order, relative to the host
  130. } IconvFBSDEncoding;
  131. static const IconvFBSDEncoding    gIconvFBSDEncodings[] = {
  132.     { "ucs-2-internal",        2,    LITTLE_ENDIAN },
  133.     { "ucs2-internal",        2,    LITTLE_ENDIAN },
  134.     { "ucs-4-internal",        4,    LITTLE_ENDIAN },
  135.     { "ucs4-internal",        4,    LITTLE_ENDIAN },
  136.     { "UNICODELITTLE",        2,    LITTLE_ENDIAN },
  137.     { "UNICODEBIG",        2,    BIG_ENDIAN },
  138.     { "iso-10646-ucs-2",    4,    BIG_ENDIAN },
  139.     { "iso-10646-ucs-4",    4,    BIG_ENDIAN },
  140.     /* { "iso-10646-utf-16",    2,    BIG_ENDIAN }, */
  141.     { NULL, 0,     0 }
  142. };
  143. //--------------------------------------------------
  144. // Macro-definitions to translate "native unicode"
  145. // characters <-> XMLCh with different host byte order
  146. // and encoding schemas.
  147. # if BYTE_ORDER == LITTLE_ENDIAN
  148. #  define IXMLCh2WC16(x,w)            
  149.     *(w) = ((*(x)) >> 8) & 0xFF;        
  150.     *((w)+1) = (*(x)) & 0xFF
  151. #  define IWC162XMLCh(w,x)    *(x) = ((*(w)) << 8) | (*((w)+1))
  152. #  define XMLCh2WC16(x,w)            
  153.     *(w) = (*(x)) & 0xFF;            
  154.     *((w)+1) = ((*(x)) >> 8) & 0xFF
  155. #  define WC162XMLCh(w,x)    *(x) = ((*((w)+1)) << 8) | (*(w))
  156. #  define IXMLCh2WC32(x,w)            
  157.     *(w) = ((*(x)) >> 24) & 0xFF;        
  158.     *((w)+1) = ((*(x)) >> 16) & 0xFF;    
  159.     *((w)+2) = ((*(x)) >> 8) & 0xFF;    
  160.     *((w)+3) = (*(x)) & 0xFF
  161. #  define IWC322XMLCh(w,x)                
  162.       *(x) = ((*(w)) << 24) | ((*((w)+1)) << 16) |    
  163.           ((*((w)+2)) << 8) | (*((w)+3))
  164. #  define XMLCh2WC32(x,w)            
  165.     *((w)+3) = ((*(x)) >> 24) & 0xFF;    
  166.     *((w)+2) = ((*(x)) >> 16) & 0xFF;    
  167.     *((w)+1) = ((*(x)) >> 8) & 0xFF;    
  168.     *(w) = (*(x)) & 0xFF
  169. #  define WC322XMLCh(w,x)                    
  170.       *(x) = ((*((w)+3)) << 24) | ((*((w)+2)) << 16) |    
  171.         ((*((w)+1)) << 8) | (*(w))
  172. # else /* BYTE_ORDER != LITTLE_ENDIAN */
  173. #  define XMLCh2WC16(x,w)            
  174.     *(w) = ((*(x)) >> 8) & 0xFF;        
  175.     *((w)+1) = (*(x)) & 0xFF
  176. #  define WC162XMLCh(w,x)    *(x) = ((*(w)) << 8) | (*((w)+1))
  177. #  define IXMLCh2WC16(x,w)            
  178.     *(w) = (*(x)) & 0xFF;            
  179.     *((w)+1) = ((*(x)) >> 8) & 0xFF
  180. #  define IWC162XMLCh(w,x)    *(x) = ((*((w)+1)) << 8) | (*(w))
  181. #  define XMLCh2WC32(x,w)            
  182.     *(w) = ((*(x)) >> 24) & 0xFF;        
  183.     *((w)+1) = ((*(x)) >> 16) & 0xFF;    
  184.     *((w)+2) = ((*(x)) >> 8) & 0xFF;    
  185.     *((w)+3) = (*(x)) & 0xFF
  186. #  define WC322XMLCh(w,x)                
  187.       *(x) = ((*(w)) << 24) | ((*((w)+1)) << 16) |    
  188.           ((*((w)+2)) << 8) | (*((w)+3))
  189. #  define IXMLCh2WC32(x,w)            
  190.     *((w)+3) = ((*(x)) >> 24) & 0xFF;    
  191.     *((w)+2) = ((*(x)) >> 16) & 0xFF;    
  192.     *((w)+1) = ((*(x)) >> 8) & 0xFF;    
  193.     *(w) = (*(x)) & 0xFF
  194. #  define IWC322XMLCh(w,x)                    
  195.       *(x) = ((*((w)+3)) << 24) | ((*((w)+2)) << 16) |    
  196.         ((*((w)+1)) << 8) | (*(w))
  197. # endif /* BYTE_ORDER == LITTLE_ENDIAN */
  198. #else /* !XML_USE_LIBICONV */
  199. # if __FreeBSD_cc_version > 430000
  200. #  include <wchar.h>
  201. # else
  202. #  define wint_t XMLCh
  203. # endif
  204. #endif /* XML_USE_LIBICONV */
  205. #include <xercesc/util/XMLString.hpp>
  206. #include <xercesc/util/XMLUniDefs.hpp>
  207. #include <xercesc/util/XMLUni.hpp>
  208. #include <xercesc/util/PlatformUtils.hpp>
  209. #include <xercesc/util/TranscodingException.hpp>
  210. #include "IconvFBSDTransService.hpp"
  211. #include <string.h>
  212. #include <stdlib.h>
  213. #include <stdio.h>
  214. #if !defined(APP_NO_THREADS)
  215. #include <xercesc/util/Mutexes.hpp>
  216. #endif
  217. XERCES_CPP_NAMESPACE_BEGIN
  218. // ---------------------------------------------------------------------------
  219. //  Local, const data
  220. // ---------------------------------------------------------------------------
  221. static const unsigned int    gTempBuffArraySize = 4096;
  222. static const XMLCh          gMyServiceId[] =
  223. {
  224.     chLatin_I, chLatin_C, chLatin_o, chLatin_n, chLatin_v, chNull
  225. };
  226. // ---------------------------------------------------------------------------
  227. //  Local methods
  228. // ---------------------------------------------------------------------------
  229. static unsigned int getWideCharLength(const XMLCh* const src)
  230. {
  231.     if (!src)
  232.         return 0;
  233.     unsigned int len = 0;
  234.     const XMLCh* pTmp = src;
  235.     while (*pTmp++)
  236.         len++;
  237.     return len;
  238. }
  239. #ifndef XML_USE_LIBICONV
  240. // ---------------------------------------------------------------------------
  241. // FreeBSD got the wide-characters support since 4.0 version. But (at least
  242. // up to the 4.4) this support differs from "others" in that the xxstoyys()
  243. // does not handle the NULL-dest argument properly. So the custom functions
  244. // are provided.
  245. // ---------------------------------------------------------------------------
  246. #define __TMP_ARRAY_SIZE__      4
  247. static size_t fbsd_wcstombs(char *dest, const wchar_t *src, size_t n)
  248. {
  249.     char        tarr[ __TMP_ARRAY_SIZE__ + 1 ];
  250.     size_t      len = 0, lent = 0;
  251.     char*       ptr;
  252.     size_t      slen;
  253.     wchar_t*    wptr;
  254.     if (dest)
  255.         return ::wcstombs(dest, src, n);
  256.     if (!src)
  257.         return 0;
  258.     for (wptr = (wchar_t *) src, slen = 0; *wptr; wptr++, slen++);
  259.     if (slen == 0)
  260.         return 0;
  261.     wptr = (wchar_t *) src;
  262.     ptr = dest;
  263.     while ( (len = ::wcstombs(tarr, wptr, __TMP_ARRAY_SIZE__)) > 0 ) {
  264.         wptr += len;
  265.         lent += len;
  266.     }
  267.     if (len == (unsigned) -1)
  268.         return 0;
  269.     return lent;
  270. }
  271. static size_t fbsd_mbstowcs(wchar_t *dest, const char *src, size_t n)
  272. {
  273.     wchar_t     tarr[ __TMP_ARRAY_SIZE__ + 1 ];
  274.     size_t      len = 0, lent = 0;
  275.     char*       ptr;
  276.     if (dest)
  277.         return ::mbstowcs(dest, src, n);
  278.     ptr = (char*) src;
  279.     if (!src || strlen(src) == 0)
  280.         return 0;
  281.     while ( (len = ::mbstowcs(tarr, ptr, __TMP_ARRAY_SIZE__)) > 0 ) {
  282.         ptr += len;
  283.         lent += len;
  284.     }
  285.     if (len == (unsigned) -1)
  286.         return 0;
  287.     return lent;
  288. }
  289. static wint_t fbsd_towupper(wint_t ch)
  290. {
  291.     if (ch <= 0x7F)
  292.     return toupper(ch);
  293.     unsigned char    buf[16];
  294.     wchar_t    wc = wchar_t(ch);
  295.     wcstombs((char*)buf, &wc, 16);
  296.     return toupper(*buf);
  297. }
  298. static wint_t fbsd_towlower(wint_t ch)
  299. {
  300.     if (ch <= 0x7F)
  301.     return tolower(ch);
  302.     unsigned char    buf[16];
  303.     wchar_t    wc = wchar_t(ch);
  304.     wcstombs((char *)buf, &wc, 16);
  305.     return tolower(*buf);
  306. }
  307. #else /* XML_USE_LIBICONV */
  308. #if !defined(APP_NO_THREADS)
  309. // Iconv() access syncronization point
  310. static XMLMutex    *gIconvMutex = NULL;
  311. #  define ICONV_LOCK    XMLMutexLock lockConverter(gIconvMutex);
  312. #else /* APP_NO_THREADS */
  313. # define ICONV_LOCK
  314. #endif /* !APP_NO_THREADS */
  315. //----------------------------------------------------------------------------
  316. // There is implementation of the libiconv for FreeBSD (available through the
  317. // ports collection). The following is a wrapper around the iconv().
  318. //----------------------------------------------------------------------------
  319. IconvFBSDCD::IconvFBSDCD ()
  320.     : fUChSize(0), fUBO(LITTLE_ENDIAN),
  321.       fCDTo((iconv_t)-1), fCDFrom((iconv_t)-1)
  322. {
  323. }
  324. IconvFBSDCD::IconvFBSDCD ( iconv_t    cd_from,
  325.                iconv_t    cd_to,
  326.                size_t    uchsize,
  327.                unsigned int    ubo )
  328.     : fUChSize(uchsize), fUBO(ubo),
  329.       fCDTo(cd_to), fCDFrom(cd_from)
  330. {
  331.     if (fCDFrom == (iconv_t) -1 || fCDTo == (iconv_t) -1) {
  332.     XMLPlatformUtils::panic (PanicHandler::Panic_NoTransService);
  333.     }
  334. }
  335. IconvFBSDCD::~IconvFBSDCD()
  336. {
  337. }
  338. // Convert "native unicode" character into XMLCh
  339. void    IconvFBSDCD::mbcToXMLCh (const char *mbc, XMLCh *toRet) const
  340. {
  341.     if (fUBO == LITTLE_ENDIAN) {
  342.         if (fUChSize == sizeof(XMLCh))
  343.             *toRet = *((XMLCh*) mbc);
  344.         else if (fUChSize == 2) {
  345.             WC162XMLCh( mbc, toRet );
  346.         } else {
  347.             WC322XMLCh( mbc, toRet );
  348.         }
  349.     } else {
  350.         if (fUChSize == 2) {
  351.             IWC162XMLCh( mbc, toRet );
  352.         } else {
  353.             IWC322XMLCh( mbc, toRet );
  354.         }
  355.     }
  356. }
  357. // Convert XMLCh into "native unicode" character
  358. void    IconvFBSDCD::xmlChToMbc (XMLCh xch, char *mbc) const
  359. {
  360.     if (fUBO == LITTLE_ENDIAN) {
  361.         if (fUChSize == sizeof(XMLCh)) {
  362.             memcpy (mbc, &xch, fUChSize);
  363.             return;
  364.         }
  365.         if (fUChSize == 2) {
  366.             XMLCh2WC16( &xch, mbc );
  367.         } else {
  368.             XMLCh2WC32( &xch, mbc );
  369.         }
  370.     } else {
  371.         if (fUChSize == 2) {
  372.             IXMLCh2WC16( &xch, mbc );
  373.         } else {
  374.             IXMLCh2WC32( &xch, mbc );
  375.         }
  376.     }
  377. }
  378. // Return uppercase equivalent for XMLCh
  379. XMLCh    IconvFBSDCD::toUpper (const XMLCh ch) const
  380. {
  381.     if (ch <= 0x7F)
  382.         return toupper(ch);
  383.     char    wcbuf[fUChSize * 2];
  384.     xmlChToMbc (ch, wcbuf);
  385.     char    tmpArr[4];
  386.     char*    ptr = wcbuf;
  387.     size_t    len = fUChSize;
  388.     char    *pTmpArr = tmpArr;
  389.     size_t    bLen = 2;
  390.     ICONV_LOCK;
  391.     if (::iconv (fCDTo, (const char**) &ptr, &len,
  392.          &pTmpArr, &bLen) == (size_t) -1)
  393.     return 0;
  394.     tmpArr[1] = toupper (*((unsigned char *)tmpArr));
  395.     *tmpArr = tmpArr[1];
  396.     len = 1;
  397.     pTmpArr = wcbuf;
  398.     bLen = fUChSize;
  399.     ptr = tmpArr;
  400.     if (::iconv (fCDFrom, (const char **)&ptr, &len,
  401.          &pTmpArr, &bLen) == (size_t) -1)
  402.     return 0;
  403.     mbcToXMLCh (wcbuf, (XMLCh*) &ch);
  404.     return ch;
  405. }
  406. // Return lowercase equivalent for XMLCh
  407. XMLCh    IconvFBSDCD::toLower (const XMLCh ch) const
  408. {
  409.     if (ch <= 0x7F)
  410.         return tolower(ch);
  411.     char    wcbuf[fUChSize * 2];
  412.     xmlChToMbc (ch, wcbuf);
  413.     char    tmpArr[4];
  414.     char*    ptr = wcbuf;
  415.     size_t    len = fUChSize;
  416.     char    *pTmpArr = tmpArr;
  417.     size_t    bLen = 2;
  418.     ICONV_LOCK;
  419.     if (::iconv (fCDTo, (const char**) &ptr, &len,
  420.          &pTmpArr, &bLen) == (size_t) -1)
  421.     return 0;
  422.     tmpArr[1] = tolower (*((unsigned char*)tmpArr));
  423.     *tmpArr = tmpArr[1];
  424.     len = 1;
  425.     pTmpArr = wcbuf;
  426.     bLen = fUChSize;
  427.     ptr = tmpArr;
  428.     if (::iconv (fCDFrom, (const char **)&ptr, &len,
  429.          &pTmpArr, &bLen) == (size_t) -1)
  430.     return 0;
  431.     mbcToXMLCh (wcbuf, (XMLCh*) &ch);
  432.     return ch;
  433. }
  434. // Check if passed characters belongs to the :space: class
  435. bool    IconvFBSDCD::isSpace(const XMLCh toCheck) const
  436. {
  437.     if (toCheck <= 0x7F)
  438.         return isspace(toCheck);
  439.     char    wcbuf[fUChSize * 2];
  440.     char    tmpArr[4];
  441.     xmlChToMbc (toCheck, wcbuf);
  442.     char*    ptr = wcbuf;
  443.     size_t    len = fUChSize;
  444.     char    *pTmpArr = tmpArr;
  445.     size_t    bLen = 2;
  446.     {
  447.         ICONV_LOCK;
  448.         if (::iconv (fCDTo, (const char**) &ptr, &len,
  449.                  &pTmpArr, &bLen) == (size_t) -1)
  450.             return 0;
  451.     }
  452.     return isspace(*tmpArr);
  453. }
  454. // Fill array of XMLCh characters with data, supplyed in the array
  455. // of "native unicode" characters.
  456. XMLCh*    IconvFBSDCD::mbsToXML
  457. (
  458.     const char*        mbs_str
  459.     ,       size_t    mbs_cnt
  460.     ,       XMLCh*    xml_str
  461.     ,       size_t    xml_cnt
  462. ) const
  463. {
  464.     if (mbs_str == NULL || mbs_cnt == 0 || xml_str == NULL || xml_cnt == 0)
  465.         return NULL;
  466.     size_t    cnt = (mbs_cnt < xml_cnt) ? mbs_cnt : xml_cnt;
  467.     if (fUBO == LITTLE_ENDIAN) {
  468.     if (fUChSize == sizeof(XMLCh)) {
  469.         // null-transformation
  470.         memcpy (xml_str, mbs_str, fUChSize * cnt);
  471.         return xml_str;
  472.     }
  473.     if (fUChSize == 2)
  474.         for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize) {
  475.             WC162XMLCh( mbs_str, xml_str + i);
  476.         }
  477.     else
  478.         for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize) {
  479.             WC322XMLCh( mbs_str, xml_str + i );
  480.         }
  481.     } else {
  482.         if (fUChSize == 2)
  483.             for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize) {
  484.                 IWC162XMLCh( mbs_str, xml_str + i );
  485.             }
  486.         else
  487.             for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize) {
  488.                 IWC322XMLCh( mbs_str, xml_str + i );
  489.             }
  490.     }
  491.     return xml_str;
  492. }
  493. // Fill array of "native unicode" characters with data, supplyed
  494. // in the array of XMLCh characters.
  495. char*    IconvFBSDCD::xmlToMbs
  496. (
  497.     const XMLCh*    xml_str
  498.     ,      size_t    xml_cnt
  499.     ,      char*        mbs_str
  500.     ,      size_t    mbs_cnt
  501. ) const
  502. {
  503.     if (mbs_str == NULL || mbs_cnt == 0 || xml_str == NULL || xml_cnt == 0)
  504.         return NULL;
  505.     size_t    cnt = (mbs_cnt < xml_cnt) ? mbs_cnt : xml_cnt;
  506.     char    *toReturn = mbs_str;
  507.     if (fUBO == LITTLE_ENDIAN) {
  508.         if (fUChSize == sizeof(XMLCh)) {
  509.             // null-transformation
  510.             memcpy (mbs_str, xml_str, fUChSize * cnt);
  511.             return toReturn;
  512.         }
  513.         if (fUChSize == 2)
  514.             for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize, xml_str++) {
  515.                 XMLCh2WC16( xml_str, mbs_str );
  516.             }
  517.         else
  518.             for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize, xml_str++) {
  519.                 XMLCh2WC32( xml_str, mbs_str );
  520.             }
  521.     } else {
  522.         if (fUChSize == 2)
  523.             for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize, xml_str++) {
  524.                 IXMLCh2WC16( xml_str, mbs_str );
  525.             }
  526.         else
  527.             for (size_t i = 0; i < cnt; i++, mbs_str += fUChSize, xml_str++) {
  528.                 IXMLCh2WC32( xml_str, mbs_str );
  529.             }
  530.     }
  531.     return toReturn;
  532. }
  533. size_t    IconvFBSDCD::iconvFrom ( const char    *fromPtr,
  534.                  size_t        *fromLen,
  535.                  char        **toPtr,
  536.                  size_t        toLen ) const
  537. {
  538.     ICONV_LOCK;
  539.     return ::iconv (fCDFrom, &fromPtr, fromLen, toPtr, &toLen);
  540. }
  541. size_t    IconvFBSDCD::iconvTo ( const char    *fromPtr,
  542.                    size_t        *fromLen,
  543.                    char        **toPtr,
  544.                    size_t        toLen ) const
  545. {
  546.     ICONV_LOCK;
  547.     return ::iconv (fCDTo, &fromPtr, fromLen, toPtr, &toLen);
  548. }
  549. #endif /* !XML_USE_LIBICONV */
  550. // ---------------------------------------------------------------------------
  551. //  IconvFBSDTransService: Constructors and Destructor
  552. // ---------------------------------------------------------------------------
  553. IconvFBSDTransService::IconvFBSDTransService()
  554. #ifndef XML_USE_LIBICONV
  555. {}
  556. #else  /* XML_USE_LIBICONV */
  557.     : IconvFBSDCD(), fUnicodeCP(0)
  558. {
  559. #if !defined(APP_NO_THREADS)
  560.     // Create global lock object
  561.     if (gIconvMutex == NULL) {
  562.         gIconvMutex = new XMLMutex;
  563.         if (gIconvMutex == NULL)
  564.             XMLPlatformUtils::panic (PanicHandler::Panic_NoTransService);
  565.     }
  566. #endif
  567.     // Try to obtain local (host) characterset through the environment
  568.     char*    fLocalCP = setlocale (LC_CTYPE, "");
  569.     if (fLocalCP == NULL)
  570.         fLocalCP = "iso-8859-1";    // fallback locale
  571.     else {
  572.         char    *ptr = strchr (fLocalCP, '.');
  573.         if (ptr == NULL)
  574.             fLocalCP = "iso-8859-1";    // fallback locale
  575.         else
  576.             fLocalCP = ptr + 1;
  577.     }
  578.     // Select the native unicode characters encoding schema
  579.     const IconvFBSDEncoding    *eptr;
  580.     // first - try to use the schema with character size, equil to XMLCh
  581.     for (eptr = gIconvFBSDEncodings; eptr->fSchema; eptr++) {
  582.         if (eptr->fUChSize != sizeof(XMLCh))
  583.             continue;
  584.         ICONV_LOCK;
  585.         // try to create conversion descriptor
  586.         iconv_t    cd_to = iconv_open(fLocalCP, eptr->fSchema);
  587.         if (cd_to == (iconv_t)-1)
  588.             continue;
  589.         iconv_t    cd_from = iconv_open(eptr->fSchema, fLocalCP);
  590.         if (cd_to == (iconv_t)-1) {
  591.             iconv_close (cd_to);
  592.             continue;
  593.         }
  594.         // got it
  595.         setUChSize(eptr->fUChSize);
  596.         setUBO(eptr->fUBO);
  597.         setCDTo(cd_to);
  598.         setCDFrom(cd_from);
  599.         fUnicodeCP = eptr->fSchema;
  600.         break;
  601.     }
  602.     if (fUnicodeCP == NULL)
  603.         // try to use any known schema
  604.         for (eptr = gIconvFBSDEncodings; eptr->fSchema; eptr++) {
  605.             // try to create conversion descriptor
  606.             ICONV_LOCK;
  607.             iconv_t    cd_to = iconv_open(fLocalCP, eptr->fSchema);
  608.             if (cd_to == (iconv_t)-1)
  609.             continue;
  610.             iconv_t    cd_from = iconv_open(eptr->fSchema, fLocalCP);
  611.             if (cd_to == (iconv_t)-1) {
  612.             iconv_close (cd_to);
  613.             continue;
  614.         }
  615.         // got it
  616.         setUChSize(eptr->fUChSize);
  617.         setUBO(eptr->fUBO);
  618.         setCDTo(cd_to);
  619.         setCDFrom(cd_from);
  620.         fUnicodeCP = eptr->fSchema;
  621.         break;
  622.     }
  623.     if (fUnicodeCP == NULL || cdTo() == (iconv_t)-1 || cdFrom() == (iconv_t)-1)
  624.     XMLPlatformUtils::panic (PanicHandler::Panic_NoTransService);
  625. }
  626. #endif /* XML_USE_LIBICONV */
  627. IconvFBSDTransService::~IconvFBSDTransService()
  628. {
  629. #ifdef XML_USE_LIBICONV
  630.     if (cdTo() != (iconv_t) -1) {
  631.         iconv_close (cdTo());
  632.         setCDTo ((iconv_t)-1);
  633.     }
  634.     if (cdFrom() != (iconv_t) -1) {
  635.         iconv_close (cdFrom());
  636.         setCDFrom ((iconv_t)-1);
  637.     }
  638. #endif /* XML_USE_LIBICONV */
  639. }
  640. // ---------------------------------------------------------------------------
  641. //  IconvFBSDTransService: The virtual transcoding service API
  642. // ---------------------------------------------------------------------------
  643. int IconvFBSDTransService::compareIString(const XMLCh* const    comp1
  644.                                         , const XMLCh* const    comp2)
  645. {
  646.     const XMLCh* cptr1 = comp1;
  647.     const XMLCh* cptr2 = comp2;
  648. #ifndef XML_USE_LIBICONV
  649.     while ( (*cptr1 != 0) && (*cptr2 != 0) ) {
  650.         wint_t wch1 = fbsd_towupper(*cptr1);
  651.         wint_t wch2 = fbsd_towupper(*cptr2);
  652.         if (wch1 != wch2)
  653.             break;
  654.         cptr1++;
  655.         cptr2++;
  656.     }
  657.     return (int) ( fbsd_towupper(*cptr1) - fbsd_towupper(*cptr2) );
  658. #else /* XML_USE_LIBICONV */
  659.     XMLCh    c1 = toUpper(*cptr1);
  660.     XMLCh    c2 = toUpper(*cptr2);
  661.     while ( (*cptr1 != 0) && (*cptr2 != 0) ) {
  662.         if (c1 != c2)
  663.             break;
  664.         c1 = toUpper(*(++cptr1));
  665.         c2 = toUpper(*(++cptr2));
  666.     }
  667.     return (int) ( c1 - c2 );
  668. #endif /* !XML_USE_LIBICONV */
  669. }
  670. int IconvFBSDTransService::compareNIString(const XMLCh* const    comp1
  671.                                          , const XMLCh* const    comp2
  672.                                          , const unsigned int    maxChars)
  673. {
  674.     unsigned int  n = 0;
  675.     const XMLCh* cptr1 = comp1;
  676.     const XMLCh* cptr2 = comp2;
  677. #ifndef XML_USE_LIBICONV
  678.     while (true && maxChars)
  679.     {
  680.         wint_t wch1 = fbsd_towupper(*cptr1);
  681.         wint_t wch2 = fbsd_towupper(*cptr2);
  682.         if (wch1 != wch2)
  683.             return (int) (wch1 - wch2);
  684.         // If either ended, then both ended, so equal
  685.         if (!*cptr1 || !*cptr2)
  686.             break;
  687.         cptr1++;
  688.         cptr2++;
  689.         //  Bump the count of chars done. If it equals the count then we
  690.         //  are equal for the requested count, so break out and return
  691.         //  equal.
  692.         n++;
  693.         if (n == maxChars)
  694.             break;
  695.     }
  696. #else /* XML_USE_LIBICONV */
  697.     while (true && maxChars)
  698.     {
  699.         XMLCh    c1 = toUpper(*cptr1);
  700.         XMLCh    c2 = toUpper(*cptr2);
  701.         if (c1 != c2)
  702.             return (int) (c1 - c2);
  703.         // If either ended, then both ended, so equal
  704.         if (!*cptr1 || !*cptr2)
  705.             break;
  706.         cptr1++;
  707.         cptr2++;
  708.         //  Bump the count of chars done. If it equals the count then we
  709.         //  are equal for the requested count, so break out and return
  710.         //  equal.
  711.         n++;
  712.         if (n == maxChars)
  713.             break;
  714.     }
  715. #endif /* !XML_USE_LIBICONV */
  716.     return 0;
  717. }
  718. const XMLCh* IconvFBSDTransService::getId() const
  719. {
  720.     return gMyServiceId;
  721. }
  722. bool IconvFBSDTransService::isSpace(const XMLCh toCheck) const
  723. {
  724. #ifndef XML_USE_LIBICONV
  725.     if (toCheck <= 0x7F)
  726.         return isspace(toCheck);
  727.     char buf[16];
  728.     wchar_t    wc = wchar_t(toCheck);
  729.     wcstombs( buf, &wc, 16 );
  730.     return (isspace(*buf) != 0);
  731. #else /* XML_USE_LIBICONV */
  732.     return IconvFBSDCD::isSpace(toCheck);
  733. #endif /* !XML_USE_LIBICONV */
  734. }
  735. XMLLCPTranscoder* IconvFBSDTransService::makeNewLCPTranscoder()
  736. {
  737.     // Just allocate a new transcoder of our type
  738. #ifndef XML_USE_LIBICONV
  739.     return new IconvFBSDLCPTranscoder;
  740. #else /* XML_USE_LIBICONV */
  741.     return new IconvFBSDLCPTranscoder (cdFrom(), cdTo(), uChSize(), UBO());
  742. #endif /* !XML_USE_LIBICONV */
  743. }
  744. bool IconvFBSDTransService::supportsSrcOfs() const
  745. {
  746.     return true;
  747. }
  748. // ---------------------------------------------------------------------------
  749. //  IconvFBSDTransService: The protected virtual transcoding service API
  750. // ---------------------------------------------------------------------------
  751. XMLTranscoder*
  752. IconvFBSDTransService::makeNewXMLTranscoder
  753. (
  754.     const    XMLCh* const    encodingName
  755.     ,    XMLTransService::Codes&    resValue
  756.     , const     unsigned int    blockSize
  757.     ,       MemoryManager* const    manager
  758. )
  759. {
  760. #ifndef XML_USE_LIBICONV
  761.     //
  762.     //  NOTE: We don't use the block size here
  763.     //
  764.     //  This is a minimalist transcoding service, that only supports a local
  765.     //  default transcoder. All named encodings return zero as a failure,
  766.     //  which means that only the intrinsic encodings supported by the parser
  767.     //  itself will work for XML data.
  768.     //
  769.     resValue = XMLTransService::UnsupportedEncoding;
  770.     return 0;
  771. #else /* XML_USE_LIBICONV */
  772.     resValue = XMLTransService::UnsupportedEncoding;
  773.     IconvFBSDTranscoder    *newTranscoder = NULL;
  774.     char    *encLocal = XMLString::transcode(encodingName, manager);
  775.     iconv_t    cd_from, cd_to;
  776.     {
  777.         ICONV_LOCK;
  778.         cd_from = iconv_open (fUnicodeCP, encLocal);
  779.         if (cd_from == (iconv_t)-1) {
  780.             resValue = XMLTransService::SupportFilesNotFound;
  781.             if (encLocal)
  782.             manager->deallocate(encLocal);//delete [] encLocal;
  783.             return NULL;
  784.         }
  785.         cd_to = iconv_open (encLocal, fUnicodeCP);
  786.         if (cd_to == (iconv_t)-1) {
  787.             resValue = XMLTransService::SupportFilesNotFound;
  788.             iconv_close (cd_from);
  789.             if (encLocal)
  790.             manager->deallocate(encLocal);//delete [] encLocal;
  791.             return NULL;
  792.         }
  793.         newTranscoder = new (manager) IconvFBSDTranscoder (encodingName,
  794.                              blockSize,
  795.                              cd_from, cd_to,
  796.                              uChSize(), UBO(),
  797.                              manager);
  798.     }
  799.     if (newTranscoder)
  800.         resValue = XMLTransService::Ok;
  801.     if (encLocal)
  802.         manager->deallocate(encLocal);//delete [] encLocal;
  803.     return newTranscoder;
  804. #endif /* !XML_USE_LIBICONV */
  805. }
  806. void IconvFBSDTransService::upperCase(XMLCh* const toUpperCase) const
  807. {
  808.     XMLCh* outPtr = toUpperCase;
  809.     while (*outPtr)
  810.     {
  811. #ifndef XML_USE_LIBICONV
  812.         *outPtr = fbsd_towupper(*outPtr);
  813. #else /* XML_USE_LIBICONV */
  814.         *outPtr = toUpper(*outPtr);
  815. #endif /* !XML_USE_LIBICONV */
  816.         outPtr++;
  817.     }
  818. }
  819. void IconvFBSDTransService::lowerCase(XMLCh* const toLowerCase) const
  820. {
  821.     XMLCh* outPtr = toLowerCase;
  822.     while (*outPtr)
  823.     {
  824. #ifndef XML_USE_LIBICONV
  825.         *outPtr = fbsd_towlower(*outPtr);
  826. #else /* XML_USE_LIBICONV */
  827.         *outPtr = toLower(*outPtr);
  828. #endif /* !XML_USE_LIBICONV */
  829.         outPtr++;
  830.     }
  831. }
  832. // ---------------------------------------------------------------------------
  833. //  IconvFBSDLCPTranscoder: The virtual transcoder API
  834. // ---------------------------------------------------------------------------
  835. unsigned int
  836. IconvFBSDLCPTranscoder::calcRequiredSize (const char* const srcText)
  837. {
  838.     if (!srcText)
  839.         return 0;
  840. #ifndef XML_USE_LIBICONV
  841.     unsigned int retVal = fbsd_mbstowcs(NULL, srcText, 0);
  842.     if (retVal == ~0)
  843.         return 0;
  844.     return retVal;
  845. #else /* XML_USE_LIBICONV */
  846.     size_t      len, srcLen;
  847.     len = srcLen = strlen(srcText);
  848.     if (len == 0)
  849.         return 0;
  850.     char    tmpWideArr[gTempBuffArraySize];
  851.     size_t    totalLen = 0;
  852.     for (;;) {
  853.         char        *pTmpArr = tmpWideArr;
  854.         const char    *ptr = srcText + srcLen - len;
  855.         size_t    rc = iconvFrom(ptr, &len, &pTmpArr, gTempBuffArraySize);
  856.         if (rc == (size_t) -1 && errno != E2BIG) {
  857.             ThrowXML(TranscodingException, XMLExcepts::Trans_BadSrcSeq);
  858.             /* return 0; */
  859.         }
  860.         rc = pTmpArr - (char *) tmpWideArr;
  861.         totalLen += rc;
  862.         if (rc == 0 || len == 0)
  863.             break;
  864.     }
  865.     return totalLen / uChSize();
  866. #endif /* XML_USE_LIBICONV */
  867. }
  868. unsigned int
  869. IconvFBSDLCPTranscoder::calcRequiredSize(const XMLCh* const srcText)
  870. {
  871.     if (!srcText)
  872.         return 0;
  873.     unsigned int  wLent = getWideCharLength(srcText);
  874.     if (wLent == 0)
  875.         return 0;
  876. #ifndef XML_USE_LIBICONV
  877.     wchar_t       tmpWideCharArr[gTempBuffArraySize];
  878.     wchar_t*      allocatedArray = 0;
  879.     wchar_t*      wideCharBuf = 0;
  880.     if (wLent >= gTempBuffArraySize)
  881.         wideCharBuf = allocatedArray = (wchar_t*) XMLPlatformUtils::fgMemoryManager->allocate
  882.         (
  883.             (wLent + 1) * sizeof(wchar_t)
  884.         );//new wchar_t[wLent + 1];
  885.     else
  886.         wideCharBuf = tmpWideCharArr;
  887.     for (unsigned int i = 0; i < wLent; i++)
  888.         wideCharBuf[i] = srcText[i];
  889.     wideCharBuf[wLent] = 0x00;
  890.     const unsigned int retVal = fbsd_wcstombs(NULL, wideCharBuf, 0);
  891.     if (allocatedArray)
  892.         XMLPlatformUtils::fgMemoryManager->deallocate(allocatedArray);//delete [] allocatedArray;
  893.     if (retVal == ~0)
  894.         return 0;
  895.     return retVal;
  896. #else /* XML_USE_LIBICONV */
  897.     char    tmpWBuff[gTempBuffArraySize];
  898.     char    *wBuf = 0;
  899.     char    *wBufPtr = 0;
  900.     size_t      len = wLent * uChSize();
  901.     if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) {
  902.         if (len > gTempBuffArraySize) {
  903.             wBufPtr = (char*) XMLPlatformUtils::fgMemoryManager->allocate
  904.             (
  905.                 len * sizeof(char)
  906.             );//new char[len];
  907.             if (wBufPtr == NULL)
  908.             return 0;
  909.             wBuf = wBufPtr;
  910.         } else
  911.             wBuf = tmpWBuff;
  912.         xmlToMbs (srcText, wLent, wBuf, wLent);
  913.     } else
  914.     wBuf = (char *) srcText;
  915.     char    tmpBuff[gTempBuffArraySize];
  916.     size_t    totalLen = 0;
  917.     char    *srcEnd = wBuf + wLent * uChSize();
  918.     for (;;) {
  919.         char        *pTmpArr = tmpBuff;
  920.         const char    *ptr = srcEnd - len;
  921.         size_t    rc = iconvTo(ptr, &len, &pTmpArr, gTempBuffArraySize);
  922.         if (rc == (size_t) -1 && errno != E2BIG) {
  923.             if (wBufPtr)
  924.             XMLPlatformUtils::fgMemoryManager->deallocate(wBufPtr);//delete [] wBufPtr;
  925.             ThrowXML(TranscodingException, XMLExcepts::Trans_BadSrcSeq);
  926.             /* return 0; */
  927.         }
  928.         rc = pTmpArr - tmpBuff;
  929.         totalLen += rc;
  930.         if (rc == 0 || len == 0)
  931.             break;
  932.     }
  933.     if (wBufPtr)
  934.     XMLPlatformUtils::fgMemoryManager->deallocate(wBufPtr);//delete [] wBufPtr;
  935.     return totalLen;
  936. #endif /* !XML_USE_LIBICONV */
  937. }
  938. char* IconvFBSDLCPTranscoder::transcode(const XMLCh* const toTranscode)
  939. {
  940.     if (!toTranscode)
  941.         return 0;
  942.     char* retVal = 0;
  943.     if (*toTranscode) {
  944.         unsigned int  wLent = getWideCharLength(toTranscode);
  945. #ifndef XML_USE_LIBICONV
  946.         wchar_t       tmpWideCharArr[gTempBuffArraySize];
  947.         wchar_t*      allocatedArray = 0;
  948.         wchar_t*      wideCharBuf = 0;
  949.         if (wLent >= gTempBuffArraySize)
  950.             wideCharBuf = allocatedArray = new wchar_t[wLent + 1];
  951.         else
  952.             wideCharBuf = tmpWideCharArr;
  953.         for (unsigned int i = 0; i < wLent; i++)
  954.             wideCharBuf[i] = toTranscode[i];
  955.         wideCharBuf[wLent] = 0x00;
  956.         // Calc the needed size.
  957.         const size_t neededLen = fbsd_wcstombs(NULL, wideCharBuf, 0);
  958.         if (neededLen == -1) {
  959.             if (allocatedArray)
  960.                 delete [] allocatedArray;
  961.             return 0;
  962.         }
  963.         retVal = new char[neededLen + 1];
  964.         fbsd_wcstombs(retVal, wideCharBuf, neededLen);
  965.         if (allocatedArray)
  966.             delete [] allocatedArray;
  967.         retVal[neededLen] = 0;
  968. #else /* XML_USE_LIBICONV */
  969.         // Calc needed size.
  970.         const size_t neededLen = calcRequiredSize (toTranscode);
  971.         if (neededLen == 0)
  972.             return 0;
  973.         // allocate output buffer
  974.         retVal = new char[neededLen + 1];
  975.         if (retVal == NULL)
  976.             return 0;
  977.         // prepare the original
  978.         char    tmpWBuff[gTempBuffArraySize];
  979.         char    *wideCharBuf = 0;
  980.         char    *wBufPtr = 0;
  981.         size_t  len = wLent * uChSize();
  982.         if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) {
  983.             if (len > gTempBuffArraySize) {
  984.             wBufPtr = new char[len];
  985.             if (wBufPtr == NULL)
  986.                 return 0;
  987.             wideCharBuf = wBufPtr;
  988.             } else
  989.             wideCharBuf = tmpWBuff;
  990.             xmlToMbs (toTranscode, wLent, wideCharBuf, wLent);
  991.         } else
  992.             wideCharBuf = (char *) toTranscode;
  993.         // perform conversion
  994.         wLent *= uChSize();
  995.         char    *ptr = retVal;
  996.         size_t  tmpwLent = wLent;
  997.         size_t  rc = iconvTo(wideCharBuf, &tmpwLent, &ptr, neededLen);
  998.         if (rc == (size_t)-1) {
  999.             if (wBufPtr)
  1000.             delete [] wBufPtr;
  1001.             return 0;
  1002.         }
  1003.         if (wBufPtr)
  1004.             delete [] wBufPtr;
  1005.         retVal[neededLen] = 0;
  1006. #endif /* !XML_USE_LIBICONV */
  1007.     } else {
  1008.         retVal = new char[1];
  1009.         if (retVal == NULL)
  1010.             return 0;
  1011.         retVal[0] = 0;
  1012.     }
  1013.     return retVal;
  1014. }
  1015. char* IconvFBSDLCPTranscoder::transcode(const XMLCh* const toTranscode,
  1016.                                         MemoryManager* const manager)
  1017. {
  1018.     if (!toTranscode)
  1019.         return 0;
  1020.     char* retVal = 0;
  1021.     if (*toTranscode) {
  1022.         unsigned int  wLent = getWideCharLength(toTranscode);
  1023. #ifndef XML_USE_LIBICONV
  1024.         wchar_t       tmpWideCharArr[gTempBuffArraySize];
  1025.         wchar_t*      allocatedArray = 0;
  1026.         wchar_t*      wideCharBuf = 0;
  1027.         if (wLent >= gTempBuffArraySize)
  1028.             wideCharBuf = allocatedArray = (wchar_t*) manager->allocate
  1029.             (
  1030.                 (wLent + 1) * sizeof(wchar_t)
  1031.             );//new wchar_t[wLent + 1];
  1032.         else
  1033.             wideCharBuf = tmpWideCharArr;
  1034.         for (unsigned int i = 0; i < wLent; i++)
  1035.             wideCharBuf[i] = toTranscode[i];
  1036.         wideCharBuf[wLent] = 0x00;
  1037.         // Calc the needed size.
  1038.         const size_t neededLen = fbsd_wcstombs(NULL, wideCharBuf, 0);
  1039.         if (neededLen == -1) {
  1040.             if (allocatedArray)
  1041.                 manager->deallocate(allocatedArray);//delete [] allocatedArray;
  1042.             return 0;
  1043.         }
  1044.         retVal = (char*) manager->allocate((neededLen + 1) * sizeof(char));//new char[neededLen + 1];
  1045.         fbsd_wcstombs(retVal, wideCharBuf, neededLen);
  1046.         if (allocatedArray)
  1047.             manager->deallocate(allocatedArray);//delete [] allocatedArray;
  1048.         retVal[neededLen] = 0;
  1049. #else /* XML_USE_LIBICONV */
  1050.         // Calc needed size.
  1051.         const size_t neededLen = calcRequiredSize (toTranscode);
  1052.         if (neededLen == 0)
  1053.             return 0;
  1054.         // allocate output buffer
  1055.         retVal = (char*) manager->allocate((neededLen + 1) * sizeof(char));//new char[neededLen + 1];
  1056.         if (retVal == NULL)
  1057.             return 0;
  1058.         // prepare the original
  1059.         char    tmpWBuff[gTempBuffArraySize];
  1060.         char    *wideCharBuf = 0;
  1061.         char    *wBufPtr = 0;
  1062.         size_t  len = wLent * uChSize();
  1063.         if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) {
  1064.             if (len > gTempBuffArraySize) {
  1065.             wBufPtr = (char*) manager->allocate(len * sizeof(char));//new char[len];
  1066.             if (wBufPtr == NULL) {
  1067.                 manager->deallocate(retVal);
  1068.                 return 0;
  1069.             }
  1070.             wideCharBuf = wBufPtr;
  1071.             } else
  1072.             wideCharBuf = tmpWBuff;
  1073.             xmlToMbs (toTranscode, wLent, wideCharBuf, wLent);
  1074.         } else
  1075.             wideCharBuf = (char *) toTranscode;
  1076.         // perform conversion
  1077.         wLent *= uChSize();
  1078.         char    *ptr = retVal;
  1079.         size_t  tmpwLent = wLent;
  1080.         size_t  rc = iconvTo(wideCharBuf, &tmpwLent, &ptr, neededLen);
  1081.         if (rc == (size_t)-1) {
  1082.             if (wBufPtr)
  1083.                 manager->deallocate(wBufPtr);//delete [] wBufPtr;
  1084.             return 0;
  1085.         }
  1086.         if (wBufPtr)
  1087.             manager->deallocate(wBufPtr);//delete [] wBufPtr;
  1088.         retVal[neededLen] = 0;
  1089. #endif /* !XML_USE_LIBICONV */
  1090.     } else {
  1091.         retVal = (char*) manager->allocate(sizeof(char));//new char[1];
  1092.         if (retVal == NULL)
  1093.             return 0;
  1094.         retVal[0] = 0;
  1095.     }
  1096.     return retVal;
  1097. }
  1098. bool IconvFBSDLCPTranscoder::transcode( const   XMLCh* const    toTranscode
  1099.                     , char* const        toFill
  1100.                     , const unsigned int    maxBytes)
  1101. {
  1102.     // Watch for a couple of pyscho corner cases
  1103.     if (!toTranscode || !maxBytes) {
  1104.         toFill[0] = 0;
  1105.         return true;
  1106.     }
  1107.     if (!*toTranscode) {
  1108.         toFill[0] = 0;
  1109.         return true;
  1110.     }
  1111.     unsigned int  wLent = getWideCharLength(toTranscode);
  1112.     if (wLent > maxBytes)
  1113.         wLent = maxBytes;
  1114.     size_t mblen;
  1115. #ifndef XML_USE_LIBICONV
  1116.     wchar_t       tmpWideCharArr[gTempBuffArraySize];
  1117.     wchar_t*      allocatedArray = 0;
  1118.     wchar_t*      wideCharBuf = 0;
  1119.     if (maxBytes >= gTempBuffArraySize)
  1120.         wideCharBuf = allocatedArray = (wchar_t*) XMLPlatformUtils::fgMemoryManager->allocate
  1121.         (
  1122.             (maxBytes + 1) * sizeof(wchar_t)
  1123.         );//new wchar_t[maxBytes + 1];
  1124.     else
  1125.         wideCharBuf = tmpWideCharArr;
  1126.     for (unsigned int i = 0; i < wLent; i++)
  1127.         wideCharBuf[i] = toTranscode[i];
  1128.     wideCharBuf[wLent] = 0x00;
  1129.     // Ok, go ahead and try the transcoding. If it fails, then ...
  1130.     mblen = fbsd_wcstombs(toFill, wideCharBuf, maxBytes);
  1131.     if (mblen == -1) {
  1132.         if (allocatedArray)
  1133.             XMLPlatformUtils::fgMemoryManager->deallocate(allocatedArray);//delete [] allocatedArray;
  1134.         return false;
  1135.     }
  1136.     if (allocatedArray)
  1137.         XMLPlatformUtils::fgMemoryManager->deallocate(allocatedArray);//delete [] allocatedArray;
  1138. #else /* XML_USE_LIBICONV */
  1139.     // Fill the "unicode" string
  1140.     char    tmpWBuff[gTempBuffArraySize];
  1141.     char    *wideCharBuf = 0;
  1142.     char    *wBufPtr = 0;
  1143.     size_t  len = wLent * uChSize();
  1144.     if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) {
  1145.         if (len > gTempBuffArraySize) {
  1146.             wBufPtr = (char*) XMLPlatformUtils::fgMemoryManager->allocate
  1147.             (
  1148.                 len * sizeof(char)
  1149.             );//new char[len];
  1150.             if (wBufPtr == NULL)
  1151.                 return 0;
  1152.             wideCharBuf = wBufPtr;
  1153.          }
  1154.          else
  1155.              wideCharBuf = tmpWBuff;
  1156.              xmlToMbs (toTranscode, wLent, wideCharBuf, wLent);
  1157.      }
  1158.      else
  1159.          wideCharBuf = (char *) toTranscode;
  1160.     // Ok, go ahead and try the transcoding. If it fails, then ...
  1161.     char    *ptr = toFill;
  1162.     mblen = iconvTo(wideCharBuf, &len, &ptr, maxBytes);
  1163.     if (mblen == (size_t)-1) {
  1164.         if (wBufPtr)
  1165.            XMLPlatformUtils::fgMemoryManager->deallocate(wBufPtr);//delete [] wBufPtr;
  1166.         return false;
  1167.     }
  1168.     if (wBufPtr)
  1169.         XMLPlatformUtils::fgMemoryManager->deallocate(wBufPtr);//delete [] wBufPtr;
  1170. #endif /* !XML_USE_LIBICONV */
  1171.     // Cap it off just in case
  1172.     toFill[mblen] = 0;
  1173.     return true;
  1174. }
  1175. XMLCh* IconvFBSDLCPTranscoder::transcode(const char* const toTranscode)
  1176. {
  1177.     if (!toTranscode)
  1178.         return 0;
  1179.     XMLCh* retVal = 0;
  1180.     if (*toTranscode) {
  1181.         const unsigned int wLent = calcRequiredSize(toTranscode);
  1182.         if (wLent == 0) {
  1183.             retVal = new XMLCh[1];
  1184.             retVal[0] = 0;
  1185.             return retVal;
  1186.         }
  1187. #ifndef XML_USE_LIBICONV
  1188.         wchar_t       tmpWideCharArr[gTempBuffArraySize];
  1189.         wchar_t*      allocatedArray = 0;
  1190.         wchar_t*      wideCharBuf = 0;
  1191.         if (wLent >= gTempBuffArraySize)
  1192.             wideCharBuf = allocatedArray = new wchar_t[wLent + 1];
  1193.         else
  1194.             wideCharBuf = tmpWideCharArr;
  1195.         fbsd_mbstowcs(wideCharBuf, toTranscode, wLent);
  1196.         retVal = new XMLCh[wLent + 1];
  1197.         if (retVal == NULL) {
  1198.             if (allocatedArray)
  1199.                 delete [] allocatedArray;
  1200.             return NULL;
  1201.         }
  1202.         for (unsigned int i = 0; i < wLent; i++)
  1203.             retVal[i] = (XMLCh) wideCharBuf[i];
  1204.         retVal[wLent] = 0x00;
  1205.         if (allocatedArray)
  1206.             delete [] allocatedArray;
  1207. #else /* XML_USE_LIBICONV */
  1208.         char    tmpWBuff[gTempBuffArraySize];
  1209.         char    *wideCharBuf = 0;
  1210.         char    *wBufPtr = 0;
  1211.         size_t  len = wLent * uChSize();
  1212.         retVal = new XMLCh[wLent + 1];
  1213.         if (retVal == NULL)
  1214.             return NULL;
  1215.         if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) {
  1216.             if (len > gTempBuffArraySize) {
  1217.                 wBufPtr = new char[len];
  1218.                 if (wBufPtr == NULL)
  1219.                     return 0;
  1220.                 wideCharBuf = wBufPtr;
  1221.             } else
  1222.                 wideCharBuf = tmpWBuff;
  1223.         } else
  1224.             wideCharBuf = (char *) retVal;
  1225.         size_t    flen = strlen(toTranscode);
  1226.         char    *ptr = wideCharBuf;
  1227.         size_t    rc = iconvFrom(toTranscode, &flen, &ptr, len);
  1228.         if (rc == (size_t) -1) {
  1229.             if (wBufPtr)
  1230.             delete [] wBufPtr;
  1231.             return NULL;
  1232.         }
  1233.         if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER)
  1234.             mbsToXML (wideCharBuf, wLent, retVal, wLent);
  1235.         if (wBufPtr)
  1236.             delete [] wBufPtr;
  1237.         retVal[wLent] = 0x00;
  1238. #endif /* !XML_USE_LIBICONV */
  1239.     }
  1240.     else {
  1241.         retVal = new XMLCh[1];
  1242.         if (retVal == NULL )
  1243.             return 0;
  1244.         retVal[0] = 0;
  1245.     }
  1246.     return retVal;
  1247. }
  1248. XMLCh* IconvFBSDLCPTranscoder::transcode(const char* const toTranscode,
  1249.                                          MemoryManager* const manager)
  1250. {
  1251.     if (!toTranscode)
  1252.         return 0;
  1253.     XMLCh* retVal = 0;
  1254.     if (*toTranscode) {
  1255.         const unsigned int wLent = calcRequiredSize(toTranscode);
  1256.         if (wLent == 0) {
  1257.             retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1];
  1258.             retVal[0] = 0;
  1259.             return retVal;
  1260.         }
  1261. #ifndef XML_USE_LIBICONV
  1262.         wchar_t       tmpWideCharArr[gTempBuffArraySize];
  1263.         wchar_t*      allocatedArray = 0;
  1264.         wchar_t*      wideCharBuf = 0;
  1265.         if (wLent >= gTempBuffArraySize)
  1266.             wideCharBuf = allocatedArray = (wchar_t*) manager->allocate
  1267.             (
  1268.                 (wLent + 1) * sizeof(wchar_t)
  1269.             );//new wchar_t[wLent + 1];
  1270.         else
  1271.             wideCharBuf = tmpWideCharArr;
  1272.         fbsd_mbstowcs(wideCharBuf, toTranscode, wLent);
  1273.         retVal = (XMLCh*) manager->allocate((wLent + 1) * sizeof(XMLCh));//new XMLCh[wLent + 1];
  1274.         if (retVal == NULL) {
  1275.             if (allocatedArray)
  1276.                 manager->deallocate(allocatedArray);//delete [] allocatedArray;
  1277.             return NULL;
  1278.         }
  1279.         for (unsigned int i = 0; i < wLent; i++)
  1280.             retVal[i] = (XMLCh) wideCharBuf[i];
  1281.         retVal[wLent] = 0x00;
  1282.         if (allocatedArray)
  1283.             manager->deallocate(allocatedArray);//delete [] allocatedArray;
  1284. #else /* XML_USE_LIBICONV */
  1285.         char    tmpWBuff[gTempBuffArraySize];
  1286.         char    *wideCharBuf = 0;
  1287.         char    *wBufPtr = 0;
  1288.         size_t  len = wLent * uChSize();
  1289.         retVal = (XMLCh*) manager->allocate((wLent + 1) * sizeof(XMLCh));//new XMLCh[wLent + 1];
  1290.         if (retVal == NULL)
  1291.             return NULL;
  1292.         if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) {
  1293.             if (len > gTempBuffArraySize) {
  1294.                 wBufPtr = (char*) manager->allocate(len * sizeof(char));//new char[len];
  1295.                 if (wBufPtr == NULL)
  1296.                     return 0;
  1297.                 wideCharBuf = wBufPtr;
  1298.             } else
  1299.                 wideCharBuf = tmpWBuff;
  1300.         } else
  1301.             wideCharBuf = (char *) retVal;
  1302.         size_t    flen = strlen(toTranscode);
  1303.         char    *ptr = wideCharBuf;
  1304.         size_t    rc = iconvFrom(toTranscode, &flen, &ptr, len);
  1305.         if (rc == (size_t) -1) {
  1306.             if (wBufPtr)
  1307.             manager->deallocate(wBufPtr);//delete [] wBufPtr;
  1308.             return NULL;
  1309.         }
  1310.         if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER)
  1311.             mbsToXML (wideCharBuf, wLent, retVal, wLent);
  1312.         if (wBufPtr)
  1313.             manager->deallocate(wBufPtr);//delete [] wBufPtr;
  1314.         retVal[wLent] = 0x00;
  1315. #endif /* !XML_USE_LIBICONV */
  1316.     }
  1317.     else {
  1318.         retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1];
  1319.         if (retVal == NULL )
  1320.             return 0;
  1321.         retVal[0] = 0;
  1322.     }
  1323.     return retVal;
  1324. }
  1325. bool IconvFBSDLCPTranscoder::transcode(const   char* const    toTranscode
  1326.                        ,       XMLCh* const    toFill
  1327.                        , const unsigned int    maxChars)
  1328. {
  1329.     // Check for a couple of psycho corner cases
  1330.     if (!toTranscode || !maxChars)
  1331.     {
  1332.         toFill[0] = 0;
  1333.         return true;
  1334.     }
  1335.     if (!*toTranscode)
  1336.     {
  1337.         toFill[0] = 0;
  1338.         return true;
  1339.     }
  1340.     size_t wLent = calcRequiredSize(toTranscode);
  1341.     if (wLent > maxChars)
  1342.         wLent = maxChars;
  1343. #ifndef XML_USE_LIBICONV
  1344.     wchar_t       tmpWideCharArr[gTempBuffArraySize];
  1345.     wchar_t*      allocatedArray = 0;
  1346.     wchar_t*      wideCharBuf = 0;
  1347.     if (maxChars >= gTempBuffArraySize)
  1348.         wideCharBuf = allocatedArray = (wchar_t*) XMLPlatformUtils::fgMemoryManager->allocate
  1349.         (
  1350.             (wLent + 1) * sizeof(wchar_t)
  1351.         );//new wchar_t[wLent + 1];
  1352.     else
  1353.         wideCharBuf = tmpWideCharArr;
  1354.     if (fbsd_mbstowcs(wideCharBuf, toTranscode, wLent) == -1) {
  1355.         if (allocatedArray)
  1356.             XMLPlatformUtils::fgMemoryManager->deallocate(allocatedArray);//delete [] allocatedArray;
  1357.         return false;
  1358.     }
  1359.     for (unsigned int i = 0; i < wLent; i++)
  1360.         toFill[i] = (XMLCh) wideCharBuf[i];
  1361.     if (allocatedArray)
  1362.     XMLPlatformUtils::fgMemoryManager->deallocate(allocatedArray);//delete [] allocatedArray;
  1363. #else /* XML_USE_LIBICONV */
  1364.     char    tmpWBuff[gTempBuffArraySize];
  1365.     char    *wideCharBuf = 0;
  1366.     char    *wBufPtr = 0;
  1367.     size_t    len = wLent * uChSize();
  1368.     if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) {
  1369.     if (len > gTempBuffArraySize) {
  1370.         wBufPtr = (char*) XMLPlatformUtils::fgMemoryManager->allocate
  1371.         (
  1372.             len * sizeof(char)
  1373.         );//new char[len];
  1374.         if (wBufPtr == NULL)
  1375.         return 0;
  1376.         wideCharBuf = wBufPtr;
  1377.     } else
  1378.         wideCharBuf = tmpWBuff;
  1379.     } else
  1380.     wideCharBuf = (char *) toFill;
  1381.     size_t    flen = strlen(toTranscode); // wLent;
  1382.     char    *ptr = wideCharBuf;
  1383.     size_t    rc = iconvFrom(toTranscode, &flen, &ptr, len);
  1384.     if (rc == (size_t)-1) {
  1385.         if (wBufPtr)
  1386.             XMLPlatformUtils::fgMemoryManager->deallocate(wBufPtr);//delete [] wBufPtr;
  1387.         return false;
  1388.     }
  1389.     if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER)
  1390.     mbsToXML (wideCharBuf, wLent, toFill, wLent);
  1391.     if (wBufPtr)
  1392.         XMLPlatformUtils::fgMemoryManager->deallocate(wBufPtr);//delete [] wBufPtr;
  1393. #endif /* !XML_USE_LIBICONV */
  1394.     toFill[wLent] = 0x00;
  1395.     return true;
  1396. }
  1397. // ---------------------------------------------------------------------------
  1398. //  IconvFBSDLCPTranscoder: Constructors and Destructor
  1399. // ---------------------------------------------------------------------------
  1400. #ifdef XML_USE_LIBICONV
  1401. IconvFBSDLCPTranscoder::IconvFBSDLCPTranscoder (iconv_t        cd_from,
  1402.                         iconv_t        cd_to,
  1403.                         size_t        uchsize,
  1404.                         unsigned int    ubo)
  1405.     : IconvFBSDCD (cd_from, cd_to, uchsize, ubo)
  1406. {
  1407. }
  1408. #endif /* XML_USE_LIBICONV */
  1409. #ifndef XML_USE_LIBICONV
  1410. IconvFBSDLCPTranscoder::IconvFBSDLCPTranscoder()
  1411. {
  1412. }
  1413. #endif /* !XML_USE_LIBICONV */
  1414. IconvFBSDLCPTranscoder::~IconvFBSDLCPTranscoder()
  1415. {
  1416. }
  1417. #ifdef XML_USE_LIBICONV
  1418. // ---------------------------------------------------------------------------
  1419. //  IconvFBSDTranscoder: Constructors and Destructor
  1420. // ---------------------------------------------------------------------------
  1421. IconvFBSDTranscoder::IconvFBSDTranscoder (const    XMLCh* const    encodingName
  1422.                       , const unsigned int    blockSize
  1423.                       ,    iconv_t        cd_from
  1424.                       ,    iconv_t        cd_to
  1425.                       ,    size_t        uchsize
  1426.                       ,    unsigned int    ubo
  1427.                       , MemoryManager* const manager
  1428.     )
  1429.     : XMLTranscoder(encodingName, blockSize, manager)
  1430.     , IconvFBSDCD (cd_from, cd_to, uchsize, ubo)
  1431. {
  1432. }
  1433. IconvFBSDTranscoder::~IconvFBSDTranscoder()
  1434. {
  1435.     ICONV_LOCK;
  1436.     if (cdTo() != (iconv_t)-1) {
  1437.         iconv_close (cdTo());
  1438.         setCDTo ((iconv_t)-1);
  1439.     }
  1440.     if (cdFrom() != (iconv_t)-1) {
  1441.         iconv_close (cdFrom());
  1442.         setCDFrom ((iconv_t)-1);
  1443.     }
  1444. }
  1445. // ---------------------------------------------------------------------------
  1446. //  IconvFBSDTranscoder: Implementation of the virtual transcoder API
  1447. // ---------------------------------------------------------------------------
  1448. unsigned int    IconvFBSDTranscoder::transcodeFrom
  1449. (
  1450.     const   XMLByte* const          srcData
  1451.     , const unsigned int            srcCount
  1452.     ,       XMLCh* const            toFill
  1453.     , const unsigned int            maxChars
  1454.     ,       unsigned int&           bytesEaten
  1455.     ,       unsigned char* const    charSizes )
  1456. {
  1457.     // Transcode TO XMLCh
  1458.     const char*  startSrc = (const char*) srcData;
  1459.     const char*  endSrc = (const char*) srcData + srcCount;
  1460.     char    tmpWBuff[gTempBuffArraySize];
  1461.     char    *startTarget = 0;
  1462.     char    *wBufPtr = 0;
  1463.     size_t    len = maxChars * uChSize();
  1464.     if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) {
  1465.         if (len > gTempBuffArraySize) {
  1466.             wBufPtr = (char*) getMemoryManager()->allocate
  1467.             (
  1468.                 len * sizeof(char)
  1469.             );//new char[len];
  1470.             if (wBufPtr == NULL)
  1471.             return 0;
  1472.             startTarget = wBufPtr;
  1473.         } else
  1474.             startTarget = tmpWBuff;
  1475.     } else
  1476.     startTarget = (char *) toFill;
  1477.     // Do character-by-character transcoding
  1478.     char    *orgTarget = startTarget;
  1479.     size_t    srcLen = srcCount;
  1480.     size_t    prevSrcLen = srcLen;
  1481.     unsigned int toReturn = 0;
  1482.     bytesEaten = 0;
  1483.     for (size_t cnt = 0; cnt < maxChars && srcLen; cnt++) {
  1484.         size_t    rc = iconvFrom(startSrc, &srcLen, &orgTarget, uChSize());
  1485.         if (rc == (size_t)-1) {
  1486.             if (errno != E2BIG || prevSrcLen == srcLen) {
  1487.                 if (wBufPtr)
  1488.                     getMemoryManager()->deallocate(wBufPtr);//delete [] wBufPtr;
  1489.                 ThrowXML(TranscodingException, XMLExcepts::Trans_BadSrcSeq);
  1490.             }
  1491.         }
  1492.         charSizes[cnt] = prevSrcLen - srcLen;
  1493.         prevSrcLen = srcLen;
  1494.         bytesEaten += charSizes[cnt];
  1495.         startSrc = endSrc - srcLen;
  1496.         toReturn++;
  1497.     }
  1498.     if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER)
  1499.         mbsToXML (startTarget, toReturn, toFill, toReturn);
  1500.     if (wBufPtr)
  1501.         getMemoryManager()->deallocate(wBufPtr);//delete [] wBufPtr;
  1502.     return toReturn;
  1503. }
  1504. unsigned int    IconvFBSDTranscoder::transcodeTo
  1505. (
  1506.     const   XMLCh* const    srcData
  1507.     , const unsigned int    srcCount
  1508.     ,       XMLByte* const    toFill
  1509.     , const unsigned int    maxBytes
  1510.     ,       unsigned int&    charsEaten
  1511.     , const UnRepOpts        options )
  1512. {
  1513.     // Transcode FROM XMLCh
  1514.     char    tmpWBuff[gTempBuffArraySize];
  1515.     char    *startSrc = tmpWBuff;
  1516.     char    *wBufPtr = 0;
  1517.     size_t    len = srcCount * uChSize();
  1518.     if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) {
  1519.         if (len > gTempBuffArraySize) {
  1520.             wBufPtr = (char*) getMemoryManager()->allocate
  1521.             (
  1522.                 len * sizeof(char)
  1523.             );//new char[len];
  1524.             if (wBufPtr == NULL)
  1525.                 return 0;
  1526.             startSrc = wBufPtr;
  1527.         } else
  1528.             startSrc = tmpWBuff;
  1529.         xmlToMbs (srcData, srcCount, startSrc, srcCount);
  1530.     } else
  1531.         startSrc = (char *) srcData;
  1532.     char*    startTarget = (char *) toFill;
  1533.     size_t    srcLen = len;
  1534.     size_t    rc = iconvTo (startSrc, &srcLen, &startTarget, maxBytes);
  1535.     if (rc == (size_t)-1 && errno != E2BIG) {
  1536.         if (wBufPtr)
  1537.             getMemoryManager()->deallocate(wBufPtr);//delete [] wBufPtr;
  1538.         ThrowXML(TranscodingException, XMLExcepts::Trans_BadSrcSeq);
  1539.     }
  1540.     charsEaten = srcCount - srcLen / uChSize();
  1541.     if (wBufPtr)
  1542.         getMemoryManager()->deallocate(wBufPtr);//delete [] wBufPtr;
  1543.     return startTarget - (char *)toFill;
  1544. }
  1545. bool        IconvFBSDTranscoder::canTranscodeTo
  1546. (
  1547.     const unsigned int toCheck
  1548. )   const
  1549. {
  1550.     //
  1551.     //  If the passed value is really a surrogate embedded together, then
  1552.     //  we need to break it out into its two chars. Else just one.
  1553.     //
  1554.     char        srcBuf[2 * uChSize()];
  1555.     unsigned int    srcCount = 1;
  1556.     if (toCheck & 0xFFFF0000) {
  1557.         XMLCh    ch1 = (toCheck >> 10) + 0xD800;
  1558.         XMLCh    ch2 = toCheck & 0x3FF + 0xDC00;
  1559.         xmlToMbs(&ch1, 1, srcBuf, 1);
  1560.         xmlToMbs(&ch2, 1, srcBuf + uChSize(), 1);
  1561.         srcCount++;
  1562.     } else
  1563.         xmlToMbs((const XMLCh*) &toCheck, 1, srcBuf, 1);
  1564.     size_t    len = srcCount * uChSize();
  1565.     char    tmpBuf[64];
  1566.     char*    pTmpBuf = tmpBuf;
  1567.     size_t    rc = iconvTo( srcBuf, &len, &pTmpBuf, 64);
  1568.     return (rc != (size_t)-1) && (len == 0);
  1569. }
  1570. #endif /* XML_USE_LIBICONV */
  1571. XERCES_CPP_NAMESPACE_END