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