On 01/17/2012 11:06 AM, Chr. Rossmanith wrote:
an excursion from vcl to unotools was necessary. Could someone please
review this little patch? xub_StrLen is replaced as well with sal_Int32.

Two things about the patch:

-void ConvertChar::RecodeString( String& rStr, xub_StrLen nIndex, xub_StrLen 
nLen ) const
+void ConvertChar::RecodeString( rtl::OUString& rStr, sal_Int32 nIndex, 
sal_Int32 nLen ) const
 {
-    sal_uLong nLastIndex = (sal_uLong)nIndex + nLen;
-    if( nLastIndex > rStr.Len() )
-        nLastIndex = rStr.Len();
+    sal_Int32 nLastIndex = nIndex + nLen;
+    if( nLastIndex > rStr.getLength() )
+        nLastIndex = rStr.getLength();

The original nIndex, nLen were 16 bit, so their sum was guaranteed to fit into 32 bit sal_uLong. There is no such guarantee with the new nIndex, nLen of 32 bit. But looking around, the only call of RecodeString is

  mpFontEntry->mpConversion->RecodeString( aStr, 0, aStr.Len() );

in vcl/source/gdi/outdev3.cxx. So this can all go away, changing the signature of RecodeString to

  rtl::OUString RecodeString(rtl::OUString const &)

and adapting the single call side accordingly (also getting rid of the in-out parameter).

     for(; nIndex < nLastIndex; ++nIndex )
     {
-        sal_Unicode cOrig = rStr.GetChar( nIndex );
+        sal_Unicode cOrig = rStr[nIndex];
         // only recode symbols and their U+00xx aliases
         if( ((cOrig < 0x0020) || (cOrig > 0x00FF))
         &&  ((cOrig < 0xF020) || (cOrig > 0xF0FF)) )
@@ -1390,8 +1391,12 @@ void ConvertChar::RecodeString( String& rStr, xub_StrLen 
nIndex, xub_StrLen nLen

         // recode a symbol
         sal_Unicode cNew = RecodeChar( cOrig );
-        if( cOrig != cNew )
-            rStr.SetChar( nIndex, cNew );
+        if( cOrig != cNew ) {
+            //            rStr[nIndex] = cNew;
+            rtl::OUStringBuffer aTmpStr(rStr.getStr());
+            aTmpStr[nIndex] = cNew;
+            rStr = aTmpStr.makeStringAndClear();
+        }

Constructing a temporary OUStringBuffer for each character that needs conversion smells somewhat inefficient. An alternative is to put the original rStr into an OUStringBuffer once and iterate over that one.

Stephan
_______________________________________________
LibreOffice mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to