[Libreoffice-commits] core.git: sal/textenc

Stephan Bergmann sbergman at redhat.com
Wed Apr 8 06:33:57 PDT 2015


 sal/textenc/tcvtmb.cxx |  163 +++++++++++++++++++++++++------------------------
 1 file changed, 84 insertions(+), 79 deletions(-)

New commits:
commit d82e94307f1e073a0ccddb506ba5fff3da042b42
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Wed Apr 8 15:30:34 2015 +0200

    tdf#88169: Do not return ..._INFO_SRCBUFFERTOSMALL when ..._FLAGS_FLUSH
    
    ...in accordance with
    <http://www.openoffice.org/udk/cpp/man/spec/textconversion.html>
    
    Change-Id: I62013f89c421722770123db8a5794e63d3572e6b

diff --git a/sal/textenc/tcvtmb.cxx b/sal/textenc/tcvtmb.cxx
index acf02cc..6d0534b 100644
--- a/sal/textenc/tcvtmb.cxx
+++ b/sal/textenc/tcvtmb.cxx
@@ -87,113 +87,118 @@ sal_Size ImplDBCSToUnicode( const void* pData, SAL_UNUSED_PARAMETER void*,
             /* Source buffer to small */
             if ( pSrcBuf +1 == pEndSrcBuf )
             {
-                *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
-                break;
+                if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_FLUSH) == 0 )
+                {
+                    *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
+                    break;
+                }
             }
-
-            pSrcBuf++;
-            cTrail = (unsigned char)*pSrcBuf;
-            if ( (cTrail >= pLeadEntry->mnTrailStart) && (cTrail <= pLeadEntry->mnTrailEnd) )
-                cConv = pLeadEntry->mpToUniTrailTab[cTrail-pLeadEntry->mnTrailStart];
             else
-                cConv = 0;
-
-            if ( !cConv )
             {
-                /* EUDC Ranges */
-                sal_uInt16              i;
-                const ImplDBCSEUDCData* pEUDCTab = pConvertData->mpEUDCTab;
-                for ( i = 0; i < pConvertData->mnEUDCCount; i++ )
+                pSrcBuf++;
+                cTrail = (unsigned char)*pSrcBuf;
+                if ( (cTrail >= pLeadEntry->mnTrailStart) && (cTrail <= pLeadEntry->mnTrailEnd) )
+                    cConv = pLeadEntry->mpToUniTrailTab[cTrail-pLeadEntry->mnTrailStart];
+                else
+                    cConv = 0;
+
+                if ( !cConv )
                 {
-                    if ( (cLead >= pEUDCTab->mnLeadStart) &&
-                         (cLead <= pEUDCTab->mnLeadEnd) )
+                    /* EUDC Ranges */
+                    sal_uInt16              i;
+                    const ImplDBCSEUDCData* pEUDCTab = pConvertData->mpEUDCTab;
+                    for ( i = 0; i < pConvertData->mnEUDCCount; i++ )
                     {
-                        if ( (cTrail >= pEUDCTab->mnTrail1Start) &&
-                             (cTrail <= pEUDCTab->mnTrail1End) )
+                        if ( (cLead >= pEUDCTab->mnLeadStart) &&
+                             (cLead <= pEUDCTab->mnLeadEnd) )
                         {
-                            cConv = pEUDCTab->mnUniStart+
-                                    ((cLead-pEUDCTab->mnLeadStart)*pEUDCTab->mnTrailRangeCount)+
-                                    (cTrail-pEUDCTab->mnTrail1Start);
-                            break;
-                        }
-                        else
-                        {
-                            sal_uInt16 nTrailCount = pEUDCTab->mnTrail1End-pEUDCTab->mnTrail1Start+1;
-                            if ( (pEUDCTab->mnTrailCount >= 2) &&
-                                 (cTrail >= pEUDCTab->mnTrail2Start) &&
-                                 (cTrail <= pEUDCTab->mnTrail2End) )
+                            if ( (cTrail >= pEUDCTab->mnTrail1Start) &&
+                                 (cTrail <= pEUDCTab->mnTrail1End) )
                             {
                                 cConv = pEUDCTab->mnUniStart+
-                                        ((cLead-pEUDCTab->mnLeadStart)*pEUDCTab->mnTrailRangeCount)+
-                                        nTrailCount+
-                                        (cTrail-pEUDCTab->mnTrail2Start);
+                                    ((cLead-pEUDCTab->mnLeadStart)*pEUDCTab->mnTrailRangeCount)+
+                                    (cTrail-pEUDCTab->mnTrail1Start);
                                 break;
                             }
                             else
                             {
-                                nTrailCount = pEUDCTab->mnTrail2End-pEUDCTab->mnTrail2Start+1;
-                                if ( (pEUDCTab->mnTrailCount >= 3) &&
-                                     (cTrail >= pEUDCTab->mnTrail3Start) &&
-                                     (cTrail <= pEUDCTab->mnTrail3End) )
+                                sal_uInt16 nTrailCount = pEUDCTab->mnTrail1End-pEUDCTab->mnTrail1Start+1;
+                                if ( (pEUDCTab->mnTrailCount >= 2) &&
+                                     (cTrail >= pEUDCTab->mnTrail2Start) &&
+                                     (cTrail <= pEUDCTab->mnTrail2End) )
                                 {
                                     cConv = pEUDCTab->mnUniStart+
+                                        ((cLead-pEUDCTab->mnLeadStart)*pEUDCTab->mnTrailRangeCount)+
+                                        nTrailCount+
+                                        (cTrail-pEUDCTab->mnTrail2Start);
+                                    break;
+                                }
+                                else
+                                {
+                                    nTrailCount = pEUDCTab->mnTrail2End-pEUDCTab->mnTrail2Start+1;
+                                    if ( (pEUDCTab->mnTrailCount >= 3) &&
+                                         (cTrail >= pEUDCTab->mnTrail3Start) &&
+                                         (cTrail <= pEUDCTab->mnTrail3End) )
+                                    {
+                                        cConv = pEUDCTab->mnUniStart+
                                             ((cLead-pEUDCTab->mnLeadStart)*pEUDCTab->mnTrailRangeCount)+
                                             nTrailCount+
                                             (cTrail-pEUDCTab->mnTrail3Start);
-                                    break;
+                                        break;
+                                    }
                                 }
                             }
                         }
-                    }
 
-                    pEUDCTab++;
-                }
-
-                if ( !cConv )
-                {
-                    /* We compare the full range of the trail we defined, */
-                    /* which can often be greater than the limit. We do this */
-                    /* so that extensions that don't consider encodings */
-                    /* correctly treat double-byte characters as a single */
-                    /* character as much as possible. */
-
-                    if (cLead < pConvertData->mnLeadStart
-                        || cLead > pConvertData->mnLeadEnd
-                        || cTrail < pConvertData->mnTrailStart
-                        || cTrail > pConvertData->mnTrailEnd)
-                    {
-                        *pInfo |= RTL_TEXTTOUNICODE_INFO_INVALID;
-                        if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) == RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR )
-                        {
-                            *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
-                            break;
-                        }
-                        else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) == RTL_TEXTTOUNICODE_FLAGS_INVALID_IGNORE )
-                        {
-                            pSrcBuf++;
-                            continue;
-                        }
-                        else
-                            cConv = RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER;
+                        pEUDCTab++;
                     }
-                    else
+
+                    if ( !cConv )
                     {
-                        *pInfo |= RTL_TEXTTOUNICODE_INFO_MBUNDEFINED;
-                        if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR )
-                        {
-                            *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
-                            break;
-                        }
-                        else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_IGNORE )
+                        /* We compare the full range of the trail we defined, */
+                        /* which can often be greater than the limit. We do this */
+                        /* so that extensions that don't consider encodings */
+                        /* correctly treat double-byte characters as a single */
+                        /* character as much as possible. */
+
+                        if (cLead < pConvertData->mnLeadStart
+                            || cLead > pConvertData->mnLeadEnd
+                            || cTrail < pConvertData->mnTrailStart
+                            || cTrail > pConvertData->mnTrailEnd)
                         {
-                            pSrcBuf++;
-                            continue;
+                            *pInfo |= RTL_TEXTTOUNICODE_INFO_INVALID;
+                            if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) == RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR )
+                            {
+                                *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
+                                break;
+                            }
+                            else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) == RTL_TEXTTOUNICODE_FLAGS_INVALID_IGNORE )
+                            {
+                                pSrcBuf++;
+                                continue;
+                            }
+                            else
+                                cConv = RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER;
                         }
-                        else
-                            cConv = RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER;
                     }
                 }
             }
+            if ( !cConv )
+            {
+                *pInfo |= RTL_TEXTTOUNICODE_INFO_MBUNDEFINED;
+                if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR )
+                {
+                    *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
+                    break;
+                }
+                else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_IGNORE )
+                {
+                    pSrcBuf++;
+                    continue;
+                }
+                else
+                    cConv = RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER;
+            }
         }
 
         if ( pDestBuf == pEndDestBuf )


More information about the Libreoffice-commits mailing list