You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by jb...@apache.org on 2005/06/01 00:16:50 UTC

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

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
 #
 
-@XERCES_PRETTY_MAKE_TRUE@.SILENT: \
-@XERCES_PRETTY_MAKE_TRUE@				xercesc/util/Transcoders/ICU/libicutc_la-ICUTransService.lo \
-@XERCES_PRETTY_MAKE_TRUE@				xercesc/util/NetAccessors/Curl/libcurlna_la-CurlNetAccessor.lo \
-@XERCES_PRETTY_MAKE_TRUE@				xercesc/util/NetAccessors/Curl/libcurlna_la-CurlURLInputStream.lo \
-@XERCES_PRETTY_MAKE_TRUE@				xercesc/util/NetAccessors/LibWWW/libwwwna_la-LibWWWNetAccessor.lo \
-@XERCES_PRETTY_MAKE_TRUE@				xercesc/util/NetAccessors/LibWWW/libwwwna_la-BinURLInputStream.lo
-
 @XERCES_PRETTY_MAKE_TRUE@.cpp.lo:
 @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: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org