From 670ff6a6d2f39754fb9a39b6cd0757b4ffa39136 Mon Sep 17 00:00:00 2001 From: Markus Mohrhard Date: Mon, 27 May 2013 14:59:42 +0200 Subject: we need a reference to the DifParser.aData, fdo#64920 regression from 6191fa0847ac5b27083efe1a8c6cd84d080a638c Change-Id: If7fc18e7d0bcbf1075a0ecdb1c0dcf3d207f1bda --- sc/source/filter/dif/difimp.cxx | 42 ++++++++++++++--------------------------- sc/source/filter/inc/dif.hxx | 2 +- 2 files changed, 15 insertions(+), 29 deletions(-) diff --git a/sc/source/filter/dif/difimp.cxx b/sc/source/filter/dif/difimp.cxx index 734253a6de93..feab9741c1b4 100644 --- a/sc/source/filter/dif/difimp.cxx +++ b/sc/source/filter/dif/difimp.cxx @@ -61,7 +61,7 @@ FltError ScFormatFilterPluginImpl::ScImportDif( SvStream& rIn, ScDocument* pDoc, bool bSyntErrWarn = false; bool bOverflowWarn = false; - OUString aData = aDifParser.aData; + OUString& aData = aDifParser.aData; bool bData = false; rIn.Seek( 0 ); @@ -377,7 +377,7 @@ TOPIC DifParser::GetNextTopic( void ) if( aLine.getLength() > 2 ) aData = aLine.copy( 1, aLine.getLength() - 2 ); else - aData.Erase(); + aData = OUString(); eS = S_END; break; case S_END: @@ -400,20 +400,14 @@ TOPIC DifParser::GetNextTopic( void ) } -static void lcl_DeEscapeQuotesDif( String& rString ) +static void lcl_DeEscapeQuotesDif( OUString& rString ) { // Special handling for DIF import: Escaped (duplicated) quotes are resolved. // Single quote characters are left in place because older versions didn't // escape quotes in strings (and Excel doesn't when using the clipboard). // The quotes around the string are removed before this function is called. - static const sal_Unicode aDQ[] = { '"', '"', 0 }; - xub_StrLen nPos = 0; - while ( (nPos = rString.Search( aDQ, nPos )) != STRING_NOTFOUND ) - { - rString.Erase( nPos, 1 ); - ++nPos; - } + rString = rString.replaceAll("\"\"", "\""); } // Determine if passed in string is numeric data and set fVal/nNumFormat if so @@ -501,9 +495,9 @@ bool DifParser::LookAhead() DATASET DifParser::GetNextDataset( void ) { - DATASET eRet = D_UNKNOWN; - OUString aLine; - const sal_Unicode* pAktBuffer; + DATASET eRet = D_UNKNOWN; + OUString aLine; + const sal_Unicode* pAktBuffer; ReadNextLine( aLine ); @@ -533,18 +527,14 @@ DATASET DifParser::GetNextDataset( void ) ReadNextLine( aTmpLine ); if ( eRet == D_SYNT_ERROR ) { // for broken records write "#ERR: data" to cell - String aTmp( RTL_CONSTASCII_USTRINGPARAM( "#ERR: " )); - aTmp += pAktBuffer; - aTmp.AppendAscii( " (" ); - OSL_ENSURE( aTmpLine.getLength() <= STRING_MAXLEN - aTmp.Len() - 1, "GetNextDataset(): line doesn't fit into data"); - aTmp += aTmpLine; - aTmp += sal_Unicode(')'); - aData = aTmp; + OUStringBuffer aTmp("#ERR: "); + aTmp.append(pAktBuffer).append(" ("); + aTmp.append(aTmpLine).append(')'); + aData = aTmp.makeStringAndClear(); eRet = D_STRING; } else { - OSL_ENSURE( aTmpLine.getLength() <= STRING_MAXLEN, "GetNextDataset(): line doesn't fit into data"); aData = aTmpLine; } } @@ -566,7 +556,6 @@ DATASET DifParser::GetNextDataset( void ) // Single line string if( nLineLength >= 2 && pLine[nLineLength - 1] == '"' ) { - OSL_ENSURE( aLine.getLength() - 2 <= STRING_MAXLEN, "GetNextDataset(): line doesn't fit into data"); aData = aLine.copy( 1, nLineLength - 2 ); lcl_DeEscapeQuotesDif( aData ); eRet = D_STRING; @@ -575,12 +564,11 @@ DATASET DifParser::GetNextDataset( void ) else { // Multiline string - OSL_ENSURE( aLine.getLength() - 1 <= STRING_MAXLEN, "GetNextDataset(): line doesn't fit into data"); aData = aLine.copy( 1 ); bool bContinue = true; while ( bContinue ) { - aData.Append( '\n' ); + aData = aData + "\n"; bContinue = !rIn.IsEof() && ReadNextLine( aLine ); if( bContinue ) { @@ -591,13 +579,11 @@ DATASET DifParser::GetNextDataset( void ) bContinue = !LookAhead(); if( bContinue ) { - OSL_ENSURE( aLine.getLength() <= STRING_MAXLEN - aData.Len(), "GetNextDataset(): line doesn't fit into data"); - aData.Append( aLine ); + aData = aData + aLine; } else if( pLine[nLineLength - 1] == '"' ) { - OSL_ENSURE( nLineLength - 1 <= STRING_MAXLEN - aData.Len(), "GetNextDataset(): line doesn't fit into data"); - aData.Append( pLine, nLineLength - 1 ); + aData = aData + aLine.copy(0, nLineLength -1 ); lcl_DeEscapeQuotesDif( aData ); eRet = D_STRING; } diff --git a/sc/source/filter/inc/dif.hxx b/sc/source/filter/inc/dif.hxx index b9dabff235ed..437c5c754bb6 100644 --- a/sc/source/filter/inc/dif.hxx +++ b/sc/source/filter/inc/dif.hxx @@ -62,7 +62,7 @@ class ScPatternAttr; class DifParser { public: - String aData; + OUString aData; double fVal; sal_uInt32 nVector; sal_uInt32 nVal; -- cgit v1.2.3