Author: jberry
Date: Tue May 31 15:16:49 2005
New Revision: 179293

URL: http://svn.apache.org/viewcvs?rev=179293&view=rev
Log:
Patch for bug XERCESC-1428. Better transcoding algorithm for iconv translater. 
Thanks to Axel Weiss.

Modified:
    xerces/c/branches/jberry/3.0-unstable/src/Makefile.in
    
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/Transcoders/Iconv/IconvTransService.cpp

Modified: xerces/c/branches/jberry/3.0-unstable/src/Makefile.in
URL: 
http://svn.apache.org/viewcvs/xerces/c/branches/jberry/3.0-unstable/src/Makefile.in?rev=179293&r1=179292&r2=179293&view=diff
==============================================================================
--- xerces/c/branches/jberry/3.0-unstable/src/Makefile.in (original)
+++ xerces/c/branches/jberry/3.0-unstable/src/Makefile.in Tue May 31 15:16:49 
2005
@@ -4647,13 +4647,6 @@
 #          be regenerated from the (new) default output of Automake
 #
 
[EMAIL PROTECTED]@.SILENT: \
[EMAIL PROTECTED]@                              
xercesc/util/Transcoders/ICU/libicutc_la-ICUTransService.lo \
[EMAIL PROTECTED]@                              
xercesc/util/NetAccessors/Curl/libcurlna_la-CurlNetAccessor.lo \
[EMAIL PROTECTED]@                              
xercesc/util/NetAccessors/Curl/libcurlna_la-CurlURLInputStream.lo \
[EMAIL PROTECTED]@                              
xercesc/util/NetAccessors/LibWWW/libwwwna_la-LibWWWNetAccessor.lo \
[EMAIL PROTECTED]@                              
xercesc/util/NetAccessors/LibWWW/libwwwna_la-BinURLInputStream.lo
-
 @[EMAIL PROTECTED]:
 @XERCES_PRETTY_MAKE_TRUE@@am__fastdepCXX_TRUE@ @depbase=`echo $@ | sed 
's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`; \
 @XERCES_PRETTY_MAKE_TRUE@@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD 
-MP -MF "$$depbase.Tpo" -c -o $@ $<; \

Modified: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/Transcoders/Iconv/IconvTransService.cpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/Transcoders/Iconv/IconvTransService.cpp?rev=179293&r1=179292&r2=179293&view=diff
==============================================================================
--- 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/Transcoders/Iconv/IconvTransService.cpp
 (original)
+++ 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/Transcoders/Iconv/IconvTransService.cpp
 Tue May 31 15:16:49 2005
@@ -199,6 +199,7 @@
     return 0;
 }
 
+
 void IconvTransService::upperCase(XMLCh* const toUpperCase) const
 {
     XMLCh* outPtr = toUpperCase;
@@ -209,6 +210,7 @@
     }
 }
 
+
 void IconvTransService::lowerCase(XMLCh* const toLowerCase) const
 {
     XMLCh* outPtr = toLowerCase;
@@ -277,104 +279,56 @@
 }
 
 
-char* IconvLCPTranscoder::transcode(const XMLCh* const toTranscode)
+static void reallocString(char *&ref, size_t &size, MemoryManager* const 
manager, bool release_old)
 {
-    if (!toTranscode)
-        return 0;
+       char *tmp = (char*)manager->allocate(2 * size * sizeof(char));
+       memcpy(tmp, ref, size * sizeof(char));
+       if (release_old) manager->deallocate(ref);
+       ref = tmp;
+       size *= 2;
+}
 
-    char* retVal = 0;
-    if (*toTranscode)
-    {
-        unsigned int  wLent = getWideCharLength(toTranscode);
 
-        wchar_t       tmpWideCharArr[gTempBuffArraySize];
-        wchar_t*      allocatedArray = 0;
-        wchar_t*      wideCharBuf = 0;
-
-        if (wLent >= gTempBuffArraySize)
-            wideCharBuf = allocatedArray = new wchar_t[wLent + 1];
-        else
-            wideCharBuf = tmpWideCharArr;
-
-        for (unsigned int i = 0; i < wLent; i++)
-        {
-            wideCharBuf[i] = toTranscode[i];
-        }
-        wideCharBuf[wLent] = 0x00;
-
-        // Calc the needed size.
-        const size_t neededLen = ::wcstombs(NULL, wideCharBuf, 0);
-        if (neededLen == -1)
-        {
-            delete [] allocatedArray;
-            retVal = new char[1];
-            retVal[0] = 0;
-            return retVal;
-        }
-
-        retVal = new char[neededLen + 1];
-        ::wcstombs(retVal, wideCharBuf, neededLen);
-        retVal[neededLen] = 0;
-        delete [] allocatedArray;
-    }
-    else
-    {
-        retVal = new char[1];
-        retVal[0] = 0;
-    }
-    return retVal;
+char* IconvLCPTranscoder::transcode(const XMLCh* const toTranscode)
+{
+       return transcode(toTranscode, XMLPlatformUtils::fgMemoryManager);
 }
 
+
 char* IconvLCPTranscoder::transcode(const XMLCh* const toTranscode,
                                     MemoryManager* const manager)
 {
     if (!toTranscode)
         return 0;
 
-    char* retVal = 0;
-    if (*toTranscode)
-    {
-        unsigned int  wLent = getWideCharLength(toTranscode);
-
-        wchar_t       tmpWideCharArr[gTempBuffArraySize];
-        wchar_t*      allocatedArray = 0;
-        wchar_t*      wideCharBuf = 0;
+       size_t resultSize = gTempBuffArraySize;
+       size_t srcCursor = 0, dstCursor = 0;
+       char localBuffer[gTempBuffArraySize];
+       char* resultString = localBuffer;
+
+       while (toTranscode[srcCursor])
+       {
+               char mbBuf[MB_CUR_MAX];
+               int len = wctomb(mbBuf, toTranscode[srcCursor++]), j;
+               if (len < 0)
+               {
+                       dstCursor = 0;
+                       break;
+               }
+               if (dstCursor + len >= resultSize - 1)
+                       reallocString(resultString, resultSize, manager, 
resultString != localBuffer);
+               for (j=0; j<len; ++j)
+                       resultString[dstCursor++] = mbBuf[j];
+       }
+
+       if (resultString == localBuffer)
+       {
+               resultString = (char*)manager->allocate((dstCursor + 1) * 
sizeof(char));
+               memcpy(resultString, localBuffer, dstCursor * sizeof(char));
+       }
 
-        if (wLent >= gTempBuffArraySize)
-            wideCharBuf = allocatedArray = (wchar_t*) manager->allocate
-            (
-                (wLent + 1) * sizeof(wchar_t)
-            );//new wchar_t[wLent + 1];
-        else
-            wideCharBuf = tmpWideCharArr;
-
-        for (unsigned int i = 0; i < wLent; i++)
-        {
-            wideCharBuf[i] = toTranscode[i];
-        }
-        wideCharBuf[wLent] = 0x00;
-
-        // Calc the needed size.
-        const size_t neededLen = ::wcstombs(NULL, wideCharBuf, 0);
-        if (neededLen == -1)
-        {
-            manager->deallocate(allocatedArray);//delete [] allocatedArray;
-            retVal = (char*) manager->allocate(sizeof(char)); //new char[1];
-            retVal[0] = 0;
-            return retVal;
-        }
-
-        retVal = (char*) manager->allocate((neededLen + 1) * 
sizeof(char));//new char[neededLen + 1];
-        ::wcstombs(retVal, wideCharBuf, neededLen);
-        retVal[neededLen] = 0;
-        manager->deallocate(allocatedArray);//delete [] allocatedArray;
-    }
-    else
-    {
-        retVal = (char*) manager->allocate(sizeof(char));//new char[1];
-        retVal[0] = 0;
-    }
-    return retVal;
+       resultString[dstCursor] = '\0';
+       return resultString;
 }
 
 
@@ -439,44 +393,16 @@
 
 XMLCh* IconvLCPTranscoder::transcode(const char* const toTranscode)
 {
-    if (!toTranscode)
-        return 0;
+       return transcode(toTranscode, XMLPlatformUtils::fgMemoryManager);
+}
 
-    XMLCh* retVal = 0;
-    if (*toTranscode)
-    {
-        const unsigned int len = calcRequiredSize(toTranscode);
-        if (len == 0)
-        {
-            retVal = new XMLCh[1];
-            retVal[0] = 0;
-            return retVal;
-        }
-
-        wchar_t       tmpWideCharArr[gTempBuffArraySize];
-        wchar_t*      allocatedArray = 0;
-        wchar_t*      wideCharBuf = 0;
-
-        if (len >= gTempBuffArraySize)
-            wideCharBuf = allocatedArray = new wchar_t[len + 1];
-        else
-            wideCharBuf = tmpWideCharArr;
-
-        ::mbstowcs(wideCharBuf, toTranscode, len);
-        retVal = new XMLCh[len + 1];
-        for (unsigned int i = 0; i < len; i++)
-        {
-            retVal[i] = (XMLCh) wideCharBuf[i];
-        }
-        retVal[len] = 0x00;
-        delete [] allocatedArray;
-    }
-    else
-    {
-        retVal = new XMLCh[1];
-        retVal[0] = 0;
-    }
-    return retVal;
+static void reallocXMLString(XMLCh *&ref, size_t &size, MemoryManager* const 
manager, bool release_old)
+{
+       XMLCh *tmp = (XMLCh*)manager->allocate(2 * size * sizeof(XMLCh));
+       memcpy(tmp, ref, size * sizeof(XMLCh));
+       if (release_old) manager->deallocate(ref);
+       ref = tmp;
+       size *= 2;
 }
 
 XMLCh* IconvLCPTranscoder::transcode(const char* const toTranscode,
@@ -484,45 +410,35 @@
 {
     if (!toTranscode)
         return 0;
+       XMLCh localBuffer[gTempBuffArraySize];
+       XMLCh* resultString = localBuffer;
+       size_t resultSize = gTempBuffArraySize;
+       size_t srcCursor = 0, dstCursor = 0, srcLen = strlen(toTranscode);
+
+       for ( ;; )
+       {
+               wchar_t wcBuf[1];
+               int len = mbtowc(wcBuf, toTranscode + srcCursor, srcLen - 
srcCursor);
+               if (len <= 0)
+               {
+                       if (len < 0)
+                               dstCursor = 0;
+                       break;
+               }
+               srcCursor += len;
+               if (dstCursor + 1 >= resultSize - 1)
+                       reallocXMLString(resultString, resultSize, manager, 
resultString != localBuffer);
+               resultString[dstCursor++] = wcBuf[0];
+       }
+
+       if (resultString == localBuffer)
+       {
+               resultString = (XMLCh*)manager->allocate((dstCursor + 1) * 
sizeof(XMLCh));
+               memcpy(resultString, localBuffer, dstCursor * sizeof(XMLCh));
+       }
 
-    XMLCh* retVal = 0;
-    if (*toTranscode)
-    {
-        const unsigned int len = calcRequiredSize(toTranscode, manager);
-        if (len == 0)
-        {
-            retVal = (XMLCh*) manager->allocate(sizeof(XMLCh)); //new XMLCh[1];
-            retVal[0] = 0;
-            return retVal;
-        }
-
-        wchar_t       tmpWideCharArr[gTempBuffArraySize];
-        wchar_t*      allocatedArray = 0;
-        wchar_t*      wideCharBuf = 0;
-
-        if (len >= gTempBuffArraySize)
-            wideCharBuf = allocatedArray = (wchar_t*) manager->allocate
-            (
-                (len + 1) * sizeof(wchar_t)
-            );//new wchar_t[len + 1];
-        else
-            wideCharBuf = tmpWideCharArr;
-
-        ::mbstowcs(wideCharBuf, toTranscode, len);
-        retVal = (XMLCh*) manager->allocate((len + 1) *sizeof(XMLCh));//new 
XMLCh[len + 1];
-        for (unsigned int i = 0; i < len; i++)
-        {
-            retVal[i] = (XMLCh) wideCharBuf[i];
-        }
-        retVal[len] = 0x00;
-        manager->deallocate(allocatedArray);//delete [] allocatedArray;
-    }
-    else
-    {
-        retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1];
-        retVal[0] = 0;
-    }
-    return retVal;
+       resultString[dstCursor] = L'\0';
+       return resultString;
 }
 
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to