VirtualBox

Changeset 7414 in vbox


Ignore:
Timestamp:
Mar 10, 2008 3:40:15 PM (17 years ago)
Author:
vboxsync
Message:

UCS2->UTF-16

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/string/strformat.cpp

    r7183 r7414  
    4141#include <iprt/assert.h>
    4242#ifdef IN_RING3
    43 #include <iprt/alloc.h>
    44 #include <iprt/err.h>
     43# include <iprt/alloc.h>
     44# include <iprt/err.h>
     45# include <iprt/uni.h>
    4546#endif
    4647#include <iprt/string.h>
     
    6566*******************************************************************************/
    6667static unsigned _strnlen(const char *psz, unsigned cchMax);
    67 static unsigned _strnlenUCS2(PCRTUCS2 pucs, unsigned cchMax);
     68static unsigned _strnlenUtf16(PCRTUTF16 pwsz, unsigned cchMax);
    6869static int rtStrFormatNumber(char *psz, KSIZE64 ullValue, unsigned int uiBase, signed int cchWidth, signed int cchPrecision, unsigned int fFlags);
    6970
     
    8990 * Finds the length of a string up to cchMax.
    9091 * @returns   Length.
    91  * @param     pucs    Pointer to string.
     92 * @param     pwsz    Pointer to string.
    9293 * @param     cchMax  Max length.
    9394 */
    94 static unsigned _strnlenUCS2(PCRTUCS2 pucs, unsigned cchMax)
     95static unsigned _strnlenUtf16(PCRTUTF16 pwsz, unsigned cchMax)
    9596{
    96     PCRTUCS2    pucsC = pucs;
    97 
    98     while (cchMax-- > 0 &&  *pucs != '\0')
    99         pucs++;
    100 
    101     return pucs - pucsC;
     97#ifdef IN_RING3
     98    unsigned cwc = 0;
     99    while (cchMax-- > 0)
     100    {
     101        RTUNICP cp = RTUtf16GetCp(pwsz);
     102        Assert(cp != RTUNICP_INVALID);
     103        if (!cp || cp == RTUNICP_INVALID)
     104            break;
     105    }
     106    return cwc;
     107#else   /* !IN_RING3 */
     108    PCRTUTF16    pwszC = pwsz;
     109
     110    while (cchMax-- > 0 &&  *pwsz != '\0')
     111        pwsz++;
     112
     113    return pwsz - pwszC;
     114#endif  /* !IN_RING3 */
    102115}
    103116
     
    436449
    437450#ifndef IN_RING3
    438                     case 'S':   /* Unicode string as current code page. */
     451                    case 'S':   /* Unicode string as current code page -> Unicode as UTF-8 in GC/R0. */
    439452                        chArgSize = 'l';
    440453                        /* fall thru */
     
    444457                        if (chArgSize == 'l')
    445458                        {
    446                             /* ucs2 -> utf8 */
     459                            /* utf-16 -> utf-8 */
    447460                            int         cchStr;
    448461                            PCRTUTF16   pwszStr = va_arg(args, PRTUTF16);
     
    453466                                pwszStr = s_wszNull;
    454467                            }
    455                             cchStr = _strnlenUCS2(pwszStr, (unsigned)cchPrecision);
     468                            cchStr = _strnlenUtf16(pwszStr, (unsigned)cchPrecision);
    456469                            if (!(fFlags & RTSTR_F_LEFT))
    457470                                while (--cchWidth >= cchStr)
     
    481494                            if (!VALID_PTR(puszStr))
    482495                            {
    483                                 static RTUNICP uszNull[] = {'<', 'N', 'U', 'L', 'L', '>', '\0' };
    484                                 puszStr = uszNull;
     496                                static RTUNICP s_uszNull[] = {'<', 'N', 'U', 'L', 'L', '>', '\0' };
     497                                puszStr = s_uszNull;
    485498                            }
    486499                            cchStr = _strnlenUni(puszStr, (unsigned)cchPrecision);
     
    528541                        if (chArgSize == 'l')
    529542                        {
    530                             int      cchStr;
    531                             PCRTUCS2 pucs2Str = va_arg(args, PRTUCS2);
    532                             if (!VALID_PTR(pucs2Str))
    533                             {
    534                                 static RTUCS2   ucs2Null[] = {'<', 'N', 'U', 'L', 'L', '>', '\0' };
    535                                 pucs2Str = ucs2Null;
    536                             }
    537 
    538                             cchStr = _strnlenUCS2(pucs2Str, (unsigned)cchPrecision);
     543                            /* UTF-16 */
     544                            int       cchStr;
     545                            PCRTUTF16 pwsz2Str = va_arg(args, PRTUTF16);
     546                            if (!VALID_PTR(pwsz2Str))
     547                            {
     548                                static RTUTF16  s_wsz2Null[] = {'<', 'N', 'U', 'L', 'L', '>', '\0' };
     549                                pwsz2Str = s_wsz2Null;
     550                            }
     551
     552                            cchStr = _strnlenUtf16(pwsz2Str, (unsigned)cchPrecision);
    539553                            if (!(fFlags & RTSTR_F_LEFT))
    540554                                while (--cchWidth >= cchStr)
     
    544558                            {
    545559                                /* allocate temporary buffer. */
    546                                 PRTUCS2 pucs2Tmp = (PRTUCS2)RTMemAlloc((cchStr + 1) * sizeof(RTUCS2));
    547                                 memcpy(pucs2Tmp, pucs2Str, cchStr * sizeof(RTUCS2));
    548                                 pucs2Tmp[cchStr] = '\0';
     560                                PRTUTF16 pwsz2Tmp = (PRTUTF16)RTMemTmpAlloc((cchStr + 1) * sizeof(RTUTF16));
     561                                memcpy(pwsz2Tmp, pwsz2Str, cchStr * sizeof(RTUTF16));
     562                                pwsz2Tmp[cchStr] = '\0';
    549563
    550564                                char *pszUtf8;
    551                                 int rc = RTStrUcs2ToUtf8(&pszUtf8, pucs2Tmp);
     565                                int rc = RTUtf16ToUtf8(pwsz2Tmp, &pszUtf8);
    552566                                if (RT_SUCCESS(rc))
    553567                                {
     
    564578                                    while (cchStr-- > 0)
    565579                                        cch += pfnOutput(pvArgOutput, "\x7f", 1);
    566                                 RTMemFree(pucs2Tmp);
     580                                RTMemTmpFree(pwsz2Tmp);
    567581                            }
    568582
     
    572586                        else if (chArgSize == 'L')
    573587                        {
     588                            /* UCS-32 */
    574589                            AssertMsgFailed(("Not implemented yet\n"));
    575590                        }
    576591                        else
    577592                        {
     593                            /* UTF-8 */
    578594                            int   cchStr;
    579                             const char *pszStr = va_arg(args, char*);
     595                            const char *pszStr = va_arg(args, char *);
    580596
    581597                            if (!VALID_PTR(pszStr))
     
    589605                            {
    590606                                /* allocate temporary buffer. */
    591                                 char *pszTmp = (char *)RTMemAlloc(cchStr + 1);
     607                                char *pszTmp = (char *)RTMemTmpAlloc(cchStr + 1);
    592608                                memcpy(pszTmp, pszStr, cchStr);
    593609                                pszTmp[cchStr] = '\0';
     
    603619                                    while (cchStr-- > 0)
    604620                                        cch += pfnOutput(pvArgOutput, "\x7f", 1);
    605                                 RTMemFree(pszTmp);
     621                                RTMemTmpFree(pszTmp);
    606622                            }
    607623
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette