You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by tn...@apache.org on 2003/01/10 19:44:29 UTC

cvs commit: xml-xerces/c/src/xercesc/util/Transcoders/Win32 Win32TransService.cpp

tng         2003/01/10 10:44:29

  Modified:    c/src/xercesc/util/Transcoders/Win32 Win32TransService.cpp
  Log:
  [Bug 13909] Use of non standard mbstowcs feature.
  
  Revision  Changes    Path
  1.6       +63 -44    xml-xerces/c/src/xercesc/util/Transcoders/Win32/Win32TransService.cpp
  
  Index: Win32TransService.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/Transcoders/Win32/Win32TransService.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Win32TransService.cpp	4 Nov 2002 15:14:34 -0000	1.5
  +++ Win32TransService.cpp	10 Jan 2003 18:44:29 -0000	1.6
  @@ -165,16 +165,21 @@
   {
       // Transcode the name to Unicode and store that copy
       const unsigned int srcLen = strlen(encodingName);
  -    const unsigned int targetLen = ::mbstowcs(0, encodingName, srcLen);
  -    fEncodingName = new XMLCh[targetLen + 1];
  -    ::mbstowcs(fEncodingName, encodingName, srcLen);
  -    fEncodingName[targetLen] = 0;
  +    const unsigned charLen = ::mblen(encodingName, MB_CUR_MAX);
  +    if (charLen != -1) {
  +        const unsigned int targetLen = srcLen/charLen;
   
  -    //
  -    //  Upper case it because we are using a hash table and need to be
  -    //  sure that we find all case combinations.
  -    //
  -    _wcsupr(fEncodingName);
  +
  +        fEncodingName = new XMLCh[targetLen + 1];
  +        ::mbstowcs(fEncodingName, encodingName, srcLen);
  +        fEncodingName[targetLen] = 0;
  +
  +        //
  +        //  Upper case it because we are using a hash table and need to be
  +        //  sure that we find all case combinations.
  +        //
  +        _wcsupr(fEncodingName);
  +  }
   }
   
   CPMapEntry::CPMapEntry( const   XMLCh* const    encodingName
  @@ -397,37 +402,42 @@
           if (isAlias(encodingKey, aliasBuf, nameBufSz))
           {
               const unsigned int srcLen = strlen(aliasBuf);
  -            const unsigned int targetLen = ::mbstowcs(0, aliasBuf, srcLen);
  -            XMLCh* uniAlias = new XMLCh[targetLen + 1];
  -            ::mbstowcs(uniAlias, aliasBuf, srcLen);
  -            uniAlias[targetLen] = 0;
  -            _wcsupr(uniAlias);
  -
  -            // Look up the alias name
  -            CPMapEntry* aliasedEntry = fCPMap->get(uniAlias);
  -            if (aliasedEntry)
  -            {
  -                const unsigned int srcLen = strlen(nameBuf);
  -                const unsigned int targetLen = ::mbstowcs(0, nameBuf, srcLen);
  -                XMLCh* uniName = new XMLCh[targetLen + 1];
  -                ::mbstowcs(uniName, nameBuf, srcLen);
  -                uniName[targetLen] = 0;
  -                _wcsupr(uniName);
  -
  -                //
  -                //  If the name is actually different, then take it.
  -                //  Otherwise, don't take it. They map aliases that are
  -                //  just different case.
  -                //
  -                if (::wcscmp(uniName, aliasedEntry->getEncodingName()))
  +            const unsigned charLen = ::mblen(aliasBuf, MB_CUR_MAX);
  +
  +            if (charLen != -1) {
  +                const unsigned int targetLen = srcLen/charLen;
  +
  +                XMLCh* uniAlias = new XMLCh[targetLen + 1];
  +                ::mbstowcs(uniAlias, aliasBuf, srcLen);
  +                uniAlias[targetLen] = 0;
  +                _wcsupr(uniAlias);
  +
  +                // Look up the alias name
  +                CPMapEntry* aliasedEntry = fCPMap->get(uniAlias);
  +                if (aliasedEntry)
                   {
  -                    CPMapEntry* newEntry = new CPMapEntry(uniName, aliasedEntry->getWinCP(), aliasedEntry->getIEEncoding());
  -                    fCPMap->put((void*)newEntry->getEncodingName(), newEntry);
  -                }
  +                    const unsigned int srcLen = strlen(nameBuf);
  +                    const unsigned int targetLen = ::mbstowcs(0, nameBuf, srcLen);
  +                    XMLCh* uniName = new XMLCh[targetLen + 1];
  +                    ::mbstowcs(uniName, nameBuf, srcLen);
  +                    uniName[targetLen] = 0;
  +                    _wcsupr(uniName);
  +
  +                    //
  +                    //  If the name is actually different, then take it.
  +                    //  Otherwise, don't take it. They map aliases that are
  +                    //  just different case.
  +                    //
  +                    if (::wcscmp(uniName, aliasedEntry->getEncodingName()))
  +                    {
  +                        CPMapEntry* newEntry = new CPMapEntry(uniName, aliasedEntry->getWinCP(), aliasedEntry->getIEEncoding());
  +                        fCPMap->put((void*)newEntry->getEncodingName(), newEntry);
  +                    }
   
  -                delete [] uniName;
  +                    delete [] uniName;
  +                }
  +                delete [] uniAlias;
               }
  -            delete [] uniAlias;
           }
   
           // And now close the subkey handle and bump the subkey index
  @@ -822,10 +832,15 @@
       if (!srcText)
           return 0;
   
  -    const unsigned int retVal = ::mbstowcs(0, srcText, 0);
  -    if (retVal == (unsigned int)-1)
  +    unsigned charLen = ::mblen(srcText, MB_CUR_MAX);
  +    if (charLen == -1)
           return 0;
  -    return retVal;
  +    else if (charLen != 0)
  +        charLen = strlen(srcText)/charLen;
  +
  +    if (charLen == -1)
  +        return 0;
  +    return charLen;
   }
   
   
  @@ -879,9 +894,13 @@
       if (*toTranscode)
       {
           // Calculate the buffer size required
  -        const unsigned int neededLen = ::mbstowcs(0, toTranscode, 0);
  -        if (neededLen == (unsigned int)-1)
  -            return 0;
  +        const unsigned int neededLen = calcRequiredSize(toTranscode);
  +        if (neededLen == 0)
  +        {
  +            retVal = new XMLCh[1];
  +            retVal[0] = 0;
  +            return retVal;
  +        }
   
           // Allocate a buffer of that size plus one for the null and transcode
           retVal = new XMLCh[neededLen + 1];
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org