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

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2000 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) 1999, 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.  * $Id: Iconv390TransService.cpp,v 1.7 2003/05/17 16:32:17 knoaman Exp $
  58.  */
  59. // ---------------------------------------------------------------------------
  60. //  Includes
  61. // ---------------------------------------------------------------------------
  62. #include "Iconv390TransService.hpp"
  63. #include <xercesc/util/XMLUniDefs.hpp>
  64. #include <xercesc/util/XMLUni.hpp>
  65. #include <xercesc/util/regx/XMLUniCharacter.hpp>
  66. #include <xercesc/framework/MemoryManager.hpp>
  67. #include <wchar.h>
  68. #include <string.h>
  69. #include <stdlib.h>
  70. #include <stdio.h>
  71. #ifdef OS390BATCH
  72. #include <unistd.h>
  73. #endif
  74. #include <ctype.h>
  75. XERCES_CPP_NAMESPACE_BEGIN
  76. //
  77. //  Cannot use the OS/390 c/c++ towupper and towlower functions in the
  78. //  Unicode environment. We will use mytowupper and mytowlower here.
  79. //
  80. #undef towupper
  81. #undef towlower
  82. #define towupper mytowupper
  83. #define towlower mytowlower
  84. // ---------------------------------------------------------------------------
  85. //  Local, const data
  86. // ---------------------------------------------------------------------------
  87. static const int gTempBuffArraySize = 1024;
  88. static const XMLCh  gMyServiceId[] =
  89. {
  90.     chLatin_I, chLatin_C, chLatin_o, chLatin_n, chLatin_v, chNull
  91. };
  92. // ---------------------------------------------------------------------------
  93. //  gUnicodeToIBM037XlatTable
  94. //      This is the translation table for Unicode to ibm-037. This table
  95. //      contains 255 entries.
  96. // ---------------------------------------------------------------------------
  97. static const XMLByte gUnicodeToIBM037XlatTable[256] =
  98. {
  99.         0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F
  100.     ,   0x16, 0x05, 0x25, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
  101.     ,   0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26
  102.     ,   0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F
  103.     ,   0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D
  104.     ,   0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61
  105.     ,   0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7
  106.     ,   0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F
  107.     ,   0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7
  108.     ,   0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6
  109.     ,   0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6
  110.     ,   0xE7, 0xE8, 0xE9, 0xBA, 0xE0, 0xBB, 0xB0, 0x6D
  111.     ,   0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87
  112.     ,   0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96
  113.     ,   0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6
  114.     ,   0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07
  115.     ,   0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17
  116.     ,   0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B
  117.     ,   0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08
  118.     ,   0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0xFF
  119.     ,   0x41, 0xAA, 0x4A, 0xB1, 0x9F, 0xB2, 0x6A, 0xB5
  120.     ,   0xBD, 0xB4, 0x9A, 0x8A, 0x5F, 0xCA, 0xAF, 0xBC
  121.     ,   0x90, 0x8F, 0xEA, 0xFA, 0xBE, 0xA0, 0xB6, 0xB3
  122.     ,   0x9D, 0xDA, 0x9B, 0x8B, 0xB7, 0xB8, 0xB9, 0xAB
  123.     ,   0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9E, 0x68
  124.     ,   0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77
  125.     ,   0xAC, 0x69, 0xED, 0xEE, 0xEB, 0xEF, 0xEC, 0xBF
  126.     ,   0x80, 0xFD, 0xFE, 0xFB, 0xFC, 0xAD, 0xAE, 0x59
  127.     ,   0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9C, 0x48
  128.     ,   0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57
  129.     ,   0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1
  130.     ,   0x70, 0xDD, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF
  131. };
  132. iconvconverter * converterList;
  133. XMLMutex  converterListMutex;
  134. iconvconverter * addConverter(const char* const EncodingName
  135.                              ,XMLTransService::Codes& resValue)
  136. {
  137.     XMLMutexLock lockConverterlist(&converterListMutex);
  138.     iconvconverter *tconv=converterList;
  139.     while ( (tconv) &&
  140.             (strcmp(tconv->name,EncodingName)) )
  141.       tconv = tconv->nextconverter;
  142.     if (tconv) {
  143.       tconv->usecount++;
  144.     }
  145.     else {
  146.       tconv = new iconvconverter;
  147.       strcpy(tconv->name,EncodingName);
  148.       tconv->usecount=1;
  149.       tconv->fIconv390Descriptor = iconv_open("UCS-2",EncodingName);
  150.       if (tconv->fIconv390Descriptor == (iconv_t)(-1)) {
  151.          resValue = XMLTransService::UnsupportedEncoding;
  152.          delete tconv;
  153.          return 0;
  154.       }
  155.       tconv->nextconverter = converterList;
  156.       converterList = tconv;
  157.     }
  158.     return tconv;
  159. }
  160. void removeConverter(iconvconverter* const converter)
  161. {
  162.     iconvconverter *pconv,*tconv;
  163.     tconv = 0;
  164.     if (converter) {
  165.       XMLMutexLock lockConverterlist(&converterListMutex);
  166.       if (--converter->usecount==0) {
  167.         tconv = converterList;
  168.         pconv = (iconvconverter*)&converterList;
  169.         while ( (tconv) && (tconv!=converter) ) {
  170.           pconv=tconv;
  171.           tconv=tconv->nextconverter;
  172.         }
  173.         pconv->nextconverter=tconv->nextconverter;
  174.       }
  175.     }
  176.     if (tconv) {
  177.       iconv_close(tconv->fIconv390Descriptor);
  178.       delete tconv;
  179.     }
  180. }
  181. // ---------------------------------------------------------------------------
  182. //  Local methods
  183. // ---------------------------------------------------------------------------
  184. static unsigned int  getWideCharLength(const XMLCh* const src)
  185. {
  186.     if (!src)
  187.         return 0;
  188.     unsigned int len = 0;
  189.     const XMLCh* pTmp = src;
  190.     while (*pTmp++)
  191.         len++;
  192.     return len;
  193. }
  194. // ---------------------------------------------------------------------------
  195. //  Iconv390TransService: Constructors and Destructor
  196. // ---------------------------------------------------------------------------
  197. Iconv390TransService::Iconv390TransService()
  198. {
  199. }
  200. Iconv390TransService::~Iconv390TransService()
  201. {
  202. }
  203. // ---------------------------------------------------------------------------
  204. //  Iconv390TransService: The virtual transcoding service API
  205. // ---------------------------------------------------------------------------
  206. int Iconv390TransService::compareIString(  const   XMLCh* const    comp1
  207.                                            , const XMLCh* const    comp2)
  208. {
  209.     const XMLCh* cptr1 = comp1;
  210.     const XMLCh* cptr2 = comp2;
  211.     while ( (*cptr1 != 0) && (*cptr2 != 0) )
  212.     {
  213.         wint_t wch1 = towupper(*cptr1);
  214.         wint_t wch2 = towupper(*cptr2);
  215.         if (wch1 != wch2)
  216.             break;
  217.         cptr1++;
  218.         cptr2++;
  219.     }
  220.     return (int) ( towupper(*cptr1) - towupper(*cptr2) );
  221. }
  222. int Iconv390TransService::compareNIString( const   XMLCh* const    comp1
  223.                                            , const XMLCh* const    comp2
  224.                                            , const unsigned int    maxChars)
  225. {
  226.     unsigned int  n = 0;
  227.     const XMLCh* cptr1 = comp1;
  228.     const XMLCh* cptr2 = comp2;
  229.     while (true && maxChars)
  230.     {
  231.         wint_t wch1 = towupper(*cptr1);
  232.         wint_t wch2 = towupper(*cptr2);
  233.         if (wch1 != wch2)
  234.             return (int) (wch1 - wch2);
  235.         // If either ended, then both ended, so equal
  236.         if (!*cptr1 || !*cptr2)
  237.             break;
  238.         cptr1++;
  239.         cptr2++;
  240.         //  Bump the count of chars done. If it equals the count then we
  241.         //  are equal for the requested count, so break out and return
  242.         //  equal.
  243.         n++;
  244.         if (n == maxChars)
  245.             break;
  246.     }
  247.     return 0;
  248. }
  249. const XMLCh* Iconv390TransService::getId() const
  250. {
  251.     return gMyServiceId;
  252. }
  253. bool Iconv390TransService::isSpace(const XMLCh toCheck) const
  254. {
  255.    unsigned short chartype = XMLUniCharacter::getType(toCheck);
  256.    if ( (chartype == XMLUniCharacter::SPACE_SEPARATOR) ||
  257.         (chartype == XMLUniCharacter::LINE_SEPARATOR)   ||
  258.         (chartype == XMLUniCharacter::PARAGRAPH_SEPARATOR) )
  259.       return true;
  260.    else
  261.       return false;
  262. }
  263. XMLLCPTranscoder* Iconv390TransService::makeNewLCPTranscoder()
  264. {
  265.     XMLTransService::Codes resValue;
  266.     // native MVS default code page is IBM-037
  267.     iconvconverter *tconv=addConverter("IBM-037",resValue);
  268.     if (tconv == 0) {
  269.         return 0;
  270.     }
  271.     return new Iconv390LCPTranscoder(tconv);
  272. }
  273. bool Iconv390TransService::supportsSrcOfs() const
  274. {
  275.     return true;
  276. }
  277. // ---------------------------------------------------------------------------
  278. //  Iconv390TransService: The protected virtual transcoding service API
  279. // ---------------------------------------------------------------------------
  280. XMLTranscoder*
  281. Iconv390TransService::makeNewXMLTranscoder(const   XMLCh* const            encodingName
  282.                                         ,       XMLTransService::Codes& resValue
  283.                                         , const unsigned int
  284.                                         ,       MemoryManager* const)
  285. {
  286.     //  This is a minimalist transcoding service, that only supports a local
  287.     //  default transcoder. All named encodings return zero as a failure,
  288.     //  which means that only the intrinsic encodings supported by the parser
  289.     //  itself will work for XML data.
  290.     //
  291.     resValue = XMLTransService::UnsupportedEncoding;
  292.     return 0;
  293. }
  294. void Iconv390TransService::upperCase(XMLCh* const toUpperCase) const
  295. {
  296.     XMLCh* outPtr = toUpperCase;
  297.     while (*outPtr != 0) {
  298. if ((*outPtr >= 0x61) && (*outPtr <= 0x7A))
  299.     *outPtr = *outPtr - 0x20;
  300. outPtr++;
  301.     }
  302. }
  303. void Iconv390TransService::lowerCase(XMLCh* const toLowerCase) const
  304. {
  305.     XMLCh* outPtr = toLowerCase;
  306.     while (*outPtr != 0) {
  307. if ((*outPtr >= 0x41) && (*outPtr <= 0x5A))
  308.     *outPtr = *outPtr + 0x20;
  309. outPtr++;
  310.     }
  311. }
  312. // ---------------------------------------------------------------------------
  313. unsigned int Iconv390LCPTranscoder::calcRequiredSize(const char* const srcText)
  314. {
  315.     if (!srcText)
  316.         return 0;
  317.     unsigned charLen = ::mblen(srcText, MB_CUR_MAX);
  318.     if (charLen == -1)
  319.         return 0;
  320.     else if (charLen != 0)
  321.         charLen = strlen(srcText)/charLen;
  322.     if (charLen == -1)
  323.         return 0;
  324.     return charLen;
  325. }
  326. unsigned int Iconv390LCPTranscoder::calcRequiredSize(const XMLCh* const srcText)
  327. {
  328.     if (!srcText)
  329.         return 0;
  330.     unsigned int  wLent = getWideCharLength(srcText);
  331.     wchar_t       tmpWideCharArr[gTempBuffArraySize];
  332.     wchar_t*      allocatedArray = 0;
  333.     wchar_t*      wideCharBuf = 0;
  334.     if (wLent >= gTempBuffArraySize)
  335.         wideCharBuf = allocatedArray = (wchar_t*) XMLPlatformUtils::fgMemoryManager->allocate
  336.         (
  337.             (wLent + 1) * sizeof(wLent + 1)
  338.         );//new wchar_t[wLent + 1];
  339.     else
  340.         wideCharBuf = tmpWideCharArr;
  341.     for (unsigned int i = 0; i < wLent; i++)
  342.     {
  343.         wideCharBuf[i] = srcText[i];
  344.     }
  345.     wideCharBuf[wLent] = 0x00;
  346.     const unsigned int retVal = ::wcstombs(NULL, wideCharBuf, 0);
  347.     XMLPlatformUtils::fgMemoryManager->deallocate(allocatedArray);//delete [] allocatedArray;
  348.     if (retVal == -1)
  349.         return 0;
  350.     return retVal;
  351. }
  352. char* Iconv390LCPTranscoder::transcode(const XMLCh* const toTranscode)
  353. {
  354.     if (!toTranscode)
  355.         return 0;
  356.     char* retVal = 0;
  357.     if (*toTranscode)
  358.     {
  359.         unsigned int  wLent = getWideCharLength(toTranscode);
  360. //
  361. //  Translate the input from Unicode XMLCh format into
  362. //  ibm-037 char format via the lookup table.
  363. //
  364.         retVal = new char[wLent + 1];
  365.         const XMLCh *srcPtr = toTranscode;
  366.         char *outPtr = retVal;
  367. while (*srcPtr != 0)
  368.     *outPtr++ = gUnicodeToIBM037XlatTable[*srcPtr++];
  369. *outPtr=0;
  370.     }
  371.     else
  372.     {
  373.         retVal = new char[1];
  374.         retVal[0] = 0;
  375.     }
  376.     return retVal;
  377. }
  378. char* Iconv390LCPTranscoder::transcode(const XMLCh* const toTranscode,
  379.                                        MemoryManager* const manager)
  380. {
  381.     if (!toTranscode)
  382.         return 0;
  383.     char* retVal = 0;
  384.     if (*toTranscode)
  385.     {
  386.         unsigned int  wLent = getWideCharLength(toTranscode);
  387. //
  388. //  Translate the input from Unicode XMLCh format into
  389. //  ibm-037 char format via the lookup table.
  390. //
  391.         retVal = (char*) manager->allocate((wLent + 1) * sizeof(char));//new char[wLent + 1];
  392.         const XMLCh *srcPtr = toTranscode;
  393.         char *outPtr = retVal;
  394. while (*srcPtr != 0)
  395.     *outPtr++ = gUnicodeToIBM037XlatTable[*srcPtr++];
  396. *outPtr=0;
  397.     }
  398.     else
  399.     {
  400.         retVal = (char*) manager->allocate(sizeof(char));//new char[1];
  401.         retVal[0] = 0;
  402.     }
  403.     return retVal;
  404. }
  405. bool Iconv390LCPTranscoder::transcode( const   XMLCh* const    toTranscode
  406.                                     ,       char* const     toFill
  407.                                     , const unsigned int    maxBytes)
  408. {
  409.     // Watch for a couple of pyscho corner cases
  410.     if (!toTranscode || !maxBytes)
  411.     {
  412.         toFill[0] = 0;
  413.         return true;
  414.     }
  415.     if (!*toTranscode)
  416.     {
  417.         toFill[0] = 0;
  418.         return true;
  419.     }
  420.     const XMLCh *srcPtr = toTranscode;
  421.     char *outPtr = toFill;
  422.     int bytectr = maxBytes;
  423.     while (bytectr-- && *srcPtr)
  424.        *outPtr++ = gUnicodeToIBM037XlatTable[*srcPtr++];
  425.     *outPtr=0;
  426.     return true;
  427. }
  428. XMLCh* Iconv390LCPTranscoder::transcode(const char* const toTranscode)
  429. {
  430.     if (!toTranscode)
  431.         return 0;
  432.     XMLCh* retVal = 0;
  433.     if (*toTranscode)
  434.     {
  435.         const unsigned int len = calcRequiredSize(toTranscode);
  436.         if (len == 0)
  437.         {
  438.             retVal = new XMLCh[1];
  439.             retVal[0] = 0;
  440.             return retVal;
  441.         }
  442.         wchar_t       tmpWideCharArr[gTempBuffArraySize];
  443.         wchar_t*      allocatedArray = 0;
  444.         wchar_t*      wideCharBuf = 0;
  445.         retVal = new XMLCh[len + 1];
  446.         size_t retCode;
  447.         char *tmpInPtr = (char*) toTranscode;
  448.         char *tmpOutPtr = (char*) retVal;
  449.         size_t inByteLeft = len;
  450.         size_t outByteLeft = len*2;
  451.         {
  452.          XMLMutexLock lockConverter(&converter->fMutex);
  453.          retCode = iconv(converter->fIconv390Descriptor, &tmpInPtr, &inByteLeft, &tmpOutPtr, &outByteLeft);
  454.         }
  455.         if (retCode == -1) {
  456.             delete [] retVal;
  457.             return 0;
  458.         }
  459.         retVal[len] = 0x00;
  460.         delete [] allocatedArray;
  461.     }
  462.     else
  463.     {
  464.         retVal = new XMLCh[1];
  465.         retVal[0] = 0;
  466.     }
  467.     return retVal;
  468. }
  469. XMLCh* Iconv390LCPTranscoder::transcode(const char* const toTranscode,
  470.                                         MemoryManager* const manager)
  471. {
  472.     if (!toTranscode)
  473.         return 0;
  474.     XMLCh* retVal = 0;
  475.     if (*toTranscode)
  476.     {
  477.         const unsigned int len = calcRequiredSize(toTranscode);
  478.         if (len == 0)
  479.         {
  480.             retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1];
  481.             retVal[0] = 0;
  482.             return retVal;
  483.         }
  484.         wchar_t       tmpWideCharArr[gTempBuffArraySize];
  485.         wchar_t*      allocatedArray = 0;
  486.         wchar_t*      wideCharBuf = 0;
  487.         retVal = (XMLCh*) manager->allocate((len + 1) * sizeof(XMLCh));//new XMLCh[len + 1];
  488.         size_t retCode;
  489.         char *tmpInPtr = (char*) toTranscode;
  490.         char *tmpOutPtr = (char*) retVal;
  491.         size_t inByteLeft = len;
  492.         size_t outByteLeft = len*2;
  493.         {
  494.          XMLMutexLock lockConverter(&converter->fMutex);
  495.          retCode = iconv(converter->fIconv390Descriptor, &tmpInPtr, &inByteLeft, &tmpOutPtr, &outByteLeft);
  496.         }
  497.         if (retCode == -1) {
  498.             manager->deallocate(retVal);//delete [] retVal;
  499.             return 0;
  500.         }
  501.         retVal[len] = 0x00;
  502.         manager->deallocate(allocatedArray);//delete [] allocatedArray;
  503.     }
  504.     else
  505.     {
  506.         retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1];
  507.         retVal[0] = 0;
  508.     }
  509.     return retVal;
  510. }
  511. bool Iconv390LCPTranscoder::transcode( const   char* const     toTranscode
  512.                                     ,       XMLCh* const    toFill
  513.                                     , const unsigned int    maxChars)
  514. {
  515.     // Check for a couple of psycho corner cases
  516.     if (!toTranscode || !maxChars)
  517.     {
  518.         toFill[0] = 0;
  519.         return true;
  520.     }
  521.     if (!*toTranscode)
  522.     {
  523.         toFill[0] = 0;
  524.         return true;
  525.     }
  526.     size_t retCode;
  527.     char *tmpInPtr = (char*) toTranscode;
  528.     char *tmpOutPtr = (char*) toFill;
  529.     size_t inByteLeft = maxChars;
  530.     size_t outByteLeft = maxChars*2;
  531.     {
  532.      XMLMutexLock lockConverter(&converter->fMutex);
  533.      retCode = iconv(converter->fIconv390Descriptor, &tmpInPtr, &inByteLeft, &tmpOutPtr, &outByteLeft);
  534.     }
  535.     if ( (retCode == -1) && (outByteLeft!=0) ) {
  536.         return false;
  537.     }
  538.     toFill[maxChars] = 0x00;
  539.     return true;
  540. }
  541. // ---------------------------------------------------------------------------
  542. //  Iconv390LCPTranscoder: Constructors and Destructor
  543. // ---------------------------------------------------------------------------
  544. Iconv390LCPTranscoder::Iconv390LCPTranscoder()
  545. {
  546. }
  547. Iconv390LCPTranscoder::Iconv390LCPTranscoder(iconvconverter_t* const toAdopt) :
  548.         converter (toAdopt)
  549. {
  550. }
  551. Iconv390LCPTranscoder::~Iconv390LCPTranscoder()
  552. {
  553.     removeConverter(converter);
  554.     converter=0;
  555. }
  556. XERCES_CPP_NAMESPACE_END