loplugin:useuniqueptr in LocaleDataWrapper

just use OUStringBuffer here, and consequently avoid re-implementing
such string-buffer handling code

Change-Id: I61e39dada6f46478b9d289f0310bb6846eb9868b
Reviewed-on: https://gerrit.libreoffice.org/62646
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
This commit is contained in:
Noel Grandin
2018-10-29 12:11:23 +02:00
parent 9bd60e28d8
commit d9013f6a39
2 changed files with 168 additions and 253 deletions

View File

@@ -119,7 +119,7 @@ class UNOTOOLS_DLLPUBLIC LocaleDataWrapper
void getDefaultCalendarImpl();
void getSecondaryCalendarImpl();
sal_Unicode* ImplAddFormatNum( sal_Unicode* pBuf,
void ImplAddFormatNum( rtl::OUStringBuffer& rBuf,
sal_Int64 nNumber, sal_uInt16 nDecimals,
bool bUseThousandSep, bool bTrailingZeros ) const;

View File

@@ -1119,7 +1119,7 @@ const css::uno::Sequence< sal_Int32 > LocaleDataWrapper::getDigitGrouping() cons
// The ImplAdd... methods are taken from class International and modified to
// suit the needs.
static sal_Unicode* ImplAddUNum( sal_Unicode* pBuf, sal_uInt64 nNumber )
static void ImplAddUNum( OUStringBuffer& rBuf, sal_uInt64 nNumber )
{
// fill temp buffer with digits
sal_Unicode aTempBuf[64];
@@ -1136,15 +1136,12 @@ static sal_Unicode* ImplAddUNum( sal_Unicode* pBuf, sal_uInt64 nNumber )
do
{
pTempBuf--;
*pBuf = *pTempBuf;
pBuf++;
rBuf.append(*pTempBuf);
}
while ( pTempBuf != aTempBuf );
return pBuf;
}
static sal_Unicode* ImplAddUNum( sal_Unicode* pBuf, sal_uInt64 nNumber, int nMinLen )
static void ImplAddUNum( OUStringBuffer& rBuf, sal_uInt64 nNumber, int nMinLen )
{
// fill temp buffer with digits
sal_Unicode aTempBuf[64];
@@ -1161,8 +1158,7 @@ static sal_Unicode* ImplAddUNum( sal_Unicode* pBuf, sal_uInt64 nNumber, int nMin
// fill with zeros up to the minimal length
while ( nMinLen > 0 )
{
*pBuf = '0';
pBuf++;
rBuf.append('0');
nMinLen--;
}
@@ -1170,25 +1166,22 @@ static sal_Unicode* ImplAddUNum( sal_Unicode* pBuf, sal_uInt64 nNumber, int nMin
do
{
pTempBuf--;
*pBuf = *pTempBuf;
pBuf++;
rBuf.append(*pTempBuf);
}
while ( pTempBuf != aTempBuf );
return pBuf;
}
static sal_Unicode* ImplAddNum( sal_Unicode* pBuf, sal_Int64 nNumber, int nMinLen )
static void ImplAddNum( OUStringBuffer& rBuf, sal_Int64 nNumber, int nMinLen )
{
if (nNumber < 0)
{
*pBuf++ = '-';
rBuf.append('-');
nNumber = -nNumber;
}
return ImplAddUNum( pBuf, nNumber, nMinLen);
return ImplAddUNum( rBuf, nNumber, nMinLen);
}
static sal_Unicode* ImplAdd2UNum( sal_Unicode* pBuf, sal_uInt16 nNumber, bool bLeading )
static void ImplAdd2UNum( OUStringBuffer& rBuf, sal_uInt16 nNumber, bool bLeading )
{
DBG_ASSERT( nNumber < 100, "ImplAdd2UNum() - Number >= 100" );
@@ -1196,25 +1189,20 @@ static sal_Unicode* ImplAdd2UNum( sal_Unicode* pBuf, sal_uInt16 nNumber, bool bL
{
if ( bLeading )
{
*pBuf = '0';
pBuf++;
rBuf.append('0');
}
*pBuf = nNumber + '0';
rBuf.append(static_cast<char>(nNumber + '0'));
}
else
{
sal_uInt16 nTemp = nNumber % 10;
nNumber /= 10;
*pBuf = nNumber + '0';
pBuf++;
*pBuf = nTemp + '0';
rBuf.append(static_cast<char>(nNumber + '0'));
rBuf.append(static_cast<char>(nTemp + '0'));
}
pBuf++;
return pBuf;
}
static sal_Unicode* ImplAdd9UNum( sal_Unicode* pBuf, sal_uInt32 nNumber )
static void ImplAdd9UNum( OUStringBuffer& rBuf, sal_uInt32 nNumber )
{
DBG_ASSERT( nNumber < 1000000000, "ImplAdd9UNum() - Number >= 1000000000" );
@@ -1223,99 +1211,55 @@ static sal_Unicode* ImplAdd9UNum( sal_Unicode* pBuf, sal_uInt32 nNumber )
ostr.width(9);
ostr << nNumber;
std::string aStr = ostr.str();
for(const char *pAB= aStr.c_str(); *pAB != '\0'; ++pAB, ++pBuf)
{
*pBuf = *pAB;
}
return pBuf;
rBuf.appendAscii(aStr.c_str(), aStr.size());
}
static sal_Unicode* ImplAddString( sal_Unicode* pBuf, const OUString& rStr )
{
if ( rStr.getLength() == 1 )
*pBuf++ = rStr[0];
else if (rStr.isEmpty())
;
else
{
memcpy( pBuf, rStr.getStr(), rStr.getLength() * sizeof(sal_Unicode) );
pBuf += rStr.getLength();
}
return pBuf;
}
static sal_Unicode* ImplAddString( sal_Unicode* pBuf, sal_Unicode c )
{
*pBuf = c;
pBuf++;
return pBuf;
}
static sal_Unicode* ImplAddString( sal_Unicode* pBuf, const sal_Unicode* pCopyBuf, sal_Int32 nLen )
{
memcpy( pBuf, pCopyBuf, nLen * sizeof(sal_Unicode) );
return pBuf + nLen;
}
sal_Unicode* LocaleDataWrapper::ImplAddFormatNum( sal_Unicode* pBuf,
void LocaleDataWrapper::ImplAddFormatNum( OUStringBuffer& rBuf,
sal_Int64 nNumber, sal_uInt16 nDecimals, bool bUseThousandSep,
bool bTrailingZeros ) const
{
sal_Unicode aNumBuf[64];
sal_Unicode* pNumBuf;
OUStringBuffer aNumBuf(64);
sal_uInt16 nNumLen;
sal_uInt16 i = 0;
// negative number
if ( nNumber < 0 )
{
nNumber *= -1;
*pBuf = '-';
pBuf++;
rBuf.append('-');
}
// convert number
pNumBuf = ImplAddUNum( aNumBuf, static_cast<sal_uInt64>(nNumber) );
nNumLen = static_cast<sal_uInt16>(static_cast<sal_uLong>(pNumBuf-aNumBuf));
pNumBuf = aNumBuf;
ImplAddUNum( aNumBuf, static_cast<sal_uInt64>(nNumber) );
nNumLen = static_cast<sal_uInt16>(aNumBuf.getLength());
if ( nNumLen <= nDecimals )
{
// strip .0 in decimals?
if ( !nNumber && !bTrailingZeros )
{
*pBuf = '0';
pBuf++;
rBuf.append('0');
}
else
{
// LeadingZero, insert 0
if ( isNumLeadingZero() )
{
*pBuf = '0';
pBuf++;
rBuf.append('0');
}
// append decimal separator
pBuf = ImplAddString( pBuf, getNumDecimalSep() );
rBuf.append( getNumDecimalSep() );
// fill with zeros
sal_uInt16 i = 0;
while ( i < (nDecimals-nNumLen) )
{
*pBuf = '0';
pBuf++;
rBuf.append('0');
i++;
}
// append decimals
while ( nNumLen )
{
*pBuf = *pNumBuf;
pBuf++;
pNumBuf++;
nNumLen--;
}
rBuf.append(aNumBuf);
}
}
else
@@ -1328,41 +1272,36 @@ sal_Unicode* LocaleDataWrapper::ImplAddFormatNum( sal_Unicode* pBuf,
if (bUseThousandSep)
aGroupPos = utl::DigitGroupingIterator::createForwardSequence(
nNumLen2, getDigitGrouping());
sal_uInt16 i = 0;
for (; i < nNumLen2; ++i )
{
*pBuf = *pNumBuf;
pBuf++;
pNumBuf++;
rBuf.append(aNumBuf[i]);
// add thousand separator?
if ( bUseThousandSep && aGroupPos[i] )
pBuf = ImplAddString( pBuf, rThoSep );
rBuf.append( rThoSep );
}
// append decimals
if ( nDecimals )
{
pBuf = ImplAddString( pBuf, getNumDecimalSep() );
rBuf.append( getNumDecimalSep() );
bool bNullEnd = true;
while ( i < nNumLen )
{
if ( *pNumBuf != '0' )
if ( aNumBuf[i] != '0' )
bNullEnd = false;
*pBuf = *pNumBuf;
pBuf++;
pNumBuf++;
rBuf.append(aNumBuf[i]);
i++;
}
// strip .0 in decimals?
if ( bNullEnd && !bTrailingZeros )
pBuf -= nDecimals+1;
rBuf.setLength( rBuf.getLength() - (nDecimals + 1) );
}
}
return pBuf;
}
// --- simple date and time formatting --------------------------------
@@ -1371,8 +1310,7 @@ OUString LocaleDataWrapper::getDate( const Date& rDate ) const
{
::utl::ReadWriteGuard aGuard( aMutex, ReadWriteGuardMode::BlockCritical );
//!TODO: leading zeros et al
sal_Unicode aBuf[128];
sal_Unicode* pBuf = aBuf;
OUStringBuffer aBuf(128);
sal_uInt16 nDay = rDate.GetDay();
sal_uInt16 nMonth = rDate.GetMonth();
sal_Int16 nYear = rDate.GetYear();
@@ -1389,128 +1327,125 @@ OUString LocaleDataWrapper::getDate( const Date& rDate ) const
switch ( getDateOrder() )
{
case DateOrder::DMY :
pBuf = ImplAdd2UNum( pBuf, nDay, true /* IsDateDayLeadingZero() */ );
pBuf = ImplAddString( pBuf, getDateSep() );
pBuf = ImplAdd2UNum( pBuf, nMonth, true /* IsDateMonthLeadingZero() */ );
pBuf = ImplAddString( pBuf, getDateSep() );
pBuf = ImplAddNum( pBuf, nYear, nYearLen );
ImplAdd2UNum( aBuf, nDay, true /* IsDateDayLeadingZero() */ );
aBuf.append( getDateSep() );
ImplAdd2UNum( aBuf, nMonth, true /* IsDateMonthLeadingZero() */ );
aBuf.append( getDateSep() );
ImplAddNum( aBuf, nYear, nYearLen );
break;
case DateOrder::MDY :
pBuf = ImplAdd2UNum( pBuf, nMonth, true /* IsDateMonthLeadingZero() */ );
pBuf = ImplAddString( pBuf, getDateSep() );
pBuf = ImplAdd2UNum( pBuf, nDay, true /* IsDateDayLeadingZero() */ );
pBuf = ImplAddString( pBuf, getDateSep() );
pBuf = ImplAddNum( pBuf, nYear, nYearLen );
ImplAdd2UNum( aBuf, nMonth, true /* IsDateMonthLeadingZero() */ );
aBuf.append( getDateSep() );
ImplAdd2UNum( aBuf, nDay, true /* IsDateDayLeadingZero() */ );
aBuf.append( getDateSep() );
ImplAddNum( aBuf, nYear, nYearLen );
break;
default:
pBuf = ImplAddNum( pBuf, nYear, nYearLen );
pBuf = ImplAddString( pBuf, getDateSep() );
pBuf = ImplAdd2UNum( pBuf, nMonth, true /* IsDateMonthLeadingZero() */ );
pBuf = ImplAddString( pBuf, getDateSep() );
pBuf = ImplAdd2UNum( pBuf, nDay, true /* IsDateDayLeadingZero() */ );
ImplAddNum( aBuf, nYear, nYearLen );
aBuf.append( getDateSep() );
ImplAdd2UNum( aBuf, nMonth, true /* IsDateMonthLeadingZero() */ );
aBuf.append( getDateSep() );
ImplAdd2UNum( aBuf, nDay, true /* IsDateDayLeadingZero() */ );
}
return OUString(aBuf, pBuf-aBuf);
return aBuf.makeStringAndClear();
}
OUString LocaleDataWrapper::getTime( const tools::Time& rTime, bool bSec, bool b100Sec ) const
{
::utl::ReadWriteGuard aGuard( aMutex, ReadWriteGuardMode::BlockCritical );
//!TODO: leading zeros et al
sal_Unicode aBuf[128];
sal_Unicode* pBuf = aBuf;
OUStringBuffer aBuf(128);
sal_uInt16 nHour = rTime.GetHour();
nHour %= 24;
pBuf = ImplAdd2UNum( pBuf, nHour, true /* IsTimeLeadingZero() */ );
pBuf = ImplAddString( pBuf, getTimeSep() );
pBuf = ImplAdd2UNum( pBuf, rTime.GetMin(), true );
ImplAdd2UNum( aBuf, nHour, true /* IsTimeLeadingZero() */ );
aBuf.append( getTimeSep() );
ImplAdd2UNum( aBuf, rTime.GetMin(), true );
if ( bSec )
{
pBuf = ImplAddString( pBuf, getTimeSep() );
pBuf = ImplAdd2UNum( pBuf, rTime.GetSec(), true );
aBuf.append( getTimeSep() );
ImplAdd2UNum( aBuf, rTime.GetSec(), true );
if ( b100Sec )
{
pBuf = ImplAddString( pBuf, getTime100SecSep() );
pBuf = ImplAdd9UNum( pBuf, rTime.GetNanoSec() );
aBuf.append( getTime100SecSep() );
ImplAdd9UNum( aBuf, rTime.GetNanoSec() );
}
}
return OUString(aBuf, pBuf - aBuf);
return aBuf.makeStringAndClear();
}
OUString LocaleDataWrapper::getLongDate( const Date& rDate, CalendarWrapper& rCal,
bool bTwoDigitYear ) const
{
::utl::ReadWriteGuard aGuard( aMutex, ReadWriteGuardMode::BlockCritical );
sal_Unicode aBuf[20];
sal_Unicode* pBuf;
OUString aStr;
OUStringBuffer aBuf(20);
OUStringBuffer aStr(120); // complete guess
sal_Int16 nVal;
rCal.setGregorianDateTime( rDate );
// day of week
nVal = rCal.getValue( CalendarFieldIndex::DAY_OF_WEEK );
aStr += rCal.getDisplayName( CalendarDisplayIndex::DAY, nVal, 1 );
aStr += getLongDateDayOfWeekSep();
aStr.append(rCal.getDisplayName( CalendarDisplayIndex::DAY, nVal, 1 ));
aStr.append(getLongDateDayOfWeekSep());
// day of month
nVal = rCal.getValue( CalendarFieldIndex::DAY_OF_MONTH );
pBuf = ImplAdd2UNum( aBuf, nVal, false/*bDayOfMonthWithLeadingZero*/ );
OUString aDay(aBuf, pBuf-aBuf);
ImplAdd2UNum( aBuf, nVal, false/*bDayOfMonthWithLeadingZero*/ );
OUString aDay = aBuf.makeStringAndClear();
// month of year
nVal = rCal.getValue( CalendarFieldIndex::MONTH );
OUString aMonth( rCal.getDisplayName( CalendarDisplayIndex::MONTH, nVal, 1 ) );
// year
nVal = rCal.getValue( CalendarFieldIndex::YEAR );
if ( bTwoDigitYear )
pBuf = ImplAddUNum( aBuf, nVal % 100, 2 );
ImplAddUNum( aBuf, nVal % 100, 2 );
else
pBuf = ImplAddUNum( aBuf, nVal );
OUString aYear(aBuf, pBuf-aBuf);
ImplAddUNum( aBuf, nVal );
OUString aYear = aBuf.makeStringAndClear();
// concatenate
switch ( getLongDateOrder() )
{
case DateOrder::DMY :
aStr += aDay + getLongDateDaySep() + aMonth + getLongDateMonthSep() + aYear;
aStr.append(aDay).append(getLongDateDaySep()).append(aMonth).append(getLongDateMonthSep()).append(aYear);
break;
case DateOrder::MDY :
aStr += aMonth + getLongDateMonthSep() + aDay + getLongDateDaySep() + aYear;
aStr.append(aMonth).append(getLongDateMonthSep()).append(aDay).append(getLongDateDaySep()).append(aYear);
break;
default: // YMD
aStr += aYear + getLongDateYearSep() + aMonth + getLongDateMonthSep() + aDay;
aStr.append(aYear).append(getLongDateYearSep()).append(aMonth).append(getLongDateMonthSep()).append(aDay);
}
return aStr;
return aStr.makeStringAndClear();
}
OUString LocaleDataWrapper::getDuration( const tools::Time& rTime, bool bSec, bool b100Sec ) const
{
::utl::ReadWriteGuard aGuard( aMutex, ReadWriteGuardMode::BlockCritical );
sal_Unicode aBuf[128];
sal_Unicode* pBuf = aBuf;
OUStringBuffer aBuf(128);
if ( rTime < tools::Time( 0 ) )
pBuf = ImplAddString( pBuf, ' ' );
aBuf.append(' ' );
if ( (true) /* IsTimeLeadingZero() */ )
pBuf = ImplAddUNum( pBuf, rTime.GetHour(), 2 );
ImplAddUNum( aBuf, rTime.GetHour(), 2 );
else
pBuf = ImplAddUNum( pBuf, rTime.GetHour() );
pBuf = ImplAddString( pBuf, getTimeSep() );
pBuf = ImplAdd2UNum( pBuf, rTime.GetMin(), true );
ImplAddUNum( aBuf, rTime.GetHour() );
aBuf.append( getTimeSep() );
ImplAdd2UNum( aBuf, rTime.GetMin(), true );
if ( bSec )
{
pBuf = ImplAddString( pBuf, getTimeSep() );
pBuf = ImplAdd2UNum( pBuf, rTime.GetSec(), true );
aBuf.append( getTimeSep() );
ImplAdd2UNum( aBuf, rTime.GetSec(), true );
if ( b100Sec )
{
pBuf = ImplAddString( pBuf, getTime100SecSep() );
pBuf = ImplAdd9UNum( pBuf, rTime.GetNanoSec() );
aBuf.append( getTime100SecSep() );
ImplAdd9UNum( aBuf, rTime.GetNanoSec() );
}
}
return OUString(aBuf, pBuf-aBuf);
return aBuf.makeStringAndClear();
}
// --- simple number formatting ---------------------------------------
@@ -1530,38 +1465,26 @@ OUString LocaleDataWrapper::getNum( sal_Int64 nNumber, sal_uInt16 nDecimals,
bool bUseThousandSep, bool bTrailingZeros ) const
{
::utl::ReadWriteGuard aGuard( aMutex, ReadWriteGuardMode::BlockCritical );
sal_Unicode aBuf[128]; // big enough for 64-bit long and crazy grouping
// check if digits and separators will fit into fixed buffer or allocate
size_t nGuess = ImplGetNumberStringLengthGuess( *this, nDecimals );
sal_Unicode* const pBuffer = (nGuess < 118 ? aBuf :
new sal_Unicode[nGuess + 16]);
OUStringBuffer aBuf(int(nGuess + 16));
sal_Unicode* pBuf = ImplAddFormatNum( pBuffer, nNumber, nDecimals,
ImplAddFormatNum( aBuf, nNumber, nDecimals,
bUseThousandSep, bTrailingZeros );
OUString aStr(pBuffer, pBuf-pBuffer);
if ( pBuffer != aBuf )
delete [] pBuffer;
return aStr;
return aBuf.makeStringAndClear();
}
OUString LocaleDataWrapper::getCurr( sal_Int64 nNumber, sal_uInt16 nDecimals,
const OUString& rCurrencySymbol, bool bUseThousandSep ) const
{
::utl::ReadWriteGuard aGuard( aMutex, ReadWriteGuardMode::BlockCritical );
sal_Unicode aBuf[192];
sal_Unicode aNumBuf[128]; // big enough for 64-bit long and crazy grouping
sal_Unicode cZeroChar = getCurrZeroChar();
// check if digits and separators will fit into fixed buffer or allocate
size_t nGuess = ImplGetNumberStringLengthGuess( *this, nDecimals );
sal_Unicode* const pNumBuffer = (nGuess < 118 ? aNumBuf :
new sal_Unicode[nGuess + 16]);
sal_Unicode* const pBuffer =
((size_t(rCurrencySymbol.getLength()) + nGuess + 20) < SAL_N_ELEMENTS(aBuf) ? aBuf :
new sal_Unicode[ rCurrencySymbol.getLength() + nGuess + 20 ]);
sal_Unicode* pBuf = pBuffer;
OUStringBuffer aNumBuf(int(nGuess + 16));
OUStringBuffer aBuf(int(rCurrencySymbol.getLength() + nGuess + 20 ));
bool bNeg;
if ( nNumber < 0 )
@@ -1573,40 +1496,39 @@ OUString LocaleDataWrapper::getCurr( sal_Int64 nNumber, sal_uInt16 nDecimals,
bNeg = false;
// convert number
sal_Unicode* pEndNumBuf = ImplAddFormatNum( pNumBuffer, nNumber, nDecimals,
ImplAddFormatNum( aNumBuf, nNumber, nDecimals,
bUseThousandSep, true );
sal_Int32 nNumLen = static_cast<sal_Int32>(static_cast<sal_uLong>(pEndNumBuf-pNumBuffer));
const sal_Int32 nNumLen = aNumBuf.getLength();
// replace zeros with zero character
if ( (cZeroChar != '0') && nDecimals /* && IsNumTrailingZeros() */ )
{
sal_Unicode* pTempBuf;
sal_uInt16 i;
bool bZero = true;
pTempBuf = pNumBuffer+nNumLen-nDecimals;
sal_uInt16 nNumBufIndex = nNumLen-nDecimals;
i = 0;
do
{
if ( *pTempBuf != '0' )
if ( aNumBuf[nNumBufIndex] != '0' )
{
bZero = false;
break;
}
pTempBuf++;
nNumBufIndex++;
i++;
}
while ( i < nDecimals );
if ( bZero )
{
pTempBuf = pNumBuffer+nNumLen-nDecimals;
nNumBufIndex = nNumLen-nDecimals;
i = 0;
do
{
*pTempBuf = cZeroChar;
pTempBuf++;
aNumBuf[nNumBufIndex] = cZeroChar;
nNumBufIndex++;
i++;
}
while ( i < nDecimals );
@@ -1618,22 +1540,22 @@ OUString LocaleDataWrapper::getCurr( sal_Int64 nNumber, sal_uInt16 nDecimals,
switch( getCurrPositiveFormat() )
{
case 0:
pBuf = ImplAddString( pBuf, rCurrencySymbol );
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
aBuf.append( rCurrencySymbol );
aBuf.append( aNumBuf );
break;
case 1:
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
pBuf = ImplAddString( pBuf, rCurrencySymbol );
aBuf.append( aNumBuf );
aBuf.append( rCurrencySymbol );
break;
case 2:
pBuf = ImplAddString( pBuf, rCurrencySymbol );
pBuf = ImplAddString( pBuf, ' ' );
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
aBuf.append( rCurrencySymbol );
aBuf.append( ' ' );
aBuf.append( aNumBuf );
break;
case 3:
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
pBuf = ImplAddString( pBuf, ' ' );
pBuf = ImplAddString( pBuf, rCurrencySymbol );
aBuf.append( aNumBuf );
aBuf.append( ' ' );
aBuf.append( rCurrencySymbol );
break;
}
}
@@ -1642,108 +1564,101 @@ OUString LocaleDataWrapper::getCurr( sal_Int64 nNumber, sal_uInt16 nDecimals,
switch( getCurrNegativeFormat() )
{
case 0:
pBuf = ImplAddString( pBuf, '(' );
pBuf = ImplAddString( pBuf, rCurrencySymbol );
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
pBuf = ImplAddString( pBuf, ')' );
aBuf.append( '(' );
aBuf.append( rCurrencySymbol );
aBuf.append( aNumBuf );
aBuf.append( ')' );
break;
case 1:
pBuf = ImplAddString( pBuf, '-' );
pBuf = ImplAddString( pBuf, rCurrencySymbol );
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
aBuf.append( '-' );
aBuf.append( rCurrencySymbol );
aBuf.append( aNumBuf );
break;
case 2:
pBuf = ImplAddString( pBuf, rCurrencySymbol );
pBuf = ImplAddString( pBuf, '-' );
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
aBuf.append( rCurrencySymbol );
aBuf.append( '-' );
aBuf.append( aNumBuf );
break;
case 3:
pBuf = ImplAddString( pBuf, rCurrencySymbol );
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
pBuf = ImplAddString( pBuf, '-' );
aBuf.append( rCurrencySymbol );
aBuf.append( aNumBuf );
aBuf.append( '-' );
break;
case 4:
pBuf = ImplAddString( pBuf, '(' );
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
pBuf = ImplAddString( pBuf, rCurrencySymbol );
pBuf = ImplAddString( pBuf, ')' );
aBuf.append( '(' );
aBuf.append( aNumBuf );
aBuf.append( rCurrencySymbol );
aBuf.append( ')' );
break;
case 5:
pBuf = ImplAddString( pBuf, '-' );
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
pBuf = ImplAddString( pBuf, rCurrencySymbol );
aBuf.append( '-' );
aBuf.append( aNumBuf );
aBuf.append( rCurrencySymbol );
break;
case 6:
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
pBuf = ImplAddString( pBuf, '-' );
pBuf = ImplAddString( pBuf, rCurrencySymbol );
aBuf.append( aNumBuf );
aBuf.append( '-' );
aBuf.append( rCurrencySymbol );
break;
case 7:
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
pBuf = ImplAddString( pBuf, rCurrencySymbol );
pBuf = ImplAddString( pBuf, '-' );
aBuf.append( aNumBuf );
aBuf.append( rCurrencySymbol );
aBuf.append( '-' );
break;
case 8:
pBuf = ImplAddString( pBuf, '-' );
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
pBuf = ImplAddString( pBuf, ' ' );
pBuf = ImplAddString( pBuf, rCurrencySymbol );
aBuf.append( '-' );
aBuf.append( aNumBuf );
aBuf.append( ' ' );
aBuf.append( rCurrencySymbol );
break;
case 9:
pBuf = ImplAddString( pBuf, '-' );
pBuf = ImplAddString( pBuf, rCurrencySymbol );
pBuf = ImplAddString( pBuf, ' ' );
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
aBuf.append( '-' );
aBuf.append( rCurrencySymbol );
aBuf.append( ' ' );
aBuf.append( aNumBuf );
break;
case 10:
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
pBuf = ImplAddString( pBuf, ' ' );
pBuf = ImplAddString( pBuf, rCurrencySymbol );
pBuf = ImplAddString( pBuf, '-' );
aBuf.append( aNumBuf );
aBuf.append( ' ' );
aBuf.append( rCurrencySymbol );
aBuf.append( '-' );
break;
case 11:
pBuf = ImplAddString( pBuf, rCurrencySymbol );
pBuf = ImplAddString( pBuf, ' ' );
pBuf = ImplAddString( pBuf, '-' );
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
aBuf.append( rCurrencySymbol );
aBuf.append( ' ' );
aBuf.append( '-' );
aBuf.append( aNumBuf );
break;
case 12:
pBuf = ImplAddString( pBuf, rCurrencySymbol );
pBuf = ImplAddString( pBuf, ' ' );
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
pBuf = ImplAddString( pBuf, '-' );
aBuf.append( rCurrencySymbol );
aBuf.append( ' ' );
aBuf.append( aNumBuf );
aBuf.append( '-' );
break;
case 13:
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
pBuf = ImplAddString( pBuf, '-' );
pBuf = ImplAddString( pBuf, ' ' );
pBuf = ImplAddString( pBuf, rCurrencySymbol );
aBuf.append( aNumBuf );
aBuf.append( '-' );
aBuf.append( ' ' );
aBuf.append( rCurrencySymbol );
break;
case 14:
pBuf = ImplAddString( pBuf, '(' );
pBuf = ImplAddString( pBuf, rCurrencySymbol );
pBuf = ImplAddString( pBuf, ' ' );
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
pBuf = ImplAddString( pBuf, ')' );
aBuf.append( '(' );
aBuf.append( rCurrencySymbol );
aBuf.append( ' ' );
aBuf.append( aNumBuf );
aBuf.append( ')' );
break;
case 15:
pBuf = ImplAddString( pBuf, '(' );
pBuf = ImplAddString( pBuf, pNumBuffer, nNumLen );
pBuf = ImplAddString( pBuf, ' ' );
pBuf = ImplAddString( pBuf, rCurrencySymbol );
pBuf = ImplAddString( pBuf, ')' );
aBuf.append( '(' );
aBuf.append( aNumBuf );
aBuf.append( ' ' );
aBuf.append( rCurrencySymbol );
aBuf.append( ')' );
break;
}
}
OUString aNumber(pBuffer, pBuf-pBuffer);
if ( pBuffer != aBuf )
delete [] pBuffer;
if ( pNumBuffer != aNumBuf )
delete [] pNumBuffer;
return aNumber;
return aBuf.makeStringAndClear();
}
// --- number parsing -------------------------------------------------