29#include <rtl/ustrbuf.hxx>
35#include <com/sun/star/i18n/NumberFormatIndex.hpp>
36#include <com/sun/star/xml/sax/XAttributeList.hpp>
39#define LOCALE_VERSION_DTD "2.0.3"
41typedef ::o3tl::sorted_vector< OUString >
NameSet;
42typedef ::o3tl::sorted_vector< sal_Int16 >
ValueSet;
44namespace cssi = ::com::sun::star::i18n;
71 while ( (pParent = pParent->
parent) !=
nullptr )
94 if (
name ==
"LC_INFO" )
96 if (
name ==
"LC_CTYPE" )
98 if (
name ==
"LC_FORMAT" )
100 if (
name ==
"LC_FORMAT_1" )
102 if (
name ==
"LC_CALENDAR" )
104 if (
name ==
"LC_CURRENCY" )
106 if (
name ==
"LC_TRANSLITERATION" )
108 if (
name ==
"LC_COLLATION" )
110 if (
name ==
"LC_INDEX" )
112 if (
name ==
"LC_SEARCH" )
114 if (
name ==
"LC_MISC" )
116 if (
name ==
"LC_NumberingLevel" )
118 if (
name ==
"LC_OutLineNumberingLevel" )
128#define OSTR(s) (OUStringToOString( (s), RTL_TEXTENCODING_UTF8).getStr())
136 fprintf( stderr,
"Error: Locale versionDTD is not %s, see comment in locale.dtd\n",
LOCALE_VERSION_DTD);
145 const char* pParameterName,
const LocaleNode* pNode,
146 sal_Int32 nMinLen, sal_Int32 nMaxLen )
const
151 else if (nMinLen >= 0)
154 fprintf( stderr,
"Error: node NULL pointer for parameter %s.\n",
159 sal_Int32 nLen = aVal.getLength();
163 fprintf( stderr,
"Error: less than %" SAL_PRIdINT32
" character%s (%" SAL_PRIdINT32
") in %s '%s'.\n",
164 nMinLen, (nMinLen > 1 ?
"s" :
""),
169 else if (nLen > nMaxLen && nMaxLen >= 0)
173 "Error: more than %" SAL_PRIdINT32
" character%s (%" SAL_PRIdINT32
") in %s '%s' not supported by application.\n",
174 nMaxLen, (nMaxLen > 1 ?
"s" :
""),
184 const char* pNodeName,
const char* pParameterName,
185 sal_Int32 nMinLen, sal_Int32 nMaxLen )
const
189 if (pNode || nMinLen < 0)
194 fprintf( stderr,
"Error: node %s not found.\n", pNodeName);
204 fprintf( stderr,
"Error: %s\n", pStr);
215 fprintf( stderr, pStr, nVal);
221 fprintf( stderr, pStr,
OSTR( rVal));
227 fprintf(stderr, pStr,
OSTR(rVal1),
OSTR(rVal2));
242 if (aLanguage.getLength() != 2 && aLanguage.getLength() != 3)
243 incErrorStr(
"Error: langID '%s' not 2-3 characters\n", aLanguage);
252 if (!(aCountry.isEmpty() || aCountry.getLength() == 2))
253 incErrorStr(
"Error: countryID '%s' not empty or more than 2 characters\n", aCountry);
262 const OUString& aVariant( variantNode->
getValue());
263 if (!(aVariant.isEmpty() || (aVariant.getLength() >= 7 && aVariant.indexOf(
'-') >= 2)))
264 incErrorStr(
"Error: invalid Variant '%s'\n", aVariant);
265 if (!(aVariant.isEmpty() || aLanguage ==
"qlt"))
266 incErrorStrStr(
"Error: Variant '%s' given but Language '%s' is not 'qlt'\n", aVariant, aLanguage);
278 of.
writeFunction(
"getLCInfo_",
"SAL_N_ELEMENTS(LCInfoArray)",
"LCInfoArray");
289 if (!useLocale.isEmpty()) {
290 useLocale = useLocale.replace(
'-',
'_');
304 OUString aDecSepAlt =
308 OUString aTime100Sep =
315 sepNode =
findNode(
"LongDateDayOfWeekSeparator");
319 fprintf( stderr,
"Warning: %s\n",
320 "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\".");
322 sepNode =
findNode(
"LongDateDaySeparator");
325 if (aLDS ==
"," || aLDS ==
".")
326 fprintf( stderr,
"Warning: %s\n",
327 "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\".");
329 sepNode =
findNode(
"LongDateMonthSeparator");
333 fprintf( stderr,
"Warning: %s\n",
334 "LongDateMonthSeparator is empty. Usually this is not the case and may lead to concatenated display names like \"Wednesday, May9, 2007\".");
336 sepNode =
findNode(
"LongDateYearSeparator");
340 fprintf( stderr,
"Warning: %s\n",
341 "LongDateYearSeparator is empty. Usually this is not the case and may lead to concatenated display names like \"Wednesday, 2007May 9\".");
346 incError(
"DateSeparator equals TimeSeparator.");
348 incError(
"DecimalSeparator equals ThousandSeparator.");
349 if (aDecSepAlt == aThoSep)
350 incError(
"DecimalSeparatorAlternative equals ThousandSeparator.");
352 incError(
"DecimalSeparatorAlternative equals DecimalSeparator, it must not be specified then.");
353 if ( aThoSep ==
" " )
354 incError(
"ThousandSeparator is an ' ' ordinary space, this should be a non-breaking space U+00A0 instead.");
356 fprintf( stderr,
"Warning: %s\n",
357 "ListSeparator equals DecimalSeparator.");
358 if (aListSep == aThoSep)
359 fprintf( stderr,
"Warning: %s\n",
360 "ListSeparator equals ThousandSeparator.");
361 if (aListSep.getLength() != 1 || aListSep[0] !=
';')
363 incError(
"ListSeparator not ';' semicolon. Strongly recommended. Currently required.");
366 if (aTimeSep == aTime100Sep)
369 fprintf( stderr,
"Warning: %s\n",
370 "Time100SecSeparator equals TimeSeparator, this is probably an error.");
375 fprintf( stderr,
"Warning: %s\n",
376 "Time100SecSeparator is different from DecimalSeparator, this may be correct or not. Intended?");
378 if (nSavErr !=
nError || nWarn)
379 fprintf( stderr,
"Warning: %s\n",
380 "Don't forget to adapt corresponding FormatCode elements when changing separators.");
382 OUString aQuoteStart =
386 OUString aDoubleQuoteStart =
388 OUString aDoubleQuoteEnd =
391 if (aQuoteStart.toChar() <= 127 && aQuoteEnd.toChar() > 127)
392 fprintf( stderr,
"Warning: %s\n",
393 "QuotationStart is an ASCII character but QuotationEnd is not.");
394 if (aQuoteEnd.toChar() <= 127 && aQuoteStart.toChar() > 127)
395 fprintf( stderr,
"Warning: %s\n",
396 "QuotationEnd is an ASCII character but QuotationStart is not.");
397 if (aDoubleQuoteStart.toChar() <= 127 && aDoubleQuoteEnd.toChar() > 127)
398 fprintf( stderr,
"Warning: %s\n",
399 "DoubleQuotationStart is an ASCII character but DoubleQuotationEnd is not.");
400 if (aDoubleQuoteEnd.toChar() <= 127 && aDoubleQuoteStart.toChar() > 127)
401 fprintf( stderr,
"Warning: %s\n",
402 "DoubleQuotationEnd is an ASCII character but DoubleQuotationStart is not.");
403 if (aQuoteStart.toChar() <= 127 && aQuoteEnd.toChar() <= 127)
404 fprintf( stderr,
"Warning: %s\n",
405 "QuotationStart and QuotationEnd are both ASCII characters. Not necessarily an issue, but unusual.");
406 if (aDoubleQuoteStart.toChar() <= 127 && aDoubleQuoteEnd.toChar() <= 127)
407 fprintf( stderr,
"Warning: %s\n",
408 "DoubleQuotationStart and DoubleQuotationEnd are both ASCII characters. Not necessarily an issue, but unusual.");
409 if (aQuoteStart == aQuoteEnd)
410 fprintf( stderr,
"Warning: %s\n",
411 "QuotationStart equals QuotationEnd. Not necessarily an issue, but unusual.");
412 if (aDoubleQuoteStart == aDoubleQuoteEnd)
413 fprintf( stderr,
"Warning: %s\n",
414 "DoubleQuotationStart equals DoubleQuotationEnd. Not necessarily an issue, but unusual.");
417 if (aQuoteStart == aDoubleQuoteStart)
418 fprintf( stderr,
"Warning: %s\n",
419 "QuotationStart equals DoubleQuotationStart. Not necessarily an issue, but unusual.");
420 if (aQuoteEnd == aDoubleQuoteEnd)
421 fprintf( stderr,
"Warning: %s\n",
422 "QuotationEnd equals DoubleQuotationEnd. Not necessarily an issue, but unusual.");
424 switch (
int ic = aQuoteStart.toChar())
435 fprintf( stderr,
"Warning: %s U+%04X %s\n",
436 "QuotationStart may be wrong:", ic,
OSTR( aQuoteStart));
438 switch (
int ic = aQuoteEnd.toChar())
449 fprintf( stderr,
"Warning: %s U+%04X %s\n",
450 "QuotationEnd may be wrong:", ic,
OSTR( aQuoteEnd));
452 switch (
int ic = aDoubleQuoteStart.toChar())
463 fprintf( stderr,
"Warning: %s U+%04X %s\n",
464 "DoubleQuotationStart may be wrong:", ic,
OSTR( aDoubleQuoteStart));
466 switch (
int ic = aDoubleQuoteEnd.toChar())
477 fprintf( stderr,
"Warning: %s U+%04X %s\n",
478 "DoubleQuotationEnd may be wrong:", ic,
OSTR( aDoubleQuoteEnd));
483 sepNode =
findNode(
"MeasurementSystem");
507 of.
writeFunction(
"getLocaleItem_",
"SAL_N_ELEMENTS(LCType)",
"LCType");
521 incError(
"more than 2 LC_FORMAT sections");
523 ::std::vector< OUString > theDateAcceptancePatterns;
525 OUString useLocale(
getAttr().getValueByName(
"ref"));
528 OUString strFrom(
getAttr().getValueByName(
"replaceFrom"));
529 if (useLocale.isEmpty())
534 if (!strFrom.isEmpty() && str.isEmpty())
535 incErrorStr(
"replaceFrom=\"%s\" replaceTo=\"\" is empty replacement.\n", strFrom);
537 if (str.endsWithIgnoreAsciiCase(
"-FFFF]"))
538 incErrorStr(
"replaceTo=\"%s\" needs FFFF to be adapted to the real LangID value.\n", str);
541 if ( strFrom ==
"[CURRENCY]" )
544 if (str.startsWith(
"[$" ))
546 sal_Int32 nHyphen = str.indexOf(
'-');
553 if (!useLocale.isEmpty())
555 if (!strFrom.isEmpty() && strFrom !=
"[CURRENCY]")
558 "Error: non-empty replaceFrom=\"%s\" with non-empty ref=\"%s\".",
561 useLocale = useLocale.replace(
'-',
'_');
580 bool bCtypeIsRef =
false;
581 bool bHaveEngineering =
false;
582 bool bShowNextFreeFormatIndex =
false;
587 if ( currNode->
getName() ==
"DateAcceptancePattern" )
590 incError(
"DateAcceptancePattern only handled in LC_FORMAT, not LC_FORMAT_1");
592 theDateAcceptancePatterns.push_back( currNode->
getValue());
596 if ( currNode->
getName() !=
"FormatElement" )
605 OUString aFormatIndex;
611 if (!aMsgIdSet.
insert( str).second)
612 incErrorStr(
"Error: Duplicated msgid=\"%s\" in FormatElement.\n", str);
616 bool bDefault = str ==
"true";
626 sal_Int16 formatindex =
static_cast<sal_Int16
>(aFormatIndex.toInt32());
631 incErrorInt(
"Error: Reserved formatindex=\"%d\" in FormatElement.\n", formatindex);
632 bShowNextFreeFormatIndex =
true;
634 if (!aFormatIndexSet.insert( formatindex).second)
636 incErrorInt(
"Error: Duplicated formatindex=\"%d\" in FormatElement.\n", formatindex);
637 bShowNextFreeFormatIndex =
true;
644 OUString aKey( aUsage +
"," + aType);
645 if (!aDefaultsSet.
insert( aKey).second)
647 OUString
aStr =
"Duplicated default for usage=\"" + aUsage +
"\" type=\"" + aType +
"\": formatindex=\"" + aFormatIndex +
"\".";
660 case cssi::NumberFormatIndex::DATE_SYS_DDMMYYYY :
663 case cssi::NumberFormatIndex::NUMBER_1000DEC2 :
664 case cssi::NumberFormatIndex::TIME_MMSS00 :
665 case cssi::NumberFormatIndex::TIME_HH_MMSS00 :
669 incError(
"No root for FormatCode.");
672 pCtype = pRoot->
findNode(
"LC_CTYPE");
674 incError(
"No LC_CTYPE found for FormatCode.");
680 aRef = aRef.replace(
'-',
'_');
683 "Warning: Can't check separators used in FormatCode due to LC_CTYPE ref=\"%s\".\n"
684 "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",
693 case cssi::NumberFormatIndex::CURRENCY_1000DEC2 :
698 sal_Int32 nStart =
n->getValue().indexOf(
"[$");
701 const OUString& aCode(
n->getValue());
702 sal_Int32 nHyphen = aCode.indexOf(
'-', nStart);
703 if (nHyphen >= nStart + 3)
709 case cssi::NumberFormatIndex::CURRENCY_1000INT :
710 case cssi::NumberFormatIndex::CURRENCY_1000INT_RED :
711 case cssi::NumberFormatIndex::CURRENCY_1000DEC2_RED :
712 case cssi::NumberFormatIndex::CURRENCY_1000DEC2_CCC :
713 case cssi::NumberFormatIndex::CURRENCY_1000DEC2_DASHED :
716 if (strcmp( of.
getLocale(),
"en_US") != 0)
718 const OUString& aCode(
n->getValue());
719 if (aCode.indexOf(
"0)" ) > 0 || aCode.indexOf(
"-)" ) > 0 ||
720 aCode.indexOf(
" )" ) > 0 || aCode.indexOf(
"])" ) > 0)
721 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);
726 const OUString& aCode(
n->getValue());
727 if (aCode.indexOf(
"[CURRENCY]" ) >= 0)
728 incErrorInt(
"Error: [CURRENCY] replaceTo not found for formatindex=\"%d\".\n", formatindex);
732 if (aUsage ==
"SCIENTIFIC_NUMBER")
735 const OUString& aCode(
n->getValue());
739 sal_Int32 nInt = aCode.indexOf(
"##0");
740 sal_Int32 nDec = (nInt < 0 ? -1 : aCode.indexOf(
"00E+00", nInt));
741 if (nInt >= 0 && nDec == nInt+4)
742 bHaveEngineering =
true;
749 const OUString& aCode(
n->getValue());
750 if (formatindex == cssi::NumberFormatIndex::NUMBER_1000DEC2)
756 incError(
"No DecimalSeparator found for FormatCode.");
759 nDec = aCode.indexOf( pSep->
getValue());
761 incErrorInt(
"Error: DecimalSeparator not present in FormatCode formatindex=\"%d\".\n",
764 pSep = pCtype->
findNode(
"ThousandSeparator");
766 incError(
"No ThousandSeparator found for FormatCode.");
769 nGrp = aCode.indexOf( pSep->
getValue());
771 incErrorInt(
"Error: ThousandSeparator not present in FormatCode formatindex=\"%d\".\n",
774 if (nDec >= 0 && nGrp >= 0 && nDec <= nGrp)
775 incErrorInt(
"Error: Ordering of ThousandSeparator and DecimalSeparator not correct in formatindex=\"%d\".\n",
778 if (formatindex == cssi::NumberFormatIndex::TIME_MMSS00 ||
779 formatindex == cssi::NumberFormatIndex::TIME_HH_MMSS00)
781 sal_Int32 nTime = -1;
782 sal_Int32 n100s = -1;
785 incError(
"No TimeSeparator found for FormatCode.");
788 nTime = aCode.indexOf( pSep->
getValue());
790 incErrorInt(
"Error: TimeSeparator not present in FormatCode formatindex=\"%d\".\n",
793 pSep = pCtype->
findNode(
"Time100SecSeparator");
795 incError(
"No Time100SecSeparator found for FormatCode.");
798 n100s = aCode.indexOf( pSep->
getValue());
800 incErrorInt(
"Error: Time100SecSeparator not present in FormatCode formatindex=\"%d\".\n",
802 n100s = aCode.indexOf( OUStringConcatenation(pSep->
getValue() +
"00"));
804 incErrorInt(
"Error: Time100SecSeparator+00 not present in FormatCode formatindex=\"%d\".\n",
807 if (n100s >= 0 && nTime >= 0 && n100s <= nTime)
808 incErrorInt(
"Error: Ordering of Time100SecSeparator and TimeSeparator not correct in formatindex=\"%d\".\n",
813 "Warning: formatindex=\"%d\",\"%d\",\"%d\" are the only FormatCode elements checked for separator usage, there may be others that have errors.\n",
814 int(cssi::NumberFormatIndex::NUMBER_1000DEC2),
815 int(cssi::NumberFormatIndex::TIME_MMSS00),
816 int(cssi::NumberFormatIndex::TIME_HH_MMSS00));
821 incError(
"No FormatCode in FormatElement.");
826 of.
writeParameter(
"FormatDefaultName", std::u16string_view(), formatCount);
830 if (bShowNextFreeFormatIndex)
833 auto it = aFormatIndexSet.find( nNext);
834 if (it != aFormatIndexSet.end())
841 while (++it != aFormatIndexSet.end() && *it == nNext);
843 fprintf( stderr,
"Hint: Next free formatindex is %d.\n",
static_cast<int>(nNext));
851 if (theDateAcceptancePatterns.empty())
852 incError(
"No DateAcceptancePattern present.\n");
855 bool bHaveAbbr =
false;
856 for (
auto const& elem : theDateAcceptancePatterns)
858 if (elem.indexOf(
'D') > -1 && elem.indexOf(
'M') > -1 && elem.indexOf(
'Y') <= -1)
865 incError(
"No abbreviated DateAcceptancePattern present. For example M/D or D.M.\n");
871 for (sal_Int16 nNext = cssi::NumberFormatIndex::NUMBER_START;
874 sal_Int16 nHere = ::std::min( (aIter != aFormatIndexSet.end() ? *aIter :
877 if (aIter != aFormatIndexSet.end()) ++aIter;
878 for ( ; nNext < nHere; ++nNext)
882 case cssi::NumberFormatIndex::FRACTION_1 :
883 case cssi::NumberFormatIndex::FRACTION_2 :
884 case cssi::NumberFormatIndex::BOOLEAN :
885 case cssi::NumberFormatIndex::TEXT :
889 incErrorInt(
"Error: FormatElement formatindex=\"%d\" not present.\n", nNext);
894 case cssi::NumberFormatIndex::FRACTION_1 :
895 incErrorInt(
"Error: FormatElement formatindex=\"%d\" reserved for internal ``# ?/?''.\n", nNext);
897 case cssi::NumberFormatIndex::FRACTION_2 :
898 incErrorInt(
"Error: FormatElement formatindex=\"%d\" reserved for internal ``# ?\?/?\?''.\n", nNext);
900 case cssi::NumberFormatIndex::BOOLEAN :
901 incErrorInt(
"Error: FormatElement formatindex=\"%d\" reserved for internal ``BOOLEAN''.\n", nNext);
903 case cssi::NumberFormatIndex::TEXT :
904 incErrorInt(
"Error: FormatElement formatindex=\"%d\" reserved for internal ``@'' (TEXT).\n", nNext);
911 if (!bHaveEngineering)
912 incError(
"Engineering notation format not present, e.g. ##0.00E+00 or ##0,00E+00 for usage=\"SCIENTIFIC_NUMBER\"\n");
967 of.
writeFunction(
"getAllFormats0_",
"FormatElementsCount0",
"FormatElementsArray0",
"replaceFrom0",
"replaceTo0");
970 of.
writeFunction(
"getAllFormats1_",
"FormatElementsCount1",
"FormatElementsArray1",
"replaceFrom1",
"replaceTo1");
985 sal_uInt32 cDateSep = (
aDateSep.isEmpty()
987 sal_uInt32 cDateSep2 = cDateSep;
989 OUStringBuffer aPatternBuf(5);
990 OUStringBuffer aPatternBuf2(5);
992 bool bInModifier =
false;
993 bool bQuoted =
false;
1000 bInModifier =
false;
1013 if (!(nDetected & 4))
1015 aPatternBuf.append(
'Y');
1016 if (!aPatternBuf2.isEmpty())
1017 aPatternBuf2.append(
'Y');
1023 if (!(nDetected & 2))
1025 aPatternBuf.append(
'M');
1026 if (!aPatternBuf2.isEmpty())
1027 aPatternBuf2.append(
'M');
1033 if (!(nDetected & 1))
1035 aPatternBuf.append(
'D');
1036 if (!aPatternBuf2.isEmpty())
1037 aPatternBuf2.append(
'D');
1067 if (cDateSep != cDateSep2 && aPatternBuf2.isEmpty())
1068 aPatternBuf2 = aPatternBuf;
1069 if (cChar == cDateSep || cChar == cDateSep2)
1070 aPatternBuf.append( OUString( &cDateSep, 1));
1071 if (cChar == cDateSep2 && !aPatternBuf2.isEmpty())
1072 aPatternBuf2.append( OUString( &cDateSep2, 1));
1076 if (((nDetected & 7) == 3) || ((nDetected & 7) == 0))
1082 aPatternBuf.append(
'Y');
1083 if (!aPatternBuf2.isEmpty())
1084 aPatternBuf2.append(
'Y');
1089 if (((nDetected & 7) == 0) || ((nDetected & 7) == 6))
1093 aPatternBuf.append(
'D');
1094 if (!aPatternBuf2.isEmpty())
1095 aPatternBuf2.append(
'D');
1098 else if ((nDetected & 7) == 3)
1102 aPatternBuf.append(
'Y');
1103 if (!aPatternBuf2.isEmpty())
1104 aPatternBuf2.append(
'Y');
1109 if ((nDetected & 7) == 0)
1112 aPatternBuf.append(
'D');
1113 if (!aPatternBuf2.isEmpty())
1114 aPatternBuf2.append(
'D');
1119 if ((nDetected & 7) == 0)
1122 aPatternBuf.append(
'D');
1123 if (!aPatternBuf2.isEmpty())
1124 aPatternBuf2.append(
'D');
1129 if ((nDetected & 7) == 0)
1132 aPatternBuf.append(
'D');
1133 if (!aPatternBuf2.isEmpty())
1134 aPatternBuf2.append(
'D');
1139 if ((nDetected & 7) == 1)
1142 aPatternBuf.append(
'M');
1143 if (!aPatternBuf2.isEmpty())
1144 aPatternBuf2.append(
'M');
1149 if ((nDetected & 7) == 3)
1152 aPatternBuf.append(
'Y');
1153 if (!aPatternBuf2.isEmpty())
1154 aPatternBuf2.append(
'Y');
1160 OUString aPattern( aPatternBuf.makeStringAndClear());
1161 if (((nDetected & 7) != 7) || aPattern.getLength() < 5)
1163 incErrorStr(
"Error: failed to extract full date acceptance pattern: %s\n", aPattern);
1164 fprintf( stderr,
" with DateSeparator '%s' from FormatCode '%s' (formatindex=\"%d\")\n",
1166 int(cssi::NumberFormatIndex::DATE_SYS_DDMMYYYY));
1170 fprintf( stderr,
"Generated date acceptance pattern: '%s' from '%s' (formatindex=\"%d\" and defined DateSeparator '%s')\n",
1172 int(cssi::NumberFormatIndex::DATE_SYS_DDMMYYYY),
1173 OSTR( OUString(&cDateSep, 1)));
1175 theDateAcceptancePatterns.insert( theDateAcceptancePatterns.begin(), aPattern);
1177 if (!aPatternBuf2.isEmpty())
1179 OUString aPattern2( aPatternBuf2.makeStringAndClear());
1180 if (aPattern2.getLength() < 5)
1182 incErrorStr(
"Error: failed to extract 2nd date acceptance pattern: %s\n", aPattern2);
1183 fprintf( stderr,
" with DateSeparator '%s' from FormatCode '%s' (formatindex=\"%d\")\n",
1185 int(cssi::NumberFormatIndex::DATE_SYS_DDMMYYYY));
1189 fprintf( stderr,
"Generated 2nd acceptance pattern: '%s' from '%s' (formatindex=\"%d\")\n",
1191 int(cssi::NumberFormatIndex::DATE_SYS_DDMMYYYY));
1192 theDateAcceptancePatterns.insert( theDateAcceptancePatterns.begin(), aPattern2);
1201 for (
auto const& elem : theDateAcceptancePatterns)
1203 if (elem.getLength() == (cDecSep <= 0xffff ? 3 : 4))
1205 if (elem.iterateCodePoints( &
o3tl::temporary(sal_Int32(1))) == cDecSep)
1208 fprintf( stderr,
"Error: Date acceptance pattern '%s' matches decimal number '#%s#'\n",
1216 for (std::vector<OUString>::const_iterator aIt = theDateAcceptancePatterns.begin();
1217 aIt != theDateAcceptancePatterns.end(); ++aIt)
1219 for (std::vector<OUString>::iterator aComp = theDateAcceptancePatterns.begin();
1220 aComp != theDateAcceptancePatterns.end(); )
1222 if (aIt != aComp && *aIt == *aComp)
1224 incErrorStr(
"Error: Duplicated DateAcceptancePattern: %s\n", *aComp);
1225 aComp = theDateAcceptancePatterns.erase( aComp);
1232 sal_Int16 nbOfDateAcceptancePatterns =
static_cast<sal_Int16
>(theDateAcceptancePatterns.size());
1234 for (sal_Int16
i = 0;
i < nbOfDateAcceptancePatterns; ++
i)
1236 of.
writeParameter(
"DateAcceptancePattern", theDateAcceptancePatterns[
i],
i);
1239 of.
writeAsciiString(
"static const sal_Int16 DateAcceptancePatternsCount = ");
1240 of.
writeInt( nbOfDateAcceptancePatterns);
1243 of.
writeAsciiString(
"static const sal_Unicode* DateAcceptancePatternsArray[] = {\n");
1244 for (sal_Int16
i = 0;
i < nbOfDateAcceptancePatterns; ++
i)
1253 of.
writeFunction(
"getDateAcceptancePatterns_",
"DateAcceptancePatternsCount",
"DateAcceptancePatternsArray");
1262 if (!useLocale.isEmpty()) {
1263 useLocale = useLocale.replace(
'-',
'_');
1268 sal_Int16 nbOfCollations = 0;
1269 sal_Int16 nbOfCollationOptions = 0;
1273 if( currNode->
getName() ==
"Collator" )
1286 if( currNode->
getName() ==
"CollationOptions" )
1289 nbOfCollationOptions = sal::static_int_cast<sal_Int16>( pCollationOptions->
getNumberOfChildren() );
1290 for( sal_Int16
i=0;
i<nbOfCollationOptions;
i++ )
1296 of.
writeInt( nbOfCollationOptions );
1304 of.
writeAsciiString(
"\nstatic const sal_Unicode* LCCollatorArray[] = {\n");
1305 for(sal_Int16 j = 0; j < nbOfCollations; j++) {
1321 for( sal_Int16 j=0; j<nbOfCollationOptions; j++ )
1328 of.
writeFunction(
"getCollatorImplementation_",
"nbOfCollations",
"LCCollatorArray");
1329 of.
writeFunction(
"getCollationOptions_",
"nbOfCollationOptions",
"collationOptions");
1335 if (!useLocale.isEmpty()) {
1336 useLocale = useLocale.replace(
'-',
'_');
1345 stderr,
"Error: LC_SEARCH: more than 1 child: %" SAL_PRIdINT32
"\n",
1351 for(
i=0;
i<nSearchOptions;
i++ )
1357 of.
writeInt( sal::static_int_cast<sal_Int16>( nSearchOptions ) );
1361 for(
i=0;
i<nSearchOptions;
i++ )
1364 of.
writeInt( sal::static_int_cast<sal_Int16>(
i) );
1368 of.
writeFunction(
"getSearchOptions_",
"nbOfSearchOptions",
"searchOptions");
1374 if (!useLocale.isEmpty()) {
1375 useLocale = useLocale.replace(
'-',
'_');
1381 sal_Int16 nbOfIndexs = 0;
1382 sal_Int16 nbOfUnicodeScripts = 0;
1383 sal_Int16 nbOfPageWords = 0;
1386 if( currNode->
getName() ==
"IndexKey" )
1403 if( currNode->
getName() ==
"UnicodeScript" )
1406 nbOfUnicodeScripts++;
1409 if( currNode->
getName() ==
"FollowPageWord" )
1420 for(sal_Int16
i = 0;
i < nbOfIndexs;
i++) {
1448 for( sal_Int16
i=0;
i<nbOfUnicodeScripts;
i++ )
1460 of.
writeAsciiString(
"static const sal_Unicode* FollowPageWordArray[] = {\n");
1461 for(sal_Int16
i = 0;
i < nbOfPageWords;
i++) {
1468 of.
writeFunction(
"getIndexAlgorithm_",
"nbOfIndexs",
"IndexArray");
1469 of.
writeFunction(
"getUnicodeScripts_",
"nbOfUnicodeScripts",
"UnicodeScriptArray");
1470 of.
writeFunction(
"getFollowPageWords_",
"nbOfPageWords",
"FollowPageWordArray");
1475 const char* elementTag, sal_Int16 i, sal_Int16 j )
1481 if (
p &&
p->getName() ==
"DefaultNarrowName" )
1482 aNarrName =
p->getValue();
1485 sal_uInt32 nChar = aFullName.iterateCodePoints( &
o3tl::temporary(sal_Int32(0)));
1486 aNarrName = OUString( &nChar, 1);
1501 const char* pTag,
const char* pStr, sal_Int16 i, sal_Int16 j )
1508 const char* elementTag, sal_Int16 i,
bool bNarrow )
1519 for (sal_Int16 j = 0; j <
nCount; j++)
1531 const LocaleNode* pNode, sal_Int16 nChild, std::u16string_view rCalendarID )
const
1541 if (bFound && (!pNode || pNode->
getName() != rName))
1544 incErrorStrStr(
"Error: <%s> element expected in calendar '%s'\n", rName, rCalendarID);
1551 if (!useLocale.isEmpty()) {
1552 useLocale = useLocale.replace(
'-',
'_');
1558 std::unique_ptr<sal_Int16[]> nbOfDays(
new sal_Int16[nbOfCalendars] );
1559 std::unique_ptr<sal_Int16[]> nbOfMonths(
new sal_Int16[nbOfCalendars] );
1560 std::unique_ptr<sal_Int16[]> nbOfGenitiveMonths(
new sal_Int16[nbOfCalendars] );
1561 std::unique_ptr<sal_Int16[]> nbOfPartitiveMonths(
new sal_Int16[nbOfCalendars] );
1562 std::unique_ptr<sal_Int16[]> nbOfEras(
new sal_Int16[nbOfCalendars] );
1567 std::map< OUString, bool > aCalendars;
1568 aCalendars[
"buddhist"] =
false;
1569 aCalendars[
"gengou"] =
false;
1570 aCalendars[
"gregorian"] =
false;
1571 aCalendars[
"hanja"] =
false;
1572 aCalendars[
"hanja_yoil"] =
false;
1573 aCalendars[
"hijri"] =
false;
1574 aCalendars[
"jewish"] =
false;
1575 aCalendars[
"ROC"] =
false;
1577 aCalendars[
"dangi"] =
false;
1578 aCalendars[
"persian"] =
false;
1582 bool bHasGregorian =
false;
1585 for (
i = 0;
i < nbOfCalendars;
i++) {
1589 bool bGregorian = calendarID ==
"gregorian";
1591 bHasGregorian = bGregorian;
1592 auto calIt = aCalendars.find(calendarID);
1593 if (calIt == aCalendars.end())
1594 incErrorStr(
"Error: unknown Calendar unoid: %s\n", calendarID);
1595 else if (calIt->second)
1596 incErrorStr(
"Error: duplicate Calendar unoid: %s\n", calendarID);
1598 calIt->second =
true;
1602 sal_Int16 nChild = 0;
1605 const char *elementTag;
1608 ref_name = ref_name.replace(
'-',
'_');
1609 if (!ref_name.isEmpty() &&
i > 0) {
1610 for (j = 0; j <
i; j++) {
1612 if (str == ref_name)
1616 if (!ref_name.isEmpty() && daysNode ==
nullptr) {
1621 if (daysNode ==
nullptr)
1624 if (bGregorian && nbOfDays[
i] != 7)
1625 incErrorInt(
"Error: A Gregorian calendar must have 7 days per week, this one has %d\n", nbOfDays[
i]);
1627 for (j = 0; j < nbOfDays[
i]; j++) {
1631 if ( j == 0 && bGregorian && dayID !=
"sun" )
1632 incError(
"First day of a week of a Gregorian calendar must be <DayID>sun</DayID>");
1641 ref_name = ref_name.replace(
'-',
'_');
1642 if (!ref_name.isEmpty() &&
i > 0) {
1643 for (j = 0; j <
i; j++) {
1645 if (str == ref_name)
1649 if (!ref_name.isEmpty() && monthsNode ==
nullptr) {
1654 if (monthsNode ==
nullptr)
1657 if (bGregorian && nbOfMonths[
i] != 12)
1658 incErrorInt(
"Error: A Gregorian calendar must have 12 months, this one has %d\n", nbOfMonths[
i]);
1659 elementTag =
"month";
1660 for (j = 0; j < nbOfMonths[
i]; j++) {
1664 if ( j == 0 && bGregorian && monthID !=
"jan" )
1665 incError(
"First month of a year of a Gregorian calendar must be <MonthID>jan</MonthID>");
1677 ref_name = ref_name.replace(
'-',
'_');
1678 if (!ref_name.isEmpty() &&
i > 0) {
1679 for (j = 0; j <
i; j++) {
1681 if (str == ref_name)
1685 if (!ref_name.isEmpty() && genitiveMonthsNode ==
nullptr) {
1688 nbOfGenitiveMonths[
i] = 0;
1690 if (genitiveMonthsNode ==
nullptr)
1691 genitiveMonthsNode = calNode ->
getChildAt(nChild);
1692 nbOfGenitiveMonths[
i] = sal::static_int_cast<sal_Int16>( genitiveMonthsNode->
getNumberOfChildren() );
1693 if (bGregorian && nbOfGenitiveMonths[
i] != 12)
1694 incErrorInt(
"Error: A Gregorian calendar must have 12 genitive months, this one has %d\n", nbOfGenitiveMonths[
i]);
1695 elementTag =
"genitiveMonth";
1696 for (j = 0; j < nbOfGenitiveMonths[
i]; j++) {
1700 if ( j == 0 && bGregorian && genitiveMonthID !=
"jan" )
1701 incError(
"First genitive month of a year of a Gregorian calendar must be <MonthID>jan</MonthID>");
1714 ref_name = ref_name.replace(
'-',
'_');
1715 if (!ref_name.isEmpty() &&
i > 0) {
1716 for (j = 0; j <
i; j++) {
1718 if (str == ref_name)
1722 if (!ref_name.isEmpty() && partitiveMonthsNode ==
nullptr) {
1725 nbOfPartitiveMonths[
i] = 0;
1727 if (partitiveMonthsNode ==
nullptr)
1728 partitiveMonthsNode = calNode ->
getChildAt(nChild);
1729 nbOfPartitiveMonths[
i] = sal::static_int_cast<sal_Int16>( partitiveMonthsNode->
getNumberOfChildren() );
1730 if (bGregorian && nbOfPartitiveMonths[
i] != 12)
1731 incErrorInt(
"Error: A Gregorian calendar must have 12 partitive months, this one has %d\n", nbOfPartitiveMonths[
i]);
1732 elementTag =
"partitiveMonth";
1733 for (j = 0; j < nbOfPartitiveMonths[
i]; j++) {
1737 if ( j == 0 && bGregorian && partitiveMonthID !=
"jan" )
1738 incError(
"First partitive month of a year of a Gregorian calendar must be <MonthID>jan</MonthID>");
1747 ref_name = ref_name.replace(
'-',
'_');
1748 if (!ref_name.isEmpty() &&
i > 0) {
1749 for (j = 0; j <
i; j++) {
1751 if (str == ref_name)
1755 if (!ref_name.isEmpty() && erasNode ==
nullptr) {
1760 if (erasNode ==
nullptr)
1769 if (bGregorian && nbOfEras[
i] != 2)
1770 incErrorInt(
"Error: A Gregorian calendar must have 2 eras, this one has %d\n", nbOfEras[
i]);
1772 for (j = 0; j < nbOfEras[
i]; j++) {
1780 if ( j == 0 && bGregorian && eraID !=
"bc" )
1781 incError(
"First era of a Gregorian calendar must be <EraID>bc</EraID>");
1782 if ( j == 1 && bGregorian && eraID !=
"ad" )
1783 incError(
"Second era of a Gregorian calendar must be <EraID>ad</EraID>");
1797 for (j = 0; j < nbOfDays[
i]; j++)
1804 if (j >= nbOfDays[
i])
1805 incErrorStr(
"Error: <StartDayOfWeek> <DayID> must be one of the <DaysOfWeek>, but is: %s\n", str);
1814 sal_Int16 nDays = sal::static_int_cast<sal_Int16>( str.toInt32() );
1815 if (nDays < 1 || (0 < nbOfDays[
i] && nbOfDays[
i] < nDays))
1816 incErrorInt(
"Error: Bad value of MinimalDaysInFirstWeek: %d, must be 1 <= value <= days_in_week\n",
1822 fprintf( stderr,
"Warning: %s\n",
"No Gregorian calendar defined, are you sure?");
1829 for(
i = 0;
i < nbOfCalendars - 1;
i++) {
1837 for(
i = 0;
i < nbOfCalendars - 1;
i++) {
1845 for(
i = 0;
i < nbOfCalendars - 1;
i++) {
1853 for(
i = 0;
i < nbOfCalendars - 1;
i++) {
1861 for(
i = 0;
i < nbOfCalendars - 1;
i++) {
1875 for(
i = 0;
i < nbOfCalendars;
i++) {
1892 of.
writeFunction(
"getAllCalendars_",
"calendarsCount",
"calendars");
1898 return rStr.getLength() == 3
1899 &&
'A' <=
p[0] &&
p[0] <=
'Z'
1900 &&
'A' <=
p[1] &&
p[1] <=
'Z'
1901 &&
'A' <=
p[2] &&
p[2] <=
'Z'
1908 if (!useLocale.isEmpty()) {
1909 useLocale = useLocale.replace(
'-',
'_');
1913 sal_Int16 nbOfCurrencies = 0;
1916 bool bTheDefault=
false;
1917 bool bTheCompatible =
false;
1923 bool bCompatible = of.
writeDefaultParameter(
"CurrencyUsedInCompatibleFormatCodes", str, nbOfCurrencies);
1926 if (bLegacy && (bDefault || bCompatible))
1927 incError(
"Currency: if legacyOnly==true, both 'default' and 'usedInCompatibleFormatCodes' must be false.");
1931 incError(
"Currency: more than one default currency.");
1937 incError(
"Currency: more than one currency flagged as usedInCompatibleFormatCodes.");
1938 bTheCompatible =
true;
1944 incError(
"CurrencyID is not ISO 4217");
1958 incError(
"BankSymbol is not ISO 4217");
1962 sal_Int16 nDecimalPlaces =
static_cast<sal_Int16
>(str.toInt32());
1968 incError(
"Currency: no default currency.");
1969 if (!bTheCompatible)
1970 incError(
"Currency: no currency flagged as usedInCompatibleFormatCodes.");
1976 for(sal_Int16
i = 0;
i < nbOfCurrencies;
i++) {
2003 of.
writeFunction(
"getAllCurrencies_",
"currencyCount",
"currencies");
2009 if (!useLocale.isEmpty()) {
2010 useLocale = useLocale.replace(
'-',
'_');
2014 sal_Int16 nbOfModules = 0;
2026 of.
writeAsciiString(
"\nstatic const sal_Unicode* LCTransliterationsArray[] = {\n");
2027 for( sal_Int16
i = 0;
i < nbOfModules;
i++) {
2033 of.
writeFunction(
"getTransliterations_",
"nbOfTransliterations",
"LCTransliterationsArray");
2038struct NameValuePair {
2046 {
"trueWord",
"true" },
2047 {
"falseWord",
"false" },
2048 {
"quarter1Word",
"1st quarter" },
2049 {
"quarter2Word",
"2nd quarter" },
2050 {
"quarter3Word",
"3rd quarter" },
2051 {
"quarter4Word",
"4th quarter" },
2052 {
"aboveWord",
"above" },
2053 {
"belowWord",
"below" },
2054 {
"quarter1Abbreviation",
"Q1" },
2055 {
"quarter2Abbreviation",
"Q2" },
2056 {
"quarter3Abbreviation",
"Q3" },
2057 {
"quarter4Abbreviation",
"Q4" }
2063 if (!useLocale.isEmpty()) {
2064 useLocale = useLocale.replace(
'-',
'_');
2072 incError(
"No ReservedWords element.");
2076 bool bEnglishLocale = (strncmp( of.
getLocale(),
"en_", 3) == 0);
2078 sal_Int16 nbOfWords = 0;
2087 "Warning: No %s in ReservedWords, using en_US default: \"%s\".\n",
2093 fprintf( stderr,
"Error: No content for ReservedWords %s.\n",
ReserveWord[
i].
name);
2097 if (!bEnglishLocale && curNode &&
i <= 7 &&
2101 "Warning: ReservedWord %s seems to be untranslated \"%s\".\n",
2108 of.
writeAsciiString(
"\nstatic const sal_Unicode* LCReservedWordsArray[] = {\n");
2109 for(
i = 0;
i < nbOfWords;
i++) {
2115 of.
writeFunction(
"getReservedWords_",
"nbOfReservedWords",
"LCReservedWordsArray");
2126 of.
writeAsciiString(
"\nstatic const sal_Unicode* LCForbiddenCharactersArray[] = {\n");
2131 of.
writeFunction(
"getForbiddenCharacters_",
"3",
"LCForbiddenCharactersArray");
2146 of.
writeAsciiString(
"\nstatic const sal_Unicode* LCBreakIteratorRulesArray[] = {\n");
2153 of.
writeFunction(
"getBreakIteratorRules_",
"5",
"LCBreakIteratorRulesArray");
2161 if (!useLocale.isEmpty()) {
2162 useLocale = useLocale.replace(
'-',
'_');
2169 const char* attr[
nAttributes ] = {
"Prefix",
"NumType",
"Suffix",
"Transliteration",
"NatNum" };
2176 for(
i = 0;
i < nStyles; ++
i )
2181 const char*
name = attr[j];
2189 of.
writeInt( sal::static_int_cast<sal_Int16>( nStyles ) );
2191 of.
writeAsciiString(
"static const sal_Int16 continuousNbOfAttributesPerStyle = ");
2196 for(
i=0;
i<nStyles;
i++ )
2199 of.
writeInt( sal::static_int_cast<sal_Int16>(
i) );
2206 of.
writeInt(sal::static_int_cast<sal_Int16>(
i));
2214 of.
writeAsciiString(
"static const sal_Unicode** LCContinuousNumberingLevelsArray[] = {\n" );
2215 for(
i=0;
i<nStyles;
i++ )
2219 of.
writeInt( sal::static_int_cast<sal_Int16>(
i) );
2223 of.
writeFunction2(
"getContinuousNumberingLevels_",
"continuousNbOfStyles",
2224 "continuousNbOfAttributesPerStyle",
"LCContinuousNumberingLevelsArray");
2232 if (!useLocale.isEmpty()) {
2233 useLocale = useLocale.replace(
'-',
'_');
2249 "SymbolTextDistance",
2258 std::vector<sal_Int32> nLevels;
2259 for( sal_Int32
i = 0;
i < nStyles;
i++ )
2262 nLevels.push_back(
p->getNumberOfChildren() );
2263 for( sal_Int32 j=0; j<nLevels.back(); j++ )
2265 const Attr& q =
p->getChildAt( j )->getAttr();
2268 const char*
name = attr[k];
2271 sal::static_int_cast<sal_Int16>(
i),
2272 sal::static_int_cast<sal_Int16>(j) );
2278 for(
size_t i=0;
i<nLevels.size();
i++ )
2280 if( nLevels[0] != nLevels[
i] )
2282 incError(
"Numbering levels don't match.");
2288 of.
writeInt( sal::static_int_cast<sal_Int16>( nStyles ) );
2290 of.
writeAsciiString(
"static const sal_Int16 outlineNbOfLevelsPerStyle = ");
2291 of.
writeInt( sal::static_int_cast<sal_Int16>( nLevels.back() ) );
2293 of.
writeAsciiString(
"static const sal_Int16 outlineNbOfAttributesPerLevel = ");
2307 for( sal_Int32
i=0;
i<nStyles;
i++ )
2309 for( sal_Int32 j=0; j<nLevels.back(); j++ )
2313 of.
writeInt( sal::static_int_cast<sal_Int16>(
i) );
2315 of.
writeInt( sal::static_int_cast<sal_Int16>(j) );
2322 of.
writeInt( sal::static_int_cast<sal_Int16>(
i) );
2323 of.
writeInt( sal::static_int_cast<sal_Int16>(j) );
2333 for( sal_Int32
i=0;
i<nStyles;
i++ )
2337 of.
writeInt( sal::static_int_cast<sal_Int16>(
i) );
2340 for( sal_Int32 j=0; j<nLevels.back(); j++ )
2343 of.
writeInt( sal::static_int_cast<sal_Int16>(
i) );
2345 of.
writeInt( sal::static_int_cast<sal_Int16>(j) );
2352 of.
writeAsciiString(
"static const sal_Unicode*** LCOutlineNumberingLevelsArray[] = {\n" );
2353 for( sal_Int32
i=0;
i<nStyles;
i++ )
2357 of.
writeInt( sal::static_int_cast<sal_Int16>(
i) );
2361 of.
writeFunction3(
"getOutlineNumberingLevels_",
"outlineNbOfStyles",
"outlineNbOfLevelsPerStyle",
2362 "outlineNbOfAttributesPerLevel",
"LCOutlineNumberingLevelsArray");
2366 sal_Int16 len = attr->getLength();
2369 value.realloc (len);
2370 auto pValue =
value.getArray();
2371 for (sal_Int16
i =0;
i< len;
i++) {
2372 pName[
i] = attr->getNameByIndex(
i);
2378 auto pName = std::find_if(std::cbegin(
name), std::cend(
name),
2379 [&str](
const OUString& rName) {
return rName.equalsAscii(str); });
2382 auto i =
static_cast<sal_Int32
>(std::distance(std::cbegin(
name),
pName));
static bool isIso4217(const OUString &rStr)
::o3tl::sorted_vector< sal_Int16 > ValueSet
static OUString sTheCurrencyReplaceTo
const NameValuePair ReserveWord[]
static OUString sTheDateEditFormat
static void lcl_writeAbbrFullNarrArrays(const OFileWriter &of, sal_Int16 nCount, const char *elementTag, sal_Int16 i, bool bNarrow)
static void lcl_writeAbbrFullNarrNames(const OFileWriter &of, const LocaleNode *currNode, const char *elementTag, sal_Int16 i, sal_Int16 j)
#define LOCALE_VERSION_DTD
::o3tl::sorted_vector< OUString > NameSet
static void lcl_writeTabTagString(const OFileWriter &of, const char *pTag, const char *pStr)
static OUString sTheCompatibleCurrency
static void lcl_writeTabTagStringNums(const OFileWriter &of, const char *pTag, const char *pStr, sal_Int16 i, sal_Int16 j)
Sequence< OUString > name
const OUString & getValueByIndex(sal_Int32 idx) const
OUString getValueByName(const char *str) const
Sequence< OUString > value
Attr(const Reference< XAttributeList > &attr)
virtual void generateCode(const OFileWriter &of) const override
bool expectedCalendarElement(std::u16string_view rName, const LocaleNode *pNode, sal_Int16 nChild, std::u16string_view rCalendarID) const
virtual void generateCode(const OFileWriter &of) const override
virtual void generateCode(const OFileWriter &of) const override
virtual void generateCode(const OFileWriter &of) const override
virtual void generateCode(const OFileWriter &of) const override
virtual void generateCode(const OFileWriter &of) const override
virtual void generateCode(const OFileWriter &of) const override
virtual void generateCode(const OFileWriter &of) const override
virtual void generateCode(const OFileWriter &of) const override
virtual void generateCode(const OFileWriter &of) const override
virtual void generateCode(const OFileWriter &of) const override
void incErrorStrStr(const char *pStr, std::u16string_view rVal1, std::u16string_view rVal2) const
void addChild(LocaleNode *node)
const OUString & getName() const
void incErrorInt(const char *pStr, int nVal) const
const OUString & getValue() const
sal_Int32 getNumberOfChildren() const
const LocaleNode * getRoot() const
static LocaleNode * createNode(const OUString &name, const Reference< XAttributeList > &attr)
const Attr & getAttr() const
const LocaleNode * findNode(const char *name) const
LocaleNode * getChildAt(sal_Int32 idx) const
void incError(const char *pStr) const
LocaleNode(OUString name, const Reference< XAttributeList > &attr)
virtual void generateCode(const OFileWriter &of) const
std::vector< std::unique_ptr< LocaleNode > > children
OUString writeParameterCheckLen(const OFileWriter &of, const char *pParameterName, const LocaleNode *pNode, sal_Int32 nMinLen, sal_Int32 nMaxLen) const
void incErrorStr(const char *pStr, std::u16string_view rVal) const
const char * getLocale() const
Return the locale string, something like en_US or de_DE.
void writeAsciiString(const char *str) const
void writeInt(sal_Int16 nb) const
void writeFunction2(const char *func, const char *style, const char *attr, const char *array) const
void writeParameter(const char *pAsciiStr, std::u16string_view aChars) const
void writeRefFunction2(const char *func, std::u16string_view useLocale) const
void writeRefFunction3(const char *func, std::u16string_view useLocale) const
void writeFunction3(const char *func, const char *style, const char *levels, const char *attr, const char *array) const
bool writeDefaultParameter(const char *pAsciiStr, std::u16string_view str, sal_Int16 count) const
void writeFunction(const char *func, const char *count, const char *array) const
void writeIntParameter(const char *pAsciiStr, const sal_Int16 count, sal_Int16 val) const
void writeRefFunction(const char *func, std::u16string_view useLocale) const
std::vector< Value >::const_iterator const_iterator
std::pair< const_iterator, bool > insert(Value &&x)
#define SAL_N_ELEMENTS(arr)
constexpr sal_Int16 nFirstFreeFormatIndex
The number of reserved (with defined meaning) built-in format code indices, additional locale data fo...
constexpr sal_Int16 nStopPredefinedFormatIndex
The number of predefined format code indices that must be defined by locale data, except BOOLEAN and ...
constexpr T & temporary(T &&x)