28 #include <rtl/ustrbuf.hxx>
34 #include <com/sun/star/i18n/NumberFormatIndex.hpp>
35 #include <com/sun/star/xml/sax/XAttributeList.hpp>
38 #define LOCALE_VERSION_DTD "2.0.3"
40 typedef ::o3tl::sorted_vector< OUString >
NameSet;
41 typedef ::o3tl::sorted_vector< sal_Int16 >
ValueSet;
43 namespace cssi = ::com::sun::star::i18n;
70 while ( (pParent = pParent->
parent) !=
nullptr )
76 if (
aName.equalsAscii(name))
92 if ( name ==
"LC_INFO" )
94 if ( name ==
"LC_CTYPE" )
96 if ( name ==
"LC_FORMAT" )
98 if ( name ==
"LC_FORMAT_1" )
100 if ( name ==
"LC_CALENDAR" )
102 if ( name ==
"LC_CURRENCY" )
104 if ( name ==
"LC_TRANSLITERATION" )
106 if ( name ==
"LC_COLLATION" )
108 if ( name ==
"LC_INDEX" )
110 if ( name ==
"LC_SEARCH" )
112 if ( name ==
"LC_MISC" )
114 if ( name ==
"LC_NumberingLevel" )
116 if ( name ==
"LC_OutLineNumberingLevel" )
126 #define OSTR(s) (OUStringToOString( (s), RTL_TEXTENCODING_UTF8).getStr())
134 fprintf( stderr,
"Error: Locale versionDTD is not %s, see comment in locale.dtd\n",
LOCALE_VERSION_DTD);
143 const char* pParameterName,
const LocaleNode* pNode,
144 sal_Int32 nMinLen, sal_Int32 nMaxLen )
const
149 else if (nMinLen >= 0)
152 fprintf( stderr,
"Error: node NULL pointer for parameter %s.\n",
157 sal_Int32 nLen = aVal.getLength();
161 fprintf( stderr,
"Error: less than %" SAL_PRIdINT32
" character%s (%" SAL_PRIdINT32
") in %s '%s'.\n",
162 nMinLen, (nMinLen > 1 ?
"s" :
""),
167 else if (nLen > nMaxLen && nMaxLen >= 0)
171 "Error: more than %" SAL_PRIdINT32
" character%s (%" SAL_PRIdINT32
") in %s '%s' not supported by application.\n",
172 nMaxLen, (nMaxLen > 1 ?
"s" :
""),
182 const char* pNodeName,
const char* pParameterName,
183 sal_Int32 nMinLen, sal_Int32 nMaxLen )
const
187 if (pNode || nMinLen < 0)
192 fprintf( stderr,
"Error: node %s not found.\n", pNodeName);
202 fprintf( stderr,
"Error: %s\n", pStr);
213 fprintf( stderr, pStr, nVal);
219 fprintf( stderr, pStr,
OSTR( rVal));
225 fprintf(stderr, pStr,
OSTR(rVal1),
OSTR(rVal2));
240 if (aLanguage.getLength() != 2 && aLanguage.getLength() != 3)
241 incErrorStr(
"Error: langID '%s' not 2-3 characters\n", aLanguage);
250 if (!(aCountry.isEmpty() || aCountry.getLength() == 2))
251 incErrorStr(
"Error: countryID '%s' not empty or more than 2 characters\n", aCountry);
260 const OUString& aVariant( variantNode->
getValue());
261 if (!(aVariant.isEmpty() || (aVariant.getLength() >= 7 && aVariant.indexOf(
'-') >= 2)))
262 incErrorStr(
"Error: invalid Variant '%s'\n", aVariant);
263 if (!(aVariant.isEmpty() || aLanguage ==
"qlt"))
264 incErrorStrStr(
"Error: Variant '%s' given but Language '%s' is not 'qlt'\n", aVariant, aLanguage);
276 of.
writeFunction(
"getLCInfo_",
"SAL_N_ELEMENTS(LCInfoArray)",
"LCInfoArray");
287 if (!useLocale.isEmpty()) {
288 useLocale = useLocale.replace(
'-',
'_');
302 OUString aDecSepAlt =
306 OUString aTime100Sep =
313 sepNode =
findNode(
"LongDateDayOfWeekSeparator");
317 fprintf( stderr,
"Warning: %s\n",
318 "LongDateDayOfWeekSeparator is only a comma not followed by a space. Usually this is not the case and may lead to concatenated display names like \"Wednesday,May 9, 2007\".");
320 sepNode =
findNode(
"LongDateDaySeparator");
323 if (aLDS ==
"," || aLDS ==
".")
324 fprintf( stderr,
"Warning: %s\n",
325 "LongDateDaySeparator is only a comma or dot not followed by a space. Usually this is not the case and may lead to concatenated display names like \"Wednesday, May 9,2007\".");
327 sepNode =
findNode(
"LongDateMonthSeparator");
331 fprintf( stderr,
"Warning: %s\n",
332 "LongDateMonthSeparator is empty. Usually this is not the case and may lead to concatenated display names like \"Wednesday, May9, 2007\".");
334 sepNode =
findNode(
"LongDateYearSeparator");
338 fprintf( stderr,
"Warning: %s\n",
339 "LongDateYearSeparator is empty. Usually this is not the case and may lead to concatenated display names like \"Wednesday, 2007May 9\".");
344 incError(
"DateSeparator equals TimeSeparator.");
346 incError(
"DecimalSeparator equals ThousandSeparator.");
347 if (aDecSepAlt == aThoSep)
348 incError(
"DecimalSeparatorAlternative equals ThousandSeparator.");
350 incError(
"DecimalSeparatorAlternative equals DecimalSeparator, it must not be specified then.");
351 if ( aThoSep ==
" " )
352 incError(
"ThousandSeparator is an ' ' ordinary space, this should be a non-breaking space U+00A0 instead.");
354 fprintf( stderr,
"Warning: %s\n",
355 "ListSeparator equals DecimalSeparator.");
356 if (aListSep == aThoSep)
357 fprintf( stderr,
"Warning: %s\n",
358 "ListSeparator equals ThousandSeparator.");
359 if (aListSep.getLength() != 1 || aListSep[0] !=
';')
361 incError(
"ListSeparator not ';' semicolon. Strongly recommended. Currently required.");
364 if (aTimeSep == aTime100Sep)
367 fprintf( stderr,
"Warning: %s\n",
368 "Time100SecSeparator equals TimeSeparator, this is probably an error.");
373 fprintf( stderr,
"Warning: %s\n",
374 "Time100SecSeparator is different from DecimalSeparator, this may be correct or not. Intended?");
376 if (nSavErr !=
nError || nWarn)
377 fprintf( stderr,
"Warning: %s\n",
378 "Don't forget to adapt corresponding FormatCode elements when changing separators.");
380 OUString aQuoteStart =
384 OUString aDoubleQuoteStart =
386 OUString aDoubleQuoteEnd =
389 if (aQuoteStart.toChar() <= 127 && aQuoteEnd.toChar() > 127)
390 fprintf( stderr,
"Warning: %s\n",
391 "QuotationStart is an ASCII character but QuotationEnd is not.");
392 if (aQuoteEnd.toChar() <= 127 && aQuoteStart.toChar() > 127)
393 fprintf( stderr,
"Warning: %s\n",
394 "QuotationEnd is an ASCII character but QuotationStart is not.");
395 if (aDoubleQuoteStart.toChar() <= 127 && aDoubleQuoteEnd.toChar() > 127)
396 fprintf( stderr,
"Warning: %s\n",
397 "DoubleQuotationStart is an ASCII character but DoubleQuotationEnd is not.");
398 if (aDoubleQuoteEnd.toChar() <= 127 && aDoubleQuoteStart.toChar() > 127)
399 fprintf( stderr,
"Warning: %s\n",
400 "DoubleQuotationEnd is an ASCII character but DoubleQuotationStart is not.");
401 if (aQuoteStart.toChar() <= 127 && aQuoteEnd.toChar() <= 127)
402 fprintf( stderr,
"Warning: %s\n",
403 "QuotationStart and QuotationEnd are both ASCII characters. Not necessarily an issue, but unusual.");
404 if (aDoubleQuoteStart.toChar() <= 127 && aDoubleQuoteEnd.toChar() <= 127)
405 fprintf( stderr,
"Warning: %s\n",
406 "DoubleQuotationStart and DoubleQuotationEnd are both ASCII characters. Not necessarily an issue, but unusual.");
407 if (aQuoteStart == aQuoteEnd)
408 fprintf( stderr,
"Warning: %s\n",
409 "QuotationStart equals QuotationEnd. Not necessarily an issue, but unusual.");
410 if (aDoubleQuoteStart == aDoubleQuoteEnd)
411 fprintf( stderr,
"Warning: %s\n",
412 "DoubleQuotationStart equals DoubleQuotationEnd. Not necessarily an issue, but unusual.");
415 if (aQuoteStart == aDoubleQuoteStart)
416 fprintf( stderr,
"Warning: %s\n",
417 "QuotationStart equals DoubleQuotationStart. Not necessarily an issue, but unusual.");
418 if (aQuoteEnd == aDoubleQuoteEnd)
419 fprintf( stderr,
"Warning: %s\n",
420 "QuotationEnd equals DoubleQuotationEnd. Not necessarily an issue, but unusual.");
422 switch (
int ic = aQuoteStart.toChar())
433 fprintf( stderr,
"Warning: %s U+%04X %s\n",
434 "QuotationStart may be wrong:", ic,
OSTR( aQuoteStart));
436 switch (
int ic = aQuoteEnd.toChar())
447 fprintf( stderr,
"Warning: %s U+%04X %s\n",
448 "QuotationEnd may be wrong:", ic,
OSTR( aQuoteEnd));
450 switch (
int ic = aDoubleQuoteStart.toChar())
461 fprintf( stderr,
"Warning: %s U+%04X %s\n",
462 "DoubleQuotationStart may be wrong:", ic,
OSTR( aDoubleQuoteStart));
464 switch (
int ic = aDoubleQuoteEnd.toChar())
475 fprintf( stderr,
"Warning: %s U+%04X %s\n",
476 "DoubleQuotationEnd may be wrong:", ic,
OSTR( aDoubleQuoteEnd));
481 sepNode =
findNode(
"MeasurementSystem");
505 of.
writeFunction(
"getLocaleItem_",
"SAL_N_ELEMENTS(LCType)",
"LCType");
519 incError(
"more than 2 LC_FORMAT sections");
521 ::std::vector< OUString > theDateAcceptancePatterns;
523 OUString useLocale(
getAttr().getValueByName(
"ref"));
526 OUString strFrom(
getAttr().getValueByName(
"replaceFrom"));
527 if (useLocale.isEmpty())
532 if (!strFrom.isEmpty() && str.isEmpty())
533 incErrorStr(
"replaceFrom=\"%s\" replaceTo=\"\" is empty replacement.\n", strFrom);
535 if (str.endsWithIgnoreAsciiCase(
"-FFFF]"))
536 incErrorStr(
"replaceTo=\"%s\" needs FFFF to be adapted to the real LangID value.\n", str);
539 if ( strFrom ==
"[CURRENCY]" )
542 if (str.startsWith(
"[$" ))
544 sal_Int32 nHyphen = str.indexOf(
'-');
551 if (!useLocale.isEmpty())
553 if (!strFrom.isEmpty() && strFrom !=
"[CURRENCY]")
556 "Error: non-empty replaceFrom=\"%s\" with non-empty ref=\"%s\".",
559 useLocale = useLocale.replace(
'-',
'_');
577 bool bCtypeIsRef =
false;
578 bool bHaveEngineering =
false;
579 bool bShowNextFreeFormatIndex =
false;
584 if ( currNode->
getName() ==
"DateAcceptancePattern" )
587 incError(
"DateAcceptancePattern only handled in LC_FORMAT, not LC_FORMAT_1");
589 theDateAcceptancePatterns.push_back( currNode->
getValue());
593 if ( currNode->
getName() !=
"FormatElement" )
602 OUString aFormatIndex;
608 if (!aMsgIdSet.
insert( str).second)
609 incErrorStr(
"Error: Duplicated msgid=\"%s\" in FormatElement.\n", str);
613 bool bDefault = str ==
"true";
623 sal_Int16 formatindex =
static_cast<sal_Int16
>(aFormatIndex.toInt32());
628 incErrorInt(
"Error: Reserved formatindex=\"%d\" in FormatElement.\n", formatindex);
629 bShowNextFreeFormatIndex =
true;
631 if (!aFormatIndexSet.insert( formatindex).second)
633 incErrorInt(
"Error: Duplicated formatindex=\"%d\" in FormatElement.\n", formatindex);
634 bShowNextFreeFormatIndex =
true;
641 OUString aKey( aUsage +
"," + aType);
642 if (!aDefaultsSet.
insert( aKey).second)
644 OUString
aStr =
"Duplicated default for usage=\"" + aUsage +
"\" type=\"" + aType +
"\": formatindex=\"" + aFormatIndex +
"\".";
657 case cssi::NumberFormatIndex::DATE_SYS_DDMMYYYY :
660 case cssi::NumberFormatIndex::NUMBER_1000DEC2 :
661 case cssi::NumberFormatIndex::TIME_MMSS00 :
662 case cssi::NumberFormatIndex::TIME_HH_MMSS00 :
666 incError(
"No root for FormatCode.");
669 pCtype = pRoot->
findNode(
"LC_CTYPE");
671 incError(
"No LC_CTYPE found for FormatCode.");
677 aRef = aRef.replace(
'-',
'_');
680 "Warning: Can't check separators used in FormatCode due to LC_CTYPE ref=\"%s\".\n"
681 "If these two locales use identical format codes, you should consider to use the ref= mechanism also for the LC_FORMAT element, together with replaceFrom= and replaceTo= for the currency.\n",
690 case cssi::NumberFormatIndex::CURRENCY_1000DEC2 :
695 sal_Int32 nStart = n->
getValue().indexOf(
"[$");
698 const OUString& aCode( n->
getValue());
699 sal_Int32 nHyphen = aCode.indexOf(
'-', nStart);
700 if (nHyphen >= nStart + 3)
706 case cssi::NumberFormatIndex::CURRENCY_1000INT :
707 case cssi::NumberFormatIndex::CURRENCY_1000INT_RED :
708 case cssi::NumberFormatIndex::CURRENCY_1000DEC2_RED :
709 case cssi::NumberFormatIndex::CURRENCY_1000DEC2_CCC :
710 case cssi::NumberFormatIndex::CURRENCY_1000DEC2_DASHED :
713 if (strcmp( of.
getLocale(),
"en_US") != 0)
715 const OUString& aCode( n->
getValue());
716 if (aCode.indexOf(
"0)" ) > 0 || aCode.indexOf(
"-)" ) > 0 ||
717 aCode.indexOf(
" )" ) > 0 || aCode.indexOf(
"])" ) > 0)
718 fprintf( stderr,
"Warning: FormatCode formatindex=\"%d\" for currency uses parentheses for negative amounts, which probably is not correct for locales not based on en_US.\n", formatindex);
723 const OUString& aCode( n->
getValue());
724 if (aCode.indexOf(
"[CURRENCY]" ) >= 0)
725 incErrorInt(
"Error: [CURRENCY] replaceTo not found for formatindex=\"%d\".\n", formatindex);
729 if (aUsage ==
"SCIENTIFIC_NUMBER")
732 const OUString& aCode( n->
getValue());
736 sal_Int32 nInt = aCode.indexOf(
"##0");
737 sal_Int32 nDec = (nInt < 0 ? -1 : aCode.indexOf(
"00E+00", nInt));
738 if (nInt >= 0 && nDec == nInt+4)
739 bHaveEngineering =
true;
746 const OUString& aCode( n->
getValue());
747 if (formatindex == cssi::NumberFormatIndex::NUMBER_1000DEC2)
753 incError(
"No DecimalSeparator found for FormatCode.");
756 nDec = aCode.indexOf( pSep->
getValue());
758 incErrorInt(
"Error: DecimalSeparator not present in FormatCode formatindex=\"%d\".\n",
761 pSep = pCtype->
findNode(
"ThousandSeparator");
763 incError(
"No ThousandSeparator found for FormatCode.");
766 nGrp = aCode.indexOf( pSep->
getValue());
768 incErrorInt(
"Error: ThousandSeparator not present in FormatCode formatindex=\"%d\".\n",
771 if (nDec >= 0 && nGrp >= 0 && nDec <= nGrp)
772 incErrorInt(
"Error: Ordering of ThousandSeparator and DecimalSeparator not correct in formatindex=\"%d\".\n",
775 if (formatindex == cssi::NumberFormatIndex::TIME_MMSS00 ||
776 formatindex == cssi::NumberFormatIndex::TIME_HH_MMSS00)
778 sal_Int32 nTime = -1;
779 sal_Int32 n100s = -1;
782 incError(
"No TimeSeparator found for FormatCode.");
785 nTime = aCode.indexOf( pSep->
getValue());
787 incErrorInt(
"Error: TimeSeparator not present in FormatCode formatindex=\"%d\".\n",
790 pSep = pCtype->
findNode(
"Time100SecSeparator");
792 incError(
"No Time100SecSeparator found for FormatCode.");
795 n100s = aCode.indexOf( pSep->
getValue());
797 incErrorInt(
"Error: Time100SecSeparator not present in FormatCode formatindex=\"%d\".\n",
799 n100s = aCode.indexOf( OUString(pSep->
getValue() +
"00"));
801 incErrorInt(
"Error: Time100SecSeparator+00 not present in FormatCode formatindex=\"%d\".\n",
804 if (n100s >= 0 && nTime >= 0 && n100s <= nTime)
805 incErrorInt(
"Error: Ordering of Time100SecSeparator and TimeSeparator not correct in formatindex=\"%d\".\n",
810 "Warning: formatindex=\"%d\",\"%d\",\"%d\" are the only FormatCode elements checked for separator usage, there may be others that have errors.\n",
811 int(cssi::NumberFormatIndex::NUMBER_1000DEC2),
812 int(cssi::NumberFormatIndex::TIME_MMSS00),
813 int(cssi::NumberFormatIndex::TIME_HH_MMSS00));
818 incError(
"No FormatCode in FormatElement.");
819 n = currNode ->
findNode(
"DefaultName");
827 if (bShowNextFreeFormatIndex)
830 auto it = aFormatIndexSet.find( nNext);
831 if (it != aFormatIndexSet.end())
838 while (++it != aFormatIndexSet.end() && *it == nNext);
840 fprintf( stderr,
"Hint: Next free formatindex is %d.\n", static_cast<int>(nNext));
848 if (theDateAcceptancePatterns.empty())
849 incError(
"No DateAcceptancePattern present.\n");
852 bool bHaveAbbr =
false;
853 for (
auto const& elem : theDateAcceptancePatterns)
855 if (elem.indexOf(
'D') > -1 && elem.indexOf(
'M') > -1 && elem.indexOf(
'Y') <= -1)
862 incError(
"No abbreviated DateAcceptancePattern present. For example M/D or D.M.\n");
868 for (sal_Int16 nNext = cssi::NumberFormatIndex::NUMBER_START;
871 sal_Int16 nHere = ::std::min( (aIter != aFormatIndexSet.end() ? *aIter :
873 i18npool::nStopPredefinedFormatIndex);
874 if (aIter != aFormatIndexSet.end()) ++aIter;
875 for ( ; nNext < nHere; ++nNext)
879 case cssi::NumberFormatIndex::FRACTION_1 :
880 case cssi::NumberFormatIndex::FRACTION_2 :
881 case cssi::NumberFormatIndex::BOOLEAN :
882 case cssi::NumberFormatIndex::TEXT :
886 incErrorInt(
"Error: FormatElement formatindex=\"%d\" not present.\n", nNext);
891 case cssi::NumberFormatIndex::FRACTION_1 :
892 incErrorInt(
"Error: FormatElement formatindex=\"%d\" reserved for internal ``# ?/?''.\n", nNext);
894 case cssi::NumberFormatIndex::FRACTION_2 :
895 incErrorInt(
"Error: FormatElement formatindex=\"%d\" reserved for internal ``# ?\?/?\?''.\n", nNext);
897 case cssi::NumberFormatIndex::BOOLEAN :
898 incErrorInt(
"Error: FormatElement formatindex=\"%d\" reserved for internal ``BOOLEAN''.\n", nNext);
900 case cssi::NumberFormatIndex::TEXT :
901 incErrorInt(
"Error: FormatElement formatindex=\"%d\" reserved for internal ``@'' (TEXT).\n", nNext);
908 if (!bHaveEngineering)
909 incError(
"Engineering notation format not present, e.g. ##0.00E+00 or ##0,00E+00 for usage=\"SCIENTIFIC_NUMBER\"\n");
964 of.
writeFunction(
"getAllFormats0_",
"FormatElementsCount0",
"FormatElementsArray0",
"replaceFrom0",
"replaceTo0");
967 of.
writeFunction(
"getAllFormats1_",
"FormatElementsCount1",
"FormatElementsArray1",
"replaceFrom1",
"replaceTo1");
982 sal_uInt32 cDateSep = (
aDateSep.isEmpty()
984 sal_uInt32 cDateSep2 = cDateSep;
986 OUStringBuffer aPatternBuf(5);
987 OUStringBuffer aPatternBuf2(5);
989 bool bInModifier =
false;
990 bool bQuoted =
false;
1010 if (!(nDetected & 4))
1012 aPatternBuf.append(
'Y');
1013 if (!aPatternBuf2.isEmpty())
1014 aPatternBuf2.append(
'Y');
1020 if (!(nDetected & 2))
1022 aPatternBuf.append(
'M');
1023 if (!aPatternBuf2.isEmpty())
1024 aPatternBuf2.append(
'M');
1030 if (!(nDetected & 1))
1032 aPatternBuf.append(
'D');
1033 if (!aPatternBuf2.isEmpty())
1034 aPatternBuf2.append(
'D');
1064 if (cDateSep != cDateSep2 && aPatternBuf2.isEmpty())
1065 aPatternBuf2 = aPatternBuf;
1066 if (cChar == cDateSep || cChar == cDateSep2)
1067 aPatternBuf.append( OUString( &cDateSep, 1));
1068 if (cChar == cDateSep2 && !aPatternBuf2.isEmpty())
1069 aPatternBuf2.append( OUString( &cDateSep2, 1));
1073 if (((nDetected & 7) == 3) || ((nDetected & 7) == 0))
1079 aPatternBuf.append(
'Y');
1080 if (!aPatternBuf2.isEmpty())
1081 aPatternBuf2.append(
'Y');
1086 if (((nDetected & 7) == 0) || ((nDetected & 7) == 6))
1090 aPatternBuf.append(
'D');
1091 if (!aPatternBuf2.isEmpty())
1092 aPatternBuf2.append(
'D');
1095 else if ((nDetected & 7) == 3)
1099 aPatternBuf.append(
'Y');
1100 if (!aPatternBuf2.isEmpty())
1101 aPatternBuf2.append(
'Y');
1106 if ((nDetected & 7) == 0)
1109 aPatternBuf.append(
'D');
1110 if (!aPatternBuf2.isEmpty())
1111 aPatternBuf2.append(
'D');
1116 if ((nDetected & 7) == 0)
1119 aPatternBuf.append(
'D');
1120 if (!aPatternBuf2.isEmpty())
1121 aPatternBuf2.append(
'D');
1126 if ((nDetected & 7) == 0)
1129 aPatternBuf.append(
'D');
1130 if (!aPatternBuf2.isEmpty())
1131 aPatternBuf2.append(
'D');
1136 if ((nDetected & 7) == 1)
1139 aPatternBuf.append(
'M');
1140 if (!aPatternBuf2.isEmpty())
1141 aPatternBuf2.append(
'M');
1146 if ((nDetected & 7) == 3)
1149 aPatternBuf.append(
'Y');
1150 if (!aPatternBuf2.isEmpty())
1151 aPatternBuf2.append(
'Y');
1157 OUString aPattern( aPatternBuf.makeStringAndClear());
1158 if (((nDetected & 7) != 7) || aPattern.getLength() < 5)
1160 incErrorStr(
"Error: failed to extract full date acceptance pattern: %s\n", aPattern);
1161 fprintf( stderr,
" with DateSeparator '%s' from FormatCode '%s' (formatindex=\"%d\")\n",
1163 int(cssi::NumberFormatIndex::DATE_SYS_DDMMYYYY));
1167 fprintf( stderr,
"Generated date acceptance pattern: '%s' from '%s' (formatindex=\"%d\" and defined DateSeparator '%s')\n",
1169 int(cssi::NumberFormatIndex::DATE_SYS_DDMMYYYY),
1170 OSTR( OUString(&cDateSep, 1)));
1172 theDateAcceptancePatterns.insert( theDateAcceptancePatterns.begin(), aPattern);
1174 if (!aPatternBuf2.isEmpty())
1176 OUString aPattern2( aPatternBuf2.makeStringAndClear());
1177 if (aPattern2.getLength() < 5)
1179 incErrorStr(
"Error: failed to extract 2nd date acceptance pattern: %s\n", aPattern2);
1180 fprintf( stderr,
" with DateSeparator '%s' from FormatCode '%s' (formatindex=\"%d\")\n",
1182 int(cssi::NumberFormatIndex::DATE_SYS_DDMMYYYY));
1186 fprintf( stderr,
"Generated 2nd acceptance pattern: '%s' from '%s' (formatindex=\"%d\")\n",
1188 int(cssi::NumberFormatIndex::DATE_SYS_DDMMYYYY));
1189 theDateAcceptancePatterns.insert( theDateAcceptancePatterns.begin(), aPattern2);
1198 for (
auto const& elem : theDateAcceptancePatterns)
1200 if (elem.getLength() == (cDecSep <= 0xffff ? 3 : 4))
1202 if (elem.iterateCodePoints( &
o3tl::temporary(sal_Int32(1))) == cDecSep)
1205 fprintf( stderr,
"Error: Date acceptance pattern '%s' matches decimal number '#%s#'\n",
1213 for (vector<OUString>::const_iterator aIt = theDateAcceptancePatterns.begin();
1214 aIt != theDateAcceptancePatterns.end(); ++aIt)
1216 for (vector<OUString>::iterator aComp = theDateAcceptancePatterns.begin();
1217 aComp != theDateAcceptancePatterns.end(); )
1219 if (aIt != aComp && *aIt == *aComp)
1221 incErrorStr(
"Error: Duplicated DateAcceptancePattern: %s\n", *aComp);
1222 aComp = theDateAcceptancePatterns.erase( aComp);
1229 sal_Int16 nbOfDateAcceptancePatterns =
static_cast<sal_Int16
>(theDateAcceptancePatterns.size());
1231 for (sal_Int16
i = 0;
i < nbOfDateAcceptancePatterns; ++
i)
1233 of.
writeParameter(
"DateAcceptancePattern", theDateAcceptancePatterns[
i], i);
1236 of.
writeAsciiString(
"static const sal_Int16 DateAcceptancePatternsCount = ");
1237 of.
writeInt( nbOfDateAcceptancePatterns);
1240 of.
writeAsciiString(
"static const sal_Unicode* DateAcceptancePatternsArray[] = {\n");
1241 for (sal_Int16
i = 0;
i < nbOfDateAcceptancePatterns; ++
i)
1250 of.
writeFunction(
"getDateAcceptancePatterns_",
"DateAcceptancePatternsCount",
"DateAcceptancePatternsArray");
1259 if (!useLocale.isEmpty()) {
1260 useLocale = useLocale.replace(
'-',
'_');
1265 sal_Int16 nbOfCollations = 0;
1266 sal_Int16 nbOfCollationOptions = 0;
1270 if( currNode->
getName() ==
"Collator" )
1283 if( currNode->
getName() ==
"CollationOptions" )
1286 nbOfCollationOptions = sal::static_int_cast<sal_Int16>( pCollationOptions->
getNumberOfChildren() );
1287 for( sal_Int16
i=0;
i<nbOfCollationOptions;
i++ )
1293 of.
writeInt( nbOfCollationOptions );
1301 of.
writeAsciiString(
"\nstatic const sal_Unicode* LCCollatorArray[] = {\n");
1302 for(sal_Int16 j = 0; j < nbOfCollations; j++) {
1318 for( sal_Int16 j=0; j<nbOfCollationOptions; j++ )
1325 of.
writeFunction(
"getCollatorImplementation_",
"nbOfCollations",
"LCCollatorArray");
1326 of.
writeFunction(
"getCollationOptions_",
"nbOfCollationOptions",
"collationOptions");
1332 if (!useLocale.isEmpty()) {
1333 useLocale = useLocale.replace(
'-',
'_');
1342 stderr,
"Error: LC_SEARCH: more than 1 child: %" SAL_PRIdINT32
"\n",
1348 for( i=0; i<nSearchOptions; i++ )
1354 of.
writeInt( sal::static_int_cast<sal_Int16>( nSearchOptions ) );
1358 for( i=0; i<nSearchOptions; i++ )
1361 of.
writeInt( sal::static_int_cast<sal_Int16>(i) );
1365 of.
writeFunction(
"getSearchOptions_",
"nbOfSearchOptions",
"searchOptions");
1371 if (!useLocale.isEmpty()) {
1372 useLocale = useLocale.replace(
'-',
'_');
1378 sal_Int16 nbOfIndexs = 0;
1379 sal_Int16 nbOfUnicodeScripts = 0;
1380 sal_Int16 nbOfPageWords = 0;
1383 if( currNode->
getName() ==
"IndexKey" )
1400 if( currNode->
getName() ==
"UnicodeScript" )
1403 nbOfUnicodeScripts++;
1406 if( currNode->
getName() ==
"FollowPageWord" )
1417 for(sal_Int16
i = 0;
i < nbOfIndexs;
i++) {
1445 for( sal_Int16
i=0;
i<nbOfUnicodeScripts;
i++ )
1457 of.
writeAsciiString(
"static const sal_Unicode* FollowPageWordArray[] = {\n");
1458 for(sal_Int16
i = 0;
i < nbOfPageWords;
i++) {
1465 of.
writeFunction(
"getIndexAlgorithm_",
"nbOfIndexs",
"IndexArray");
1466 of.
writeFunction(
"getUnicodeScripts_",
"nbOfUnicodeScripts",
"UnicodeScriptArray");
1467 of.
writeFunction(
"getFollowPageWords_",
"nbOfPageWords",
"FollowPageWordArray");
1472 const char* elementTag, sal_Int16 i, sal_Int16 j )
1478 if ( p && p->
getName() ==
"DefaultNarrowName" )
1482 sal_uInt32 nChar = aFullName.iterateCodePoints( &
o3tl::temporary(sal_Int32(0)));
1483 aNarrName = OUString( &nChar, 1);
1485 of.
writeParameter( elementTag,
"DefaultAbbrvName", aAbbrName, i, j);
1486 of.
writeParameter( elementTag,
"DefaultFullName", aFullName, i, j);
1487 of.
writeParameter( elementTag,
"DefaultNarrowName", aNarrName, i, j);
1498 const char* pTag,
const char* pStr, sal_Int16 i, sal_Int16 j )
1505 const char* elementTag, sal_Int16 i,
bool bNarrow )
1516 for (sal_Int16 j = 0; j < nCount; j++)
1528 const LocaleNode* pNode, sal_Int16 nChild, std::u16string_view rCalendarID )
const
1538 if (bFound && (!pNode || pNode->
getName() != rName))
1541 incErrorStrStr(
"Error: <%s> element expected in calendar '%s'\n", rName, rCalendarID);
1548 if (!useLocale.isEmpty()) {
1549 useLocale = useLocale.replace(
'-',
'_');
1555 std::unique_ptr<sal_Int16[]> nbOfDays(
new sal_Int16[nbOfCalendars] );
1556 std::unique_ptr<sal_Int16[]> nbOfMonths(
new sal_Int16[nbOfCalendars] );
1557 std::unique_ptr<sal_Int16[]> nbOfGenitiveMonths(
new sal_Int16[nbOfCalendars] );
1558 std::unique_ptr<sal_Int16[]> nbOfPartitiveMonths(
new sal_Int16[nbOfCalendars] );
1559 std::unique_ptr<sal_Int16[]> nbOfEras(
new sal_Int16[nbOfCalendars] );
1564 std::map< OUString, bool > aCalendars;
1565 aCalendars[
"buddhist"] =
false;
1566 aCalendars[
"gengou"] =
false;
1567 aCalendars[
"gregorian"] =
false;
1568 aCalendars[
"hanja"] =
false;
1569 aCalendars[
"hanja_yoil"] =
false;
1570 aCalendars[
"hijri"] =
false;
1571 aCalendars[
"jewish"] =
false;
1572 aCalendars[
"ROC"] =
false;
1574 aCalendars[
"dangi"] =
false;
1575 aCalendars[
"persian"] =
false;
1579 bool bHasGregorian =
false;
1582 for ( i = 0; i < nbOfCalendars; i++) {
1586 bool bGregorian = calendarID ==
"gregorian";
1588 bHasGregorian = bGregorian;
1589 auto calIt = aCalendars.find(calendarID);
1590 if (calIt == aCalendars.end())
1591 incErrorStr(
"Error: unknown Calendar unoid: %s\n", calendarID);
1592 else if (calIt->second)
1593 incErrorStr(
"Error: duplicate Calendar unoid: %s\n", calendarID);
1595 calIt->second =
true;
1599 sal_Int16 nChild = 0;
1602 const char *elementTag;
1605 ref_name = ref_name.replace(
'-',
'_');
1606 if (!ref_name.isEmpty() && i > 0) {
1607 for (j = 0; j < i; j++) {
1609 if (str == ref_name)
1613 if (!ref_name.isEmpty() && daysNode ==
nullptr) {
1618 if (daysNode ==
nullptr)
1621 if (bGregorian && nbOfDays[i] != 7)
1622 incErrorInt(
"Error: A Gregorian calendar must have 7 days per week, this one has %d\n", nbOfDays[i]);
1624 for (j = 0; j < nbOfDays[i]; j++) {
1628 if ( j == 0 && bGregorian && dayID !=
"sun" )
1629 incError(
"First day of a week of a Gregorian calendar must be <DayID>sun</DayID>");
1638 ref_name = ref_name.replace(
'-',
'_');
1639 if (!ref_name.isEmpty() && i > 0) {
1640 for (j = 0; j < i; j++) {
1642 if (str == ref_name)
1646 if (!ref_name.isEmpty() && monthsNode ==
nullptr) {
1651 if (monthsNode ==
nullptr)
1654 if (bGregorian && nbOfMonths[i] != 12)
1655 incErrorInt(
"Error: A Gregorian calendar must have 12 months, this one has %d\n", nbOfMonths[i]);
1656 elementTag =
"month";
1657 for (j = 0; j < nbOfMonths[i]; j++) {
1661 if ( j == 0 && bGregorian && monthID !=
"jan" )
1662 incError(
"First month of a year of a Gregorian calendar must be <MonthID>jan</MonthID>");
1674 ref_name = ref_name.replace(
'-',
'_');
1675 if (!ref_name.isEmpty() && i > 0) {
1676 for (j = 0; j < i; j++) {
1678 if (str == ref_name)
1682 if (!ref_name.isEmpty() && genitiveMonthsNode ==
nullptr) {
1685 nbOfGenitiveMonths[i] = 0;
1687 if (genitiveMonthsNode ==
nullptr)
1688 genitiveMonthsNode = calNode ->
getChildAt(nChild);
1689 nbOfGenitiveMonths[i] = sal::static_int_cast<sal_Int16>( genitiveMonthsNode->
getNumberOfChildren() );
1690 if (bGregorian && nbOfGenitiveMonths[i] != 12)
1691 incErrorInt(
"Error: A Gregorian calendar must have 12 genitive months, this one has %d\n", nbOfGenitiveMonths[i]);
1692 elementTag =
"genitiveMonth";
1693 for (j = 0; j < nbOfGenitiveMonths[i]; j++) {
1697 if ( j == 0 && bGregorian && genitiveMonthID !=
"jan" )
1698 incError(
"First genitive month of a year of a Gregorian calendar must be <MonthID>jan</MonthID>");
1711 ref_name = ref_name.replace(
'-',
'_');
1712 if (!ref_name.isEmpty() && i > 0) {
1713 for (j = 0; j < i; j++) {
1715 if (str == ref_name)
1719 if (!ref_name.isEmpty() && partitiveMonthsNode ==
nullptr) {
1722 nbOfPartitiveMonths[i] = 0;
1724 if (partitiveMonthsNode ==
nullptr)
1725 partitiveMonthsNode = calNode ->
getChildAt(nChild);
1726 nbOfPartitiveMonths[i] = sal::static_int_cast<sal_Int16>( partitiveMonthsNode->
getNumberOfChildren() );
1727 if (bGregorian && nbOfPartitiveMonths[i] != 12)
1728 incErrorInt(
"Error: A Gregorian calendar must have 12 partitive months, this one has %d\n", nbOfPartitiveMonths[i]);
1729 elementTag =
"partitiveMonth";
1730 for (j = 0; j < nbOfPartitiveMonths[i]; j++) {
1734 if ( j == 0 && bGregorian && partitiveMonthID !=
"jan" )
1735 incError(
"First partitive month of a year of a Gregorian calendar must be <MonthID>jan</MonthID>");
1744 ref_name = ref_name.replace(
'-',
'_');
1745 if (!ref_name.isEmpty() && i > 0) {
1746 for (j = 0; j < i; j++) {
1748 if (str == ref_name)
1752 if (!ref_name.isEmpty() && erasNode ==
nullptr) {
1757 if (erasNode ==
nullptr)
1766 if (bGregorian && nbOfEras[i] != 2)
1767 incErrorInt(
"Error: A Gregorian calendar must have 2 eras, this one has %d\n", nbOfEras[i]);
1769 for (j = 0; j < nbOfEras[i]; j++) {
1777 if ( j == 0 && bGregorian && eraID !=
"bc" )
1778 incError(
"First era of a Gregorian calendar must be <EraID>bc</EraID>");
1779 if ( j == 1 && bGregorian && eraID !=
"ad" )
1780 incError(
"Second era of a Gregorian calendar must be <EraID>ad</EraID>");
1794 for (j = 0; j < nbOfDays[i]; j++)
1801 if (j >= nbOfDays[i])
1802 incErrorStr(
"Error: <StartDayOfWeek> <DayID> must be one of the <DaysOfWeek>, but is: %s\n", str);
1811 sal_Int16 nDays = sal::static_int_cast<sal_Int16>( str.toInt32() );
1812 if (nDays < 1 || (0 < nbOfDays[i] && nbOfDays[i] < nDays))
1813 incErrorInt(
"Error: Bad value of MinimalDaysInFirstWeek: %d, must be 1 <= value <= days_in_week\n",
1819 fprintf( stderr,
"Warning: %s\n",
"No Gregorian calendar defined, are you sure?");
1826 for(i = 0; i < nbOfCalendars - 1; i++) {
1834 for(i = 0; i < nbOfCalendars - 1; i++) {
1842 for(i = 0; i < nbOfCalendars - 1; i++) {
1843 of.
writeInt(nbOfGenitiveMonths[i]);
1846 of.
writeInt(nbOfGenitiveMonths[i]);
1850 for(i = 0; i < nbOfCalendars - 1; i++) {
1851 of.
writeInt(nbOfPartitiveMonths[i]);
1854 of.
writeInt(nbOfPartitiveMonths[i]);
1858 for(i = 0; i < nbOfCalendars - 1; i++) {
1872 for(i = 0; i < nbOfCalendars; i++) {
1889 of.
writeFunction(
"getAllCalendars_",
"calendarsCount",
"calendars");
1895 return rStr.getLength() == 3
1896 &&
'A' <= p[0] && p[0] <=
'Z'
1897 &&
'A' <= p[1] && p[1] <=
'Z'
1898 &&
'A' <= p[2] && p[2] <=
'Z'
1905 if (!useLocale.isEmpty()) {
1906 useLocale = useLocale.replace(
'-',
'_');
1910 sal_Int16 nbOfCurrencies = 0;
1913 bool bTheDefault=
false;
1914 bool bTheCompatible =
false;
1920 bool bCompatible = of.
writeDefaultParameter(
"CurrencyUsedInCompatibleFormatCodes", str, nbOfCurrencies);
1923 if (bLegacy && (bDefault || bCompatible))
1924 incError(
"Currency: if legacyOnly==true, both 'default' and 'usedInCompatibleFormatCodes' must be false.");
1928 incError(
"Currency: more than one default currency.");
1934 incError(
"Currency: more than one currency flagged as usedInCompatibleFormatCodes.");
1935 bTheCompatible =
true;
1941 incError(
"CurrencyID is not ISO 4217");
1955 incError(
"BankSymbol is not ISO 4217");
1959 sal_Int16 nDecimalPlaces =
static_cast<sal_Int16
>(str.toInt32());
1965 incError(
"Currency: no default currency.");
1966 if (!bTheCompatible)
1967 incError(
"Currency: no currency flagged as usedInCompatibleFormatCodes.");
1973 for(sal_Int16
i = 0;
i < nbOfCurrencies;
i++) {
2000 of.
writeFunction(
"getAllCurrencies_",
"currencyCount",
"currencies");
2006 if (!useLocale.isEmpty()) {
2007 useLocale = useLocale.replace(
'-',
'_');
2011 sal_Int16 nbOfModules = 0;
2023 of.
writeAsciiString(
"\nstatic const sal_Unicode* LCTransliterationsArray[] = {\n");
2024 for( sal_Int16
i = 0;
i < nbOfModules;
i++) {
2030 of.
writeFunction(
"getTransliterations_",
"nbOfTransliterations",
"LCTransliterationsArray");
2035 struct NameValuePair {
2043 {
"trueWord",
"true" },
2044 {
"falseWord",
"false" },
2045 {
"quarter1Word",
"1st quarter" },
2046 {
"quarter2Word",
"2nd quarter" },
2047 {
"quarter3Word",
"3rd quarter" },
2048 {
"quarter4Word",
"4th quarter" },
2049 {
"aboveWord",
"above" },
2050 {
"belowWord",
"below" },
2051 {
"quarter1Abbreviation",
"Q1" },
2052 {
"quarter2Abbreviation",
"Q2" },
2053 {
"quarter3Abbreviation",
"Q3" },
2054 {
"quarter4Abbreviation",
"Q4" }
2060 if (!useLocale.isEmpty()) {
2061 useLocale = useLocale.replace(
'-',
'_');
2069 incError(
"No ReservedWords element.");
2073 bool bEnglishLocale = (strncmp( of.
getLocale(),
"en_", 3) == 0);
2075 sal_Int16 nbOfWords = 0;
2079 for ( i = 0; i < sal_Int16(
SAL_N_ELEMENTS(ReserveWord)); i++,nbOfWords++) {
2081 ReserveWord[i].
name) :
nullptr);
2084 "Warning: No %s in ReservedWords, using en_US default: \"%s\".\n",
2085 ReserveWord[i].name, ReserveWord[i].
value);
2086 str = curNode ? curNode ->
getValue() : OUString::createFromAscii(ReserveWord[i].value);
2090 fprintf( stderr,
"Error: No content for ReservedWords %s.\n", ReserveWord[i].name);
2094 if (!bEnglishLocale && curNode && i <= 7 &&
2095 str.equalsIgnoreAsciiCaseAscii( ReserveWord[i].value))
2098 "Warning: ReservedWord %s seems to be untranslated \"%s\".\n",
2099 ReserveWord[i].name, ReserveWord[i].value);
2105 of.
writeAsciiString(
"\nstatic const sal_Unicode* LCReservedWordsArray[] = {\n");
2106 for( i = 0; i < nbOfWords; i++) {
2112 of.
writeFunction(
"getReservedWords_",
"nbOfReservedWords",
"LCReservedWordsArray");
2123 of.
writeAsciiString(
"\nstatic const sal_Unicode* LCForbiddenCharactersArray[] = {\n");
2128 of.
writeFunction(
"getForbiddenCharacters_",
"3",
"LCForbiddenCharactersArray");
2143 of.
writeAsciiString(
"\nstatic const sal_Unicode* LCBreakIteratorRulesArray[] = {\n");
2150 of.
writeFunction(
"getBreakIteratorRules_",
"5",
"LCBreakIteratorRulesArray");
2158 if (!useLocale.isEmpty()) {
2159 useLocale = useLocale.replace(
'-',
'_');
2166 const char* attr[ nAttributes ] = {
"Prefix",
"NumType",
"Suffix",
"Transliteration",
"NatNum" };
2173 for( i = 0; i < nStyles; ++i )
2176 for( sal_Int32 j=0; j<nAttributes; ++j )
2178 const char*
name = attr[j];
2180 of.
writeParameter(
"continuous", name, value, sal::static_int_cast<sal_Int16>(i) );
2186 of.
writeInt( sal::static_int_cast<sal_Int16>( nStyles ) );
2188 of.
writeAsciiString(
"static const sal_Int16 continuousNbOfAttributesPerStyle = ");
2193 for( i=0; i<nStyles; i++ )
2196 of.
writeInt( sal::static_int_cast<sal_Int16>(i) );
2198 for( sal_Int32 j=0; j<nAttributes; j++)
2203 of.
writeInt(sal::static_int_cast<sal_Int16>(i));
2211 of.
writeAsciiString(
"static const sal_Unicode** LCContinuousNumberingLevelsArray[] = {\n" );
2212 for( i=0; i<nStyles; i++ )
2216 of.
writeInt( sal::static_int_cast<sal_Int16>(i) );
2220 of.
writeFunction2(
"getContinuousNumberingLevels_",
"continuousNbOfStyles",
2221 "continuousNbOfAttributesPerStyle",
"LCContinuousNumberingLevelsArray");
2229 if (!useLocale.isEmpty()) {
2230 useLocale = useLocale.replace(
'-',
'_');
2237 const char* attr[ nAttributes ] =
2246 "SymbolTextDistance",
2255 vector<sal_Int32> nLevels;
2256 for( sal_Int32
i = 0;
i < nStyles;
i++ )
2260 for( sal_Int32 j=0; j<nLevels.back(); j++ )
2263 for( sal_Int32 k=0; k<nAttributes; ++k )
2265 const char*
name = attr[k];
2268 sal::static_int_cast<sal_Int16>(
i),
2269 sal::static_int_cast<sal_Int16>(j) );
2275 for(
size_t i=0;
i<nLevels.size();
i++ )
2277 if( nLevels[0] != nLevels[
i] )
2279 incError(
"Numbering levels don't match.");
2285 of.
writeInt( sal::static_int_cast<sal_Int16>( nStyles ) );
2287 of.
writeAsciiString(
"static const sal_Int16 outlineNbOfLevelsPerStyle = ");
2288 of.
writeInt( sal::static_int_cast<sal_Int16>( nLevels.back() ) );
2290 of.
writeAsciiString(
"static const sal_Int16 outlineNbOfAttributesPerLevel = ");
2304 for( sal_Int32
i=0;
i<nStyles;
i++ )
2306 for( sal_Int32 j=0; j<nLevels.back(); j++ )
2310 of.
writeInt( sal::static_int_cast<sal_Int16>(
i) );
2312 of.
writeInt( sal::static_int_cast<sal_Int16>(j) );
2315 for( sal_Int32 k=0; k<nAttributes; k++ )
2319 of.
writeInt( sal::static_int_cast<sal_Int16>(
i) );
2320 of.
writeInt( sal::static_int_cast<sal_Int16>(j) );
2330 for( sal_Int32
i=0;
i<nStyles;
i++ )
2334 of.
writeInt( sal::static_int_cast<sal_Int16>(
i) );
2337 for( sal_Int32 j=0; j<nLevels.back(); j++ )
2340 of.
writeInt( sal::static_int_cast<sal_Int16>(
i) );
2342 of.
writeInt( sal::static_int_cast<sal_Int16>(j) );
2349 of.
writeAsciiString(
"static const sal_Unicode*** LCOutlineNumberingLevelsArray[] = {\n" );
2350 for( sal_Int32
i=0;
i<nStyles;
i++ )
2354 of.
writeInt( sal::static_int_cast<sal_Int16>(
i) );
2358 of.
writeFunction3(
"getOutlineNumberingLevels_",
"outlineNbOfStyles",
"outlineNbOfLevelsPerStyle",
2359 "outlineNbOfAttributesPerLevel",
"LCOutlineNumberingLevelsArray");
2363 sal_Int16 len = attr->getLength();
2365 value.realloc (len);
2366 for (sal_Int16
i =0;
i< len;
i++) {
2367 name[
i] = attr->getNameByIndex(
i);
2373 auto pName = std::find_if(std::cbegin(
name), std::cend(
name),
2374 [&str](
const OUString& rName) {
return rName.equalsAscii(str); });
2377 auto i =
static_cast<sal_Int32
>(std::distance(std::cbegin(
name),
pName));
static LocaleNode * createNode(const OUString &name, const Reference< XAttributeList > &attr)
Sequence< OUString > name
virtual void generateCode(const OFileWriter &of) const override
virtual void generateCode(const OFileWriter &of) const override
const OUString & getName() const
const OUString & getValueByIndex(sal_Int32 idx) const
virtual void generateCode(const OFileWriter &of) const override
void addChild(LocaleNode *node)
constexpr sal_Int16 nFirstFreeFormatIndex
The number of reserved (with defined meaning) built-in format code indices, additional locale data fo...
void writeIntParameter(const char *pAsciiStr, const sal_Int16 count, sal_Int16 val) const
void incErrorStr(const char *pStr, std::u16string_view rVal) const
const OUString & getValue() const
const NameValuePair ReserveWord[]
virtual void generateCode(const OFileWriter &of) const override
void writeRefFunction3(const char *func, std::u16string_view useLocale) const
static bool isIso4217(const OUString &rStr)
const Attr & getAttr() const
static void lcl_writeTabTagStringNums(const OFileWriter &of, const char *pTag, const char *pStr, sal_Int16 i, sal_Int16 j)
#define SAL_N_ELEMENTS(arr)
static void lcl_writeTabTagString(const OFileWriter &of, const char *pTag, const char *pStr)
virtual void generateCode(const OFileWriter &of) const
OUString writeParameterCheckLen(const OFileWriter &of, const char *pParameterName, const LocaleNode *pNode, sal_Int32 nMinLen, sal_Int32 nMaxLen) const
void writeParameter(const char *pAsciiStr, const OUString &aChars) const
void writeAsciiString(const char *str) const
static void lcl_writeAbbrFullNarrNames(const OFileWriter &of, const LocaleNode *currNode, const char *elementTag, sal_Int16 i, sal_Int16 j)
virtual void generateCode(const OFileWriter &of) const override
void incError(const char *pStr) const
void writeRefFunction2(const char *func, std::u16string_view useLocale) const
Attr(const Reference< XAttributeList > &attr)
void writeFunction(const char *func, const char *count, const char *array) const
void incErrorInt(const char *pStr, int nVal) const
virtual void generateCode(const OFileWriter &of) const override
virtual void generateCode(const OFileWriter &of) const override
constexpr T & temporary(T &&x)
void writeInt(sal_Int16 nb) const
virtual void generateCode(const OFileWriter &of) const override
static void lcl_writeAbbrFullNarrArrays(const OFileWriter &of, sal_Int16 nCount, const char *elementTag, sal_Int16 i, bool bNarrow)
::o3tl::sorted_vector< OUString > NameSet
sal_Int32 getNumberOfChildren() const
virtual void generateCode(const OFileWriter &of) const override
void writeRefFunction(const char *func, std::u16string_view useLocale) const
const LocaleNode * findNode(const char *name) const
Sequence< OUString > value
static OUString sTheCompatibleCurrency
#define LOCALE_VERSION_DTD
OUString getValueByName(const char *str) const
LocaleNode * getChildAt(sal_Int32 idx) const
bool expectedCalendarElement(std::u16string_view rName, const LocaleNode *pNode, sal_Int16 nChild, std::u16string_view rCalendarID) const
void incErrorStrStr(const char *pStr, std::u16string_view rVal1, std::u16string_view rVal2) const
bool writeDefaultParameter(const char *pAsciiStr, std::u16string_view str, sal_Int16 count) const
void writeFunction3(const char *func, const char *style, const char *levels, const char *attr, const char *array) const
std::vector< std::unique_ptr< LocaleNode > > children
const char * getLocale() const
Return the locale string, something like en_US or de_DE.
constexpr sal_Int16 nStopPredefinedFormatIndex
The number of predefined format code indices that must be defined by locale data, except BOOLEAN and ...
LocaleNode(const OUString &name, const Reference< XAttributeList > &attr)
void writeFunction2(const char *func, const char *style, const char *attr, const char *array) const
std::pair< const_iterator, bool > insert(Value &&x)
static OUString sTheCurrencyReplaceTo
virtual void generateCode(const OFileWriter &of) const override
const LocaleNode * getRoot() const
virtual void generateCode(const OFileWriter &of) const override
std::vector< sal_Int16 >::const_iterator const_iterator
::o3tl::sorted_vector< sal_Int16 > ValueSet
static OUString sTheDateEditFormat