[Libreoffice-commits] core.git: 2 commits - svl/source
Stephan Bergmann
sbergman at redhat.com
Tue Aug 18 04:22:38 PDT 2015
svl/source/numbers/zforlist.cxx | 253 ++++++++++++++++++++--------------------
1 file changed, 128 insertions(+), 125 deletions(-)
New commits:
commit c77e74747b289990d45fb9378323daf63c9f7a2f
Author: Stephan Bergmann <sbergman at redhat.com>
Date: Tue Aug 18 13:16:23 2015 +0200
Content of theIndexTable is known statically
...and initializing it on-demand in SvNumberFormatter::ImpGenerateFormats wasn't
even thread safe (despite theIndexTable.maMtx): While one thread was cleaning
and then filling it in ImpGenerateFormats, another thread could also enter
ImpGenerateFormats and clean it again (and only later fill it), and the first
thread might use the half-filled table after it left ImpGenerateFormats but
before the second thread re-filled it.
Change-Id: Iba4e9d57519d2b288718b9cb2e6f7546ba2bd5df
diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx
index 8f540bd..8b00985 100644
--- a/svl/source/numbers/zforlist.cxx
+++ b/svl/source/numbers/zforlist.cxx
@@ -90,19 +90,61 @@ using namespace ::std;
* (old currency) is recognized as a date (#53155#). */
#define UNKNOWN_SUBSTITUTE LANGUAGE_ENGLISH_US
-struct IndexTable
-{
- bool mbInitialized;
- sal_uInt32 maData[NF_INDEX_TABLE_ENTRIES];
- osl::Mutex maMtx;
-
- IndexTable() : mbInitialized(false) {}
+static sal_uInt32 const indexTable[NF_INDEX_TABLE_ENTRIES] = {
+ ZF_STANDARD, // NF_NUMBER_STANDARD
+ ZF_STANDARD + 1, // NF_NUMBER_INT
+ ZF_STANDARD + 2, // NF_NUMBER_DEC2
+ ZF_STANDARD + 3, // NF_NUMBER_1000INT
+ ZF_STANDARD + 4, // NF_NUMBER_1000DEC2
+ ZF_STANDARD + 5, // NF_NUMBER_SYSTEM
+ ZF_STANDARD_SCIENTIFIC, // NF_SCIENTIFIC_000E000
+ ZF_STANDARD_SCIENTIFIC + 1, // NF_SCIENTIFIC_000E00
+ ZF_STANDARD_PERCENT, // NF_PERCENT_INT
+ ZF_STANDARD_PERCENT + 1, // NF_PERCENT_DEC2
+ ZF_STANDARD_FRACTION, // NF_FRACTION_1
+ ZF_STANDARD_FRACTION + 1, // NF_FRACTION_2
+ ZF_STANDARD_CURRENCY, // NF_CURRENCY_1000INT
+ ZF_STANDARD_CURRENCY + 1, // NF_CURRENCY_1000DEC2
+ ZF_STANDARD_CURRENCY + 2, // NF_CURRENCY_1000INT_RED
+ ZF_STANDARD_CURRENCY + 3, // NF_CURRENCY_1000DEC2_RED
+ ZF_STANDARD_CURRENCY + 4, // NF_CURRENCY_1000DEC2_CCC
+ ZF_STANDARD_CURRENCY + 5, // NF_CURRENCY_1000DEC2_DASHED
+ ZF_STANDARD_DATE, // NF_DATE_SYSTEM_SHORT
+ ZF_STANDARD_DATE + 8, // NF_DATE_SYSTEM_LONG
+ ZF_STANDARD_DATE + 7, // NF_DATE_SYS_DDMMYY
+ ZF_STANDARD_DATE + 6, // NF_DATE_SYS_DDMMYYYY
+ ZF_STANDARD_DATE + 9, // NF_DATE_SYS_DMMMYY
+ ZF_STANDARD_NEWEXTENDED_DATE_SYS_DMMMYYYY, // NF_DATE_SYS_DMMMYYYY
+ ZF_STANDARD_NEWEXTENDED_DATE_DIN_DMMMYYYY, // NF_DATE_DIN_DMMMYYYY
+ ZF_STANDARD_NEWEXTENDED_DATE_SYS_DMMMMYYYY, // NF_DATE_SYS_DMMMMYYYY
+ ZF_STANDARD_NEWEXTENDED_DATE_DIN_DMMMMYYYY, // NF_DATE_DIN_DMMMMYYYY
+ ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNDMMMYY, // NF_DATE_SYS_NNDMMMYY
+ ZF_STANDARD_DATE + 1, // NF_DATE_DEF_NNDDMMMYY
+ ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNDMMMMYYYY, // NF_DATE_SYS_NNDMMMMYYYY
+ ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNNNDMMMMYYYY, // NF_DATE_SYS_NNNNDMMMMYYYY
+ ZF_STANDARD_NEWEXTENDED_DATE_DIN_MMDD, // NF_DATE_DIN_MMDD
+ ZF_STANDARD_NEWEXTENDED_DATE_DIN_YYMMDD, // NF_DATE_DIN_YYMMDD
+ ZF_STANDARD_NEWEXTENDED_DATE_DIN_YYYYMMDD, // NF_DATE_DIN_YYYYMMDD
+ ZF_STANDARD_DATE + 2, // NF_DATE_SYS_MMYY
+ ZF_STANDARD_DATE + 3, // NF_DATE_SYS_DDMMM
+ ZF_STANDARD_DATE + 4, // NF_DATE_MMMM
+ ZF_STANDARD_DATE + 5, // NF_DATE_QQJJ
+ ZF_STANDARD_NEWEXTENDED_DATE_WW, // NF_DATE_WW
+ ZF_STANDARD_TIME, // NF_TIME_HHMM
+ ZF_STANDARD_TIME + 1, // NF_TIME_HHMMSS
+ ZF_STANDARD_TIME + 2, // NF_TIME_HHMMAMPM
+ ZF_STANDARD_TIME + 3, // NF_TIME_HHMMSSAMPM
+ ZF_STANDARD_TIME + 4, // NF_TIME_HH_MMSS
+ ZF_STANDARD_TIME + 5, // NF_TIME_MMSS00
+ ZF_STANDARD_TIME + 6, // NF_TIME_HH_MMSS00
+ ZF_STANDARD_DATETIME, // NF_DATETIME_SYSTEM_SHORT_HHMM
+ ZF_STANDARD_DATETIME + 1, // NF_DATETIME_SYS_DDMMYYYY_HHMMSS
+ ZF_STANDARD_LOGICAL, // NF_BOOLEAN
+ ZF_STANDARD_TEXT, // NF_TEXT
+ ZF_STANDARD_FRACTION + 2, // NF_FRACTION_3
+ ZF_STANDARD_FRACTION + 3 // NF_FRACTION_4
};
-static IndexTable theIndexTable;
-
-
-
/**
instead of every number formatter being a listener we have a registry which
also handles one instance of the SysLocale options
@@ -1918,21 +1960,6 @@ sal_uInt32 SvNumberFormatter::GetFormatSpecialInfo( const OUString& rFormatStrin
return nCheckPos;
}
-
-inline sal_uInt32 SetIndexTable( NfIndexTableOffset nTabOff, sal_uInt32 nIndOff )
-{
- osl::MutexGuard aGuard(&theIndexTable.maMtx);
-
- if (!theIndexTable.mbInitialized)
- {
- DBG_ASSERT(theIndexTable.maData[nTabOff] == NUMBERFORMAT_ENTRY_NOT_FOUND,
- "SetIndexTable: theIndexTable[nTabOff] already occupied" );
- theIndexTable.maData[nTabOff] = nIndOff;
- }
- return nIndOff;
-}
-
-
sal_Int32 SvNumberFormatter::ImpGetFormatCodeIndex(
::com::sun::star::uno::Sequence< ::com::sun::star::i18n::NumberFormatCode >& rSeq,
const NfIndexTableOffset nTabOff )
@@ -2123,17 +2150,6 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
{
using namespace ::com::sun::star;
- {
- osl::MutexGuard aGuard(&theIndexTable.maMtx);
- if (!theIndexTable.mbInitialized)
- {
- for ( sal_uInt16 j=0; j<NF_INDEX_TABLE_ENTRIES; j++ )
- {
- theIndexTable.maData[j] = NUMBERFORMAT_ENTRY_NOT_FOUND;
- }
- }
- }
-
bool bOldConvertMode = pFormatScanner->GetConvertMode();
if (bOldConvertMode)
{
@@ -2154,7 +2170,7 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
// General
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_NUMBER_STANDARD );
SvNumberformat* pStdFormat = ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_NUMBER_STANDARD, ZF_STANDARD ));
+ CLOffset + ZF_STANDARD /* NF_NUMBER_STANDARD */ );
if (pStdFormat)
{
// This is _the_ standard format.
@@ -2185,7 +2201,7 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
pNewFormat->SetType(css::util::NumberFormat::LOGICAL);
pNewFormat->SetStandard();
if ( !aFTable.insert(make_pair(
- CLOffset + SetIndexTable( NF_BOOLEAN, ZF_STANDARD_LOGICAL ),
+ CLOffset + ZF_STANDARD_LOGICAL /* NF_BOOLEAN */,
pNewFormat)).second)
{
SAL_WARN( "svl.numbers", "SvNumberFormatter::ImpGenerateFormats: dup position Boolean");
@@ -2199,7 +2215,7 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
pNewFormat->SetType(css::util::NumberFormat::TEXT);
pNewFormat->SetStandard();
if ( !aFTable.insert(make_pair(
- CLOffset + SetIndexTable( NF_TEXT, ZF_STANDARD_TEXT ),
+ CLOffset + ZF_STANDARD_TEXT /* NF_TEXT */,
pNewFormat)).second)
{
SAL_WARN( "svl.numbers", "SvNumberFormatter::ImpGenerateFormats: dup position Text");
@@ -2211,27 +2227,27 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
// 0
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_NUMBER_INT );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_NUMBER_INT, ZF_STANDARD+1 ));
+ CLOffset + ZF_STANDARD+1 /* NF_NUMBER_INT */ );
// 0.00
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_NUMBER_DEC2 );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_NUMBER_DEC2, ZF_STANDARD+2 ));
+ CLOffset + ZF_STANDARD+2 /* NF_NUMBER_DEC2 */ );
// #,##0
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_NUMBER_1000INT );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_NUMBER_1000INT, ZF_STANDARD+3 ));
+ CLOffset + ZF_STANDARD+3 /* NF_NUMBER_1000INT */ );
// #,##0.00
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_NUMBER_1000DEC2 );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_NUMBER_1000DEC2, ZF_STANDARD+4 ));
+ CLOffset + ZF_STANDARD+4 /* NF_NUMBER_1000DEC2 */ );
// #.##0,00 System country/language dependent
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_NUMBER_SYSTEM );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_NUMBER_SYSTEM, ZF_STANDARD+5 ));
+ CLOffset + ZF_STANDARD+5 /* NF_NUMBER_SYSTEM */ );
// Percent number
@@ -2241,12 +2257,12 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
// 0%
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_PERCENT_INT );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_PERCENT_INT, ZF_STANDARD_PERCENT ));
+ CLOffset + ZF_STANDARD_PERCENT /* NF_PERCENT_INT */ );
// 0.00%
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_PERCENT_DEC2 );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_PERCENT_DEC2, ZF_STANDARD_PERCENT+1 ));
+ CLOffset + ZF_STANDARD_PERCENT+1 /* NF_PERCENT_DEC2 */ );
@@ -2264,7 +2280,7 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
bDefault = aFormatSeq[nIdx].Default;
aFormatSeq[nIdx].Default = false;
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_CURRENCY_1000INT, ZF_STANDARD_CURRENCY ));
+ CLOffset + ZF_STANDARD_CURRENCY /* NF_CURRENCY_1000INT */ );
aFormatSeq[nIdx].Default = bDefault;
// #,##0.00
@@ -2272,7 +2288,7 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
bDefault = aFormatSeq[nIdx].Default;
aFormatSeq[nIdx].Default = false;
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_CURRENCY_1000DEC2, ZF_STANDARD_CURRENCY+1 ));
+ CLOffset + ZF_STANDARD_CURRENCY+1 /* NF_CURRENCY_1000DEC2 */ );
aFormatSeq[nIdx].Default = bDefault;
// #,##0 negative red
@@ -2280,7 +2296,7 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
bDefault = aFormatSeq[nIdx].Default;
aFormatSeq[nIdx].Default = false;
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_CURRENCY_1000INT_RED, ZF_STANDARD_CURRENCY+2 ));
+ CLOffset + ZF_STANDARD_CURRENCY+2 /* NF_CURRENCY_1000INT_RED */ );
aFormatSeq[nIdx].Default = bDefault;
// #,##0.00 negative red
@@ -2288,7 +2304,7 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
bDefault = aFormatSeq[nIdx].Default;
aFormatSeq[nIdx].Default = false;
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_CURRENCY_1000DEC2_RED, ZF_STANDARD_CURRENCY+3 ));
+ CLOffset + ZF_STANDARD_CURRENCY+3 /* NF_CURRENCY_1000DEC2_RED */ );
aFormatSeq[nIdx].Default = bDefault;
// #,##0.00 USD
@@ -2296,7 +2312,7 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
bDefault = aFormatSeq[nIdx].Default;
aFormatSeq[nIdx].Default = false;
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_CURRENCY_1000DEC2_CCC, ZF_STANDARD_CURRENCY+4 ));
+ CLOffset + ZF_STANDARD_CURRENCY+4 /* NF_CURRENCY_1000DEC2_CCC */ );
aFormatSeq[nIdx].Default = bDefault;
// #.##0,--
@@ -2304,7 +2320,7 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
bDefault = aFormatSeq[nIdx].Default;
aFormatSeq[nIdx].Default = false;
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_CURRENCY_1000DEC2_DASHED, ZF_STANDARD_CURRENCY+5 ));
+ CLOffset + ZF_STANDARD_CURRENCY+5 /* NF_CURRENCY_1000DEC2_DASHED */ );
aFormatSeq[nIdx].Default = bDefault;
@@ -2316,107 +2332,107 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
// DD.MM.YY System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYSTEM_SHORT );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYSTEM_SHORT, ZF_STANDARD_DATE ));
+ CLOffset + ZF_STANDARD_DATE /* NF_DATE_SYSTEM_SHORT */ );
// NN DD.MMM YY
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_DEF_NNDDMMMYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_DEF_NNDDMMMYY, ZF_STANDARD_DATE+1 ));
+ CLOffset + ZF_STANDARD_DATE+1 /* NF_DATE_DEF_NNDDMMMYY */ );
// DD.MM.YY def/System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_MMYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_MMYY, ZF_STANDARD_DATE+2 ));
+ CLOffset + ZF_STANDARD_DATE+2 /* NF_DATE_SYS_MMYY */ );
// DD MMM
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_DDMMM );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_DDMMM, ZF_STANDARD_DATE+3 ));
+ CLOffset + ZF_STANDARD_DATE+3 /* NF_DATE_SYS_DDMMM */ );
// MMMM
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_MMMM );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_MMMM, ZF_STANDARD_DATE+4 ));
+ CLOffset + ZF_STANDARD_DATE+4 /* NF_DATE_MMMM */ );
// QQ YY
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_QQJJ );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_QQJJ, ZF_STANDARD_DATE+5 ));
+ CLOffset + ZF_STANDARD_DATE+5 /* NF_DATE_QQJJ */ );
// DD.MM.YYYY was DD.MM.[YY]YY
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_DDMMYYYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_DDMMYYYY, ZF_STANDARD_DATE+6 ));
+ CLOffset + ZF_STANDARD_DATE+6 /* NF_DATE_SYS_DDMMYYYY */ );
// DD.MM.YY def/System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_DDMMYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_DDMMYY, ZF_STANDARD_DATE+7 ));
+ CLOffset + ZF_STANDARD_DATE+7 /* NF_DATE_SYS_DDMMYY */ );
// NNN, D. MMMM YYYY System
// Long day of week: "NNNN" instead of "NNN," because of compatibility
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYSTEM_LONG );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYSTEM_LONG, ZF_STANDARD_DATE+8 ));
+ CLOffset + ZF_STANDARD_DATE+8 /* NF_DATE_SYSTEM_LONG */ );
// Hard coded but system (regional settings) delimiters dependent long date formats
// D. MMM YY def/System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_DMMMYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_DMMMYY, ZF_STANDARD_DATE+9 ));
+ CLOffset + ZF_STANDARD_DATE+9 /* NF_DATE_SYS_DMMMYY */ );
// D. MMM YYYY def/System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_DMMMYYYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_DMMMYYYY, ZF_STANDARD_NEWEXTENDED_DATE_SYS_DMMMYYYY ));
+ CLOffset + ZF_STANDARD_NEWEXTENDED_DATE_SYS_DMMMYYYY /* NF_DATE_SYS_DMMMYYYY */ );
// D. MMMM YYYY def/System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_DMMMMYYYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_DMMMMYYYY, ZF_STANDARD_NEWEXTENDED_DATE_SYS_DMMMMYYYY ));
+ CLOffset + ZF_STANDARD_NEWEXTENDED_DATE_SYS_DMMMMYYYY /* NF_DATE_SYS_DMMMMYYYY */ );
// NN, D. MMM YY def/System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_NNDMMMYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_NNDMMMYY, ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNDMMMYY ));
+ CLOffset + ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNDMMMYY /* NF_DATE_SYS_NNDMMMYY */ );
// NN, D. MMMM YYYY def/System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_NNDMMMMYYYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_NNDMMMMYYYY, ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNDMMMMYYYY ));
+ CLOffset + ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNDMMMMYYYY /* NF_DATE_SYS_NNDMMMMYYYY */ );
// NNN, D. MMMM YYYY def/System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_NNNNDMMMMYYYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_NNNNDMMMMYYYY, ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNNNDMMMMYYYY ));
+ CLOffset + ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNNNDMMMMYYYY /* NF_DATE_SYS_NNNNDMMMMYYYY */ );
// Hard coded DIN (Deutsche Industrie Norm) and EN (European Norm) date formats
// D. MMM. YYYY DIN/EN
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_DIN_DMMMYYYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_DIN_DMMMYYYY, ZF_STANDARD_NEWEXTENDED_DATE_DIN_DMMMYYYY ));
+ CLOffset + ZF_STANDARD_NEWEXTENDED_DATE_DIN_DMMMYYYY /* NF_DATE_DIN_DMMMYYYY */ );
// D. MMMM YYYY DIN/EN
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_DIN_DMMMMYYYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_DIN_DMMMMYYYY, ZF_STANDARD_NEWEXTENDED_DATE_DIN_DMMMMYYYY ));
+ CLOffset + ZF_STANDARD_NEWEXTENDED_DATE_DIN_DMMMMYYYY /* NF_DATE_DIN_DMMMMYYYY */ );
// MM-DD DIN/EN
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_DIN_MMDD );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_DIN_MMDD, ZF_STANDARD_NEWEXTENDED_DATE_DIN_MMDD ));
+ CLOffset + ZF_STANDARD_NEWEXTENDED_DATE_DIN_MMDD /* NF_DATE_DIN_MMDD */ );
// YY-MM-DD DIN/EN
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_DIN_YYMMDD );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_DIN_YYMMDD, ZF_STANDARD_NEWEXTENDED_DATE_DIN_YYMMDD ));
+ CLOffset + ZF_STANDARD_NEWEXTENDED_DATE_DIN_YYMMDD /* NF_DATE_DIN_YYMMDD */ );
// YYYY-MM-DD DIN/EN
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_DIN_YYYYMMDD );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_DIN_YYYYMMDD, ZF_STANDARD_NEWEXTENDED_DATE_DIN_YYYYMMDD ));
+ CLOffset + ZF_STANDARD_NEWEXTENDED_DATE_DIN_YYYYMMDD /* NF_DATE_DIN_YYYYMMDD */ );
@@ -2427,37 +2443,37 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
// HH:MM
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_TIME_HHMM );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_TIME_HHMM, ZF_STANDARD_TIME ));
+ CLOffset + ZF_STANDARD_TIME /* NF_TIME_HHMM */ );
// HH:MM:SS
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_TIME_HHMMSS );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_TIME_HHMMSS, ZF_STANDARD_TIME+1 ));
+ CLOffset + ZF_STANDARD_TIME+1 /* NF_TIME_HHMMSS */ );
// HH:MM AM/PM
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_TIME_HHMMAMPM );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_TIME_HHMMAMPM, ZF_STANDARD_TIME+2 ));
+ CLOffset + ZF_STANDARD_TIME+2 /* NF_TIME_HHMMAMPM */ );
// HH:MM:SS AM/PM
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_TIME_HHMMSSAMPM );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_TIME_HHMMSSAMPM, ZF_STANDARD_TIME+3 ));
+ CLOffset + ZF_STANDARD_TIME+3 /* NF_TIME_HHMMSSAMPM */ );
// [HH]:MM:SS
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_TIME_HH_MMSS );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_TIME_HH_MMSS, ZF_STANDARD_TIME+4 ));
+ CLOffset + ZF_STANDARD_TIME+4 /* NF_TIME_HH_MMSS */ );
// MM:SS,00
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_TIME_MMSS00 );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_TIME_MMSS00, ZF_STANDARD_TIME+5 ));
+ CLOffset + ZF_STANDARD_TIME+5 /* NF_TIME_MMSS00 */ );
// [HH]:MM:SS,00
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_TIME_HH_MMSS00 );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_TIME_HH_MMSS00, ZF_STANDARD_TIME+6 ));
+ CLOffset + ZF_STANDARD_TIME+6 /* NF_TIME_HH_MMSS00 */ );
@@ -2468,12 +2484,12 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
// DD.MM.YY HH:MM System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATETIME_SYSTEM_SHORT_HHMM );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATETIME_SYSTEM_SHORT_HHMM, ZF_STANDARD_DATETIME ));
+ CLOffset + ZF_STANDARD_DATETIME /* NF_DATETIME_SYSTEM_SHORT_HHMM */ );
// DD.MM.YYYY HH:MM:SS System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATETIME_SYS_DDMMYYYY_HHMMSS );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATETIME_SYS_DDMMYYYY_HHMMSS, ZF_STANDARD_DATETIME+1 ));
+ CLOffset + ZF_STANDARD_DATETIME+1 /* NF_DATETIME_SYS_DDMMYYYY_HHMMSS */ );
@@ -2484,12 +2500,12 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
// 0.00E+000
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_SCIENTIFIC_000E000 );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_SCIENTIFIC_000E000, ZF_STANDARD_SCIENTIFIC ));
+ CLOffset + ZF_STANDARD_SCIENTIFIC /* NF_SCIENTIFIC_000E000 */ );
// 0.00E+00
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_SCIENTIFIC_000E00 );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_SCIENTIFIC_000E00, ZF_STANDARD_SCIENTIFIC+1 ));
+ CLOffset + ZF_STANDARD_SCIENTIFIC+1 /* NF_SCIENTIFIC_000E00 */ );
@@ -2500,23 +2516,23 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
// # ?/?
aSingleFormatCode.Code = "# ?/?";
ImpInsertFormat( aSingleFormatCode,
- CLOffset + SetIndexTable( NF_FRACTION_1, ZF_STANDARD_FRACTION ));
+ CLOffset + ZF_STANDARD_FRACTION /* NF_FRACTION_1 */ );
// # ??/??
//! "??/" would be interpreted by the compiler as a trigraph for '\'
aSingleFormatCode.Code = "# ?\?/?\?";
ImpInsertFormat( aSingleFormatCode,
- CLOffset + SetIndexTable( NF_FRACTION_2, ZF_STANDARD_FRACTION+1 ));
+ CLOffset + ZF_STANDARD_FRACTION+1 /* NF_FRACTION_2 */ );
// # ?/4
aSingleFormatCode.Code = "# ?/4";
ImpInsertFormat( aSingleFormatCode,
- CLOffset + SetIndexTable( NF_FRACTION_3, ZF_STANDARD_FRACTION+2 ));
+ CLOffset + ZF_STANDARD_FRACTION+2 /* NF_FRACTION_3 */ );
// # ??/100
aSingleFormatCode.Code = "# ?\?/100";
ImpInsertFormat( aSingleFormatCode,
- CLOffset + SetIndexTable( NF_FRACTION_4, ZF_STANDARD_FRACTION+3 ));
+ CLOffset + ZF_STANDARD_FRACTION+3 /* NF_FRACTION_4 */ );
@@ -2524,12 +2540,7 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
const NfKeywordTable & rKeyword = pFormatScanner->GetKeywords();
aSingleFormatCode.Code = rKeyword[NF_KEY_WW];
ImpInsertFormat( aSingleFormatCode,
- CLOffset + SetIndexTable( NF_DATE_WW, ZF_STANDARD_NEWEXTENDED_DATE_WW ));
-
- {
- osl::MutexGuard aGuard(&theIndexTable.maMtx);
- theIndexTable.mbInitialized = true;
- }
+ CLOffset + ZF_STANDARD_NEWEXTENDED_DATE_WW /* NF_DATE_WW */ );
// Now all additional format codes provided by I18N, but only if not
// changing SystemCL, then they are appended last after user defined.
@@ -3055,18 +3066,12 @@ sal_uInt32 SvNumberFormatter::GetFormatIndex( NfIndexTableOffset nTabOff,
if (eLnge == LANGUAGE_DONTKNOW)
eLnge = IniLnge;
- {
- osl::MutexGuard aGuard(&theIndexTable.maMtx);
- if (theIndexTable.maData[nTabOff] == NUMBERFORMAT_ENTRY_NOT_FOUND)
- return NUMBERFORMAT_ENTRY_NOT_FOUND;
- }
+ if (indexTable[nTabOff] == NUMBERFORMAT_ENTRY_NOT_FOUND)
+ return NUMBERFORMAT_ENTRY_NOT_FOUND;
sal_uInt32 nCLOffset = ImpGenerateCL(eLnge); // create new standard formats if necessary
- {
- osl::MutexGuard aGuard(&theIndexTable.maMtx);
- return nCLOffset + theIndexTable.maData[nTabOff];
- }
+ return nCLOffset + indexTable[nTabOff];
}
@@ -3078,13 +3083,10 @@ NfIndexTableOffset SvNumberFormatter::GetIndexTableOffset( sal_uInt32 nFormat )
return NF_INDEX_TABLE_ENTRIES; // not a built-in format
}
+ for ( sal_uInt16 j = 0; j < NF_INDEX_TABLE_ENTRIES; j++ )
{
- osl::MutexGuard aGuard(&theIndexTable.maMtx);
- for ( sal_uInt16 j = 0; j < NF_INDEX_TABLE_ENTRIES; j++ )
- {
- if (theIndexTable.maData[j] == nOffset)
- return (NfIndexTableOffset) j;
- }
+ if (indexTable[j] == nOffset)
+ return (NfIndexTableOffset) j;
}
return NF_INDEX_TABLE_ENTRIES; // bad luck
}
commit 207e2b573f87e48a2eb5a0c1146282696b5df285
Author: Stephan Bergmann <sbergman at redhat.com>
Date: Tue Aug 18 11:20:51 2015 +0200
nNewExtended++ values are all known statically
Change-Id: I4134029257248c8eaea03354d043db2bb4cdba0e
diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx
index c14ba2b..8f540bd 100644
--- a/svl/source/numbers/zforlist.cxx
+++ b/svl/source/numbers/zforlist.cxx
@@ -66,8 +66,22 @@ using namespace ::std;
#define ZF_STANDARD_DATETIME 50
#define ZF_STANDARD_SCIENTIFIC 60
#define ZF_STANDARD_FRACTION 70
-#define ZF_STANDARD_NEWEXTENDED 75
-#define ZF_STANDARD_NEWEXTENDEDMAX SV_MAX_ANZ_STANDARD_FORMATE-2 // 98
+
+// Additional builtin formats not fitting into the first 10 of a category (TLOT
+// = The Legacy Of Templin; unfortunately TLOT intended only 10 builtin formats
+// per category, more would overwrite the next category):
+#define ZF_STANDARD_NEWEXTENDED_DATE_SYS_DMMMYYYY 75
+#define ZF_STANDARD_NEWEXTENDED_DATE_SYS_DMMMMYYYY 76
+#define ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNDMMMYY 77
+#define ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNDMMMMYYYY 78
+#define ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNNNDMMMMYYYY 79
+#define ZF_STANDARD_NEWEXTENDED_DATE_DIN_DMMMYYYY 80
+#define ZF_STANDARD_NEWEXTENDED_DATE_DIN_DMMMMYYYY 81
+#define ZF_STANDARD_NEWEXTENDED_DATE_DIN_MMDD 82
+#define ZF_STANDARD_NEWEXTENDED_DATE_DIN_YYMMDD 83
+#define ZF_STANDARD_NEWEXTENDED_DATE_DIN_YYYYMMDD 84
+#define ZF_STANDARD_NEWEXTENDED_DATE_WW 85
+
#define ZF_STANDARD_LOGICAL SV_MAX_ANZ_STANDARD_FORMATE-1 // 99
#define ZF_STANDARD_TEXT SV_MAX_ANZ_STANDARD_FORMATE // 100
@@ -2132,12 +2146,6 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
sal_Int32 nIdx;
bool bDefault;
- // Counter for additional builtin formats not fitting into the first 10
- // of a category (TLOT:=The Legacy Of Templin), altogether about 20 formats.
- // Has to be incremented on each ImpInsertNewStandardformat, new formats
- // must be appended, not inserted!
- sal_uInt16 nNewExtended = ZF_STANDARD_NEWEXTENDED;
-
// Number
uno::Sequence< i18n::NumberFormatCode > aFormatSeq =
aNumberFormatCode.getAllFormatCode( i18n::KNumberFormatUsage::FIXED_NUMBER );
@@ -2358,61 +2366,57 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
ImpInsertFormat( aFormatSeq[nIdx],
CLOffset + SetIndexTable( NF_DATE_SYS_DMMMYY, ZF_STANDARD_DATE+9 ));
- //! Unfortunately TLOT intended only 10 builtin formats per category, more
- //! would overwrite the next category (ZF_STANDARD_TIME) :-((
- //! Therefore they are inserted with nNewExtended++ (which is also limited)
-
// D. MMM YYYY def/System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_DMMMYYYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_DMMMYYYY, nNewExtended++ ));
+ CLOffset + SetIndexTable( NF_DATE_SYS_DMMMYYYY, ZF_STANDARD_NEWEXTENDED_DATE_SYS_DMMMYYYY ));
// D. MMMM YYYY def/System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_DMMMMYYYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_DMMMMYYYY, nNewExtended++ ));
+ CLOffset + SetIndexTable( NF_DATE_SYS_DMMMMYYYY, ZF_STANDARD_NEWEXTENDED_DATE_SYS_DMMMMYYYY ));
// NN, D. MMM YY def/System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_NNDMMMYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_NNDMMMYY, nNewExtended++ ));
+ CLOffset + SetIndexTable( NF_DATE_SYS_NNDMMMYY, ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNDMMMYY ));
// NN, D. MMMM YYYY def/System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_NNDMMMMYYYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_NNDMMMMYYYY, nNewExtended++ ));
+ CLOffset + SetIndexTable( NF_DATE_SYS_NNDMMMMYYYY, ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNDMMMMYYYY ));
// NNN, D. MMMM YYYY def/System
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_SYS_NNNNDMMMMYYYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_SYS_NNNNDMMMMYYYY, nNewExtended++ ));
+ CLOffset + SetIndexTable( NF_DATE_SYS_NNNNDMMMMYYYY, ZF_STANDARD_NEWEXTENDED_DATE_SYS_NNNNDMMMMYYYY ));
// Hard coded DIN (Deutsche Industrie Norm) and EN (European Norm) date formats
// D. MMM. YYYY DIN/EN
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_DIN_DMMMYYYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_DIN_DMMMYYYY, nNewExtended++ ));
+ CLOffset + SetIndexTable( NF_DATE_DIN_DMMMYYYY, ZF_STANDARD_NEWEXTENDED_DATE_DIN_DMMMYYYY ));
// D. MMMM YYYY DIN/EN
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_DIN_DMMMMYYYY );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_DIN_DMMMMYYYY, nNewExtended++ ));
+ CLOffset + SetIndexTable( NF_DATE_DIN_DMMMMYYYY, ZF_STANDARD_NEWEXTENDED_DATE_DIN_DMMMMYYYY ));
// MM-DD DIN/EN
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_DIN_MMDD );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_DIN_MMDD, nNewExtended++ ));
+ CLOffset + SetIndexTable( NF_DATE_DIN_MMDD, ZF_STANDARD_NEWEXTENDED_DATE_DIN_MMDD ));
// YY-MM-DD DIN/EN
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_DIN_YYMMDD );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_DIN_YYMMDD, nNewExtended++ ));
+ CLOffset + SetIndexTable( NF_DATE_DIN_YYMMDD, ZF_STANDARD_NEWEXTENDED_DATE_DIN_YYMMDD ));
// YYYY-MM-DD DIN/EN
nIdx = ImpGetFormatCodeIndex( aFormatSeq, NF_DATE_DIN_YYYYMMDD );
ImpInsertFormat( aFormatSeq[nIdx],
- CLOffset + SetIndexTable( NF_DATE_DIN_YYYYMMDD, nNewExtended++ ));
+ CLOffset + SetIndexTable( NF_DATE_DIN_YYYYMMDD, ZF_STANDARD_NEWEXTENDED_DATE_DIN_YYYYMMDD ));
@@ -2516,19 +2520,16 @@ void SvNumberFormatter::ImpGenerateFormats( sal_uInt32 CLOffset, bool bNoAdditio
- // Week of year must be appended here because of nNewExtended
+ // Week of year
const NfKeywordTable & rKeyword = pFormatScanner->GetKeywords();
aSingleFormatCode.Code = rKeyword[NF_KEY_WW];
ImpInsertFormat( aSingleFormatCode,
- CLOffset + SetIndexTable( NF_DATE_WW, nNewExtended++ ));
+ CLOffset + SetIndexTable( NF_DATE_WW, ZF_STANDARD_NEWEXTENDED_DATE_WW ));
{
osl::MutexGuard aGuard(&theIndexTable.maMtx);
theIndexTable.mbInitialized = true;
}
- SAL_WARN_IF( nNewExtended > ZF_STANDARD_NEWEXTENDEDMAX, "svl.numbers",
- "ImpGenerateFormats: overflow of nNewExtended standard formats" );
- assert( nNewExtended <= ZF_STANDARD_NEWEXTENDEDMAX );
// Now all additional format codes provided by I18N, but only if not
// changing SystemCL, then they are appended last after user defined.
More information about the Libreoffice-commits
mailing list