summaryrefslogtreecommitdiff
path: root/i18npool
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2023-06-14 11:26:44 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2023-06-14 19:16:29 +0200
commit7b61cfc01fdac9f7162c674e888ccf129c2433b4 (patch)
tree9dafb07b5df004573154327a5d0373a7d643fcfc /i18npool
parent7c2cfc26381dd31ab43e357eea7a3f5e63d3d6f4 (diff)
speed up startup time
by avoid conversion of static locale data from sal_Unicode to OUString data - we can declare the data as OUStringConstExpr arrays and then no conversion is necessary. Change-Id: I7d9b7bd923765b3fd37c4c45f4fd47add26beef6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153055 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'i18npool')
-rw-r--r--i18npool/source/localedata/LocaleNode.cxx99
-rw-r--r--i18npool/source/localedata/LocaleNode.hxx3
-rw-r--r--i18npool/source/localedata/filewriter.cxx9
-rw-r--r--i18npool/source/localedata/localedata.cxx82
4 files changed, 129 insertions, 64 deletions
diff --git a/i18npool/source/localedata/LocaleNode.cxx b/i18npool/source/localedata/LocaleNode.cxx
index b17203b3a59b..cab4f1f08ba5 100644
--- a/i18npool/source/localedata/LocaleNode.cxx
+++ b/i18npool/source/localedata/LocaleNode.cxx
@@ -179,6 +179,43 @@ OUString LocaleNode::writeParameterCheckLen( const OFileWriter &of,
return aVal;
}
+OUString LocaleNode::writeOUStringLiteralParameterCheckLen( const OFileWriter &of,
+ const char* pParameterName, const LocaleNode* pNode,
+ sal_Int32 nMinLen, sal_Int32 nMaxLen ) const
+{
+ OUString aVal;
+ if (pNode)
+ aVal = pNode->getValue();
+ else if (nMinLen >= 0) // -1: optional => empty, 0: must be present, empty
+ {
+ ++nError;
+ fprintf( stderr, "Error: node NULL pointer for parameter %s.\n",
+ pParameterName);
+ }
+ // write empty data if error
+ of.writeOUStringLiteralParameter( pParameterName, aVal);
+ sal_Int32 nLen = aVal.getLength();
+ if (nLen < nMinLen)
+ {
+ ++nError;
+ fprintf( stderr, "Error: less than %" SAL_PRIdINT32 " character%s (%" SAL_PRIdINT32 ") in %s '%s'.\n",
+ nMinLen, (nMinLen > 1 ? "s" : ""),
+ nLen,
+ (pNode ? OSTR( pNode->getName()) : ""),
+ OSTR( aVal));
+ }
+ else if (nLen > nMaxLen && nMaxLen >= 0)
+ {
+ ++nError;
+ fprintf( stderr,
+ "Error: more than %" SAL_PRIdINT32 " character%s (%" SAL_PRIdINT32 ") in %s '%s' not supported by application.\n",
+ nMaxLen, (nMaxLen > 1 ? "s" : ""),
+ nLen,
+ (pNode ? OSTR( pNode->getName()) : ""),
+ OSTR( aVal));
+ }
+ return aVal;
+}
OUString LocaleNode::writeParameterCheckLen( const OFileWriter &of,
const char* pNodeName, const char* pParameterName,
@@ -198,6 +235,24 @@ OUString LocaleNode::writeParameterCheckLen( const OFileWriter &of,
return aVal;
}
+OUString LocaleNode::writeOUStringLiteralParameterCheckLen( const OFileWriter &of,
+ const char* pNodeName, const char* pParameterName,
+ sal_Int32 nMinLen, sal_Int32 nMaxLen ) const
+{
+ OUString aVal;
+ const LocaleNode * pNode = findNode( pNodeName);
+ if (pNode || nMinLen < 0)
+ aVal = writeOUStringLiteralParameterCheckLen( of, pParameterName, pNode, nMinLen, nMaxLen);
+ else
+ {
+ ++nError;
+ fprintf( stderr, "Error: node %s not found.\n", pNodeName);
+ // write empty data if error
+ of.writeOUStringLiteralParameter( pParameterName, aVal);
+ }
+ return aVal;
+}
+
void LocaleNode::incError( const char* pStr ) const
{
++nError;
@@ -288,54 +343,54 @@ void LCCTYPENode::generateCode (const OFileWriter &of) const
OUString useLocale = getAttr().getValueByName("ref");
if (!useLocale.isEmpty()) {
useLocale = useLocale.replace( '-', '_');
- of.writeRefFunction("getLocaleItem_", useLocale);
+ of.writeOUStringRefFunction("getLocaleItem_", useLocale);
return;
}
OUString str = getAttr().getValueByName("unoid");
of.writeAsciiString("\n\n");
- of.writeParameter("LC_CTYPE_Unoid", str);
+ of.writeOUStringLiteralParameter("LC_CTYPE_Unoid", str);
aDateSep =
- writeParameterCheckLen( of, "DateSeparator", "dateSeparator", 1, 1);
+ writeOUStringLiteralParameterCheckLen( of, "DateSeparator", "dateSeparator", 1, 1);
OUString aThoSep =
- writeParameterCheckLen( of, "ThousandSeparator", "thousandSeparator", 1, 1);
+ writeOUStringLiteralParameterCheckLen( of, "ThousandSeparator", "thousandSeparator", 1, 1);
aDecSep =
- writeParameterCheckLen( of, "DecimalSeparator", "decimalSeparator", 1, 1);
+ writeOUStringLiteralParameterCheckLen( of, "DecimalSeparator", "decimalSeparator", 1, 1);
OUString aDecSepAlt =
- writeParameterCheckLen( of, "DecimalSeparatorAlternative", "decimalSeparatorAlternative", -1, 1);
+ writeOUStringLiteralParameterCheckLen( of, "DecimalSeparatorAlternative", "decimalSeparatorAlternative", -1, 1);
OUString aTimeSep =
- writeParameterCheckLen( of, "TimeSeparator", "timeSeparator", 1, 1);
+ writeOUStringLiteralParameterCheckLen( of, "TimeSeparator", "timeSeparator", 1, 1);
OUString aTime100Sep =
- writeParameterCheckLen( of, "Time100SecSeparator", "time100SecSeparator", 1, 1);
+ writeOUStringLiteralParameterCheckLen( of, "Time100SecSeparator", "time100SecSeparator", 1, 1);
OUString aListSep =
- writeParameterCheckLen( of, "ListSeparator", "listSeparator", 1, 1);
+ writeOUStringLiteralParameterCheckLen( of, "ListSeparator", "listSeparator", 1, 1);
OUString aLDS;
sepNode = findNode("LongDateDayOfWeekSeparator");
aLDS = sepNode->getValue();
- of.writeParameter("LongDateDayOfWeekSeparator", aLDS);
+ of.writeOUStringLiteralParameter("LongDateDayOfWeekSeparator", aLDS);
if (aLDS == ",")
fprintf( stderr, "Warning: %s\n",
"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\".");
sepNode = findNode("LongDateDaySeparator");
aLDS = sepNode->getValue();
- of.writeParameter("LongDateDaySeparator", aLDS);
+ of.writeOUStringLiteralParameter("LongDateDaySeparator", aLDS);
if (aLDS == "," || aLDS == ".")
fprintf( stderr, "Warning: %s\n",
"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\".");
sepNode = findNode("LongDateMonthSeparator");
aLDS = sepNode->getValue();
- of.writeParameter("LongDateMonthSeparator", aLDS);
+ of.writeOUStringLiteralParameter("LongDateMonthSeparator", aLDS);
if (aLDS.isEmpty())
fprintf( stderr, "Warning: %s\n",
"LongDateMonthSeparator is empty. Usually this is not the case and may lead to concatenated display names like \"Wednesday, May9, 2007\".");
sepNode = findNode("LongDateYearSeparator");
aLDS = sepNode->getValue();
- of.writeParameter("LongDateYearSeparator", aLDS);
+ of.writeOUStringLiteralParameter("LongDateYearSeparator", aLDS);
if (aLDS.isEmpty())
fprintf( stderr, "Warning: %s\n",
"LongDateYearSeparator is empty. Usually this is not the case and may lead to concatenated display names like \"Wednesday, 2007May 9\".");
@@ -380,13 +435,13 @@ void LCCTYPENode::generateCode (const OFileWriter &of) const
"Don't forget to adapt corresponding FormatCode elements when changing separators.");
OUString aQuoteStart =
- writeParameterCheckLen( of, "QuotationStart", "quotationStart", 1, 1);
+ writeOUStringLiteralParameterCheckLen( of, "QuotationStart", "quotationStart", 1, 1);
OUString aQuoteEnd =
- writeParameterCheckLen( of, "QuotationEnd", "quotationEnd", 1, 1);
+ writeOUStringLiteralParameterCheckLen( of, "QuotationEnd", "quotationEnd", 1, 1);
OUString aDoubleQuoteStart =
- writeParameterCheckLen( of, "DoubleQuotationStart", "doubleQuotationStart", 1, 1);
+ writeOUStringLiteralParameterCheckLen( of, "DoubleQuotationStart", "doubleQuotationStart", 1, 1);
OUString aDoubleQuoteEnd =
- writeParameterCheckLen( of, "DoubleQuotationEnd", "doubleQuotationEnd", 1, 1);
+ writeOUStringLiteralParameterCheckLen( of, "DoubleQuotationEnd", "doubleQuotationEnd", 1, 1);
if (aQuoteStart.toChar() <= 127 && aQuoteEnd.toChar() > 127)
fprintf( stderr, "Warning: %s\n",
@@ -478,12 +533,12 @@ void LCCTYPENode::generateCode (const OFileWriter &of) const
"DoubleQuotationEnd may be wrong:", ic, OSTR( aDoubleQuoteEnd));
}
- writeParameterCheckLen( of, "TimeAM", "timeAM", 1, -1);
- writeParameterCheckLen( of, "TimePM", "timePM", 1, -1);
+ writeOUStringLiteralParameterCheckLen( of, "TimeAM", "timeAM", 1, -1);
+ writeOUStringLiteralParameterCheckLen( of, "TimePM", "timePM", 1, -1);
sepNode = findNode("MeasurementSystem");
- of.writeParameter("measurementSystem", sepNode->getValue());
+ of.writeOUStringLiteralParameter("measurementSystem", sepNode->getValue());
- of.writeAsciiString("\nstatic const sal_Unicode* LCType[] = {\n");
+ of.writeAsciiString("\nstatic constexpr rtl::OUStringConstExpr LCType[] = {\n");
of.writeAsciiString("\tLC_CTYPE_Unoid,\n");
of.writeAsciiString("\tdateSeparator,\n");
of.writeAsciiString("\tthousandSeparator,\n");
@@ -504,7 +559,7 @@ void LCCTYPENode::generateCode (const OFileWriter &of) const
of.writeAsciiString("\tLongDateYearSeparator,\n");
of.writeAsciiString("\tdecimalSeparatorAlternative\n");
of.writeAsciiString("};\n\n");
- of.writeFunction("getLocaleItem_", "SAL_N_ELEMENTS(LCType)", "LCType");
+ of.writeOUStringFunction("getLocaleItem_", "SAL_N_ELEMENTS(LCType)", "LCType");
}
diff --git a/i18npool/source/localedata/LocaleNode.hxx b/i18npool/source/localedata/LocaleNode.hxx
index 16765f6c42e7..70995244a181 100644
--- a/i18npool/source/localedata/LocaleNode.hxx
+++ b/i18npool/source/localedata/LocaleNode.hxx
@@ -58,6 +58,7 @@ public:
bool writeDefaultParameter(const char* pAsciiStr, std::u16string_view str, sal_Int16 count) const;
bool writeOUStringLiteralDefaultParameter(const char* pAsciiStr, std::u16string_view str, sal_Int16 count) const;
void writeParameter(const char* pAsciiStr, std::u16string_view aChars) const;
+ void writeOUStringLiteralParameter(const char* pAsciiStr, std::u16string_view aChars) const;
void writeParameter(const char* pAsciiStr, std::u16string_view aChars, sal_Int16 count) const;
void writeOUStringLiteralParameter(const char* pAsciiStr, std::u16string_view aChars, sal_Int16 count) const;
void writeParameter(const char* pAsciiStr, std::u16string_view aChars, sal_Int16 count0, sal_Int16 count1) const;
@@ -115,7 +116,9 @@ public:
// nMaxLen < 0 : any length
// nMaxLen >= 0 : warning if more than nMaxLen characters
OUString writeParameterCheckLen( const OFileWriter &of, const char* pParameterName, const LocaleNode* pNode, sal_Int32 nMinLen, sal_Int32 nMaxLen ) const;
+ OUString writeOUStringLiteralParameterCheckLen( const OFileWriter &of, const char* pParameterName, const LocaleNode* pNode, sal_Int32 nMinLen, sal_Int32 nMaxLen ) const;
OUString writeParameterCheckLen( const OFileWriter &of, const char* pNodeName, const char* pParameterName, sal_Int32 nMinLen, sal_Int32 nMaxLen ) const;
+ OUString writeOUStringLiteralParameterCheckLen( const OFileWriter &of, const char* pNodeName, const char* pParameterName, sal_Int32 nMinLen, sal_Int32 nMaxLen ) const;
// ++nError with output to stderr
void incError( const char* pStr ) const;
// ++nError with output to stderr
diff --git a/i18npool/source/localedata/filewriter.cxx b/i18npool/source/localedata/filewriter.cxx
index de75307b3596..df7954e2fd74 100644
--- a/i18npool/source/localedata/filewriter.cxx
+++ b/i18npool/source/localedata/filewriter.cxx
@@ -58,7 +58,7 @@ void OFileWriter::writeStringCharacters(std::u16string_view str) const
void OFileWriter::writeOUStringLiteralCharacters(std::u16string_view str) const
{
for(size_t i = 0; i < str.size(); i++)
- fprintf(m_f, "\\x%x", str[i]);
+ fprintf(m_f, "\\x%04x", str[i]);
}
void OFileWriter::writeOUStringRefFunction(const char *func, std::u16string_view useLocale) const
@@ -199,6 +199,13 @@ void OFileWriter::writeParameter(const char* pAsciiStr, std::u16string_view aCha
fprintf(m_f, "0x0};\n");
}
+void OFileWriter::writeOUStringLiteralParameter(const char* pAsciiStr, std::u16string_view aChars) const
+{
+ fprintf(m_f, "static constexpr OUStringLiteral %s = u\"", pAsciiStr);
+ writeOUStringLiteralCharacters(aChars);
+ fprintf(m_f, "\";\n");
+}
+
void OFileWriter::writeParameter(const char* pAsciiStr, std::u16string_view aChars, sal_Int16 count) const
{
fprintf(m_f, "static const sal_Unicode %s%d[] = {", pAsciiStr, count);
diff --git a/i18npool/source/localedata/localedata.cxx b/i18npool/source/localedata/localedata.cxx
index 0494357b10a3..ccc4ba51d74c 100644
--- a/i18npool/source/localedata/localedata.cxx
+++ b/i18npool/source/localedata/localedata.cxx
@@ -389,31 +389,31 @@ LocaleDataImpl::~LocaleDataImpl()
LocaleDataItem SAL_CALL
LocaleDataImpl::getLocaleItem( const Locale& rLocale )
{
- MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getLocaleItem" ));
+ MyFuncOUString_Type func = reinterpret_cast<MyFuncOUString_Type>(getFunctionSymbol( rLocale, "getLocaleItem" ));
if ( func ) {
sal_Int16 dataItemCount = 0;
- sal_Unicode **dataItem = func(dataItemCount);
+ OUString const *dataItem = func(dataItemCount);
LocaleDataItem item{
- OUString(dataItem[0]),
- OUString(dataItem[1]),
- OUString(dataItem[2]),
- OUString(dataItem[3]),
- OUString(dataItem[4]),
- OUString(dataItem[5]),
- OUString(dataItem[6]),
- OUString(dataItem[7]),
- OUString(dataItem[8]),
- OUString(dataItem[9]),
- OUString(dataItem[10]),
- OUString(dataItem[11]),
- OUString(dataItem[12]),
- OUString(dataItem[13]),
- OUString(dataItem[14]),
- OUString(dataItem[15]),
- OUString(dataItem[16]),
- OUString(dataItem[17])
+ dataItem[0],
+ dataItem[1],
+ dataItem[2],
+ dataItem[3],
+ dataItem[4],
+ dataItem[5],
+ dataItem[6],
+ dataItem[7],
+ dataItem[8],
+ dataItem[9],
+ dataItem[10],
+ dataItem[11],
+ dataItem[12],
+ dataItem[13],
+ dataItem[14],
+ dataItem[15],
+ dataItem[16],
+ dataItem[17]
};
return item;
}
@@ -427,34 +427,34 @@ LocaleDataImpl::getLocaleItem( const Locale& rLocale )
LocaleDataItem2 SAL_CALL
LocaleDataImpl::getLocaleItem2( const Locale& rLocale )
{
- MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getLocaleItem" ));
+ MyFuncOUString_Type func = reinterpret_cast<MyFuncOUString_Type>(getFunctionSymbol( rLocale, "getLocaleItem" ));
if ( func ) {
sal_Int16 dataItemCount = 0;
- sal_Unicode **dataItem = func(dataItemCount);
+ OUString const *dataItem = func(dataItemCount);
assert(dataItemCount >= 18);
LocaleDataItem2 item{
- OUString(dataItem[0]),
- OUString(dataItem[1]),
- OUString(dataItem[2]),
- OUString(dataItem[3]),
- OUString(dataItem[4]),
- OUString(dataItem[5]),
- OUString(dataItem[6]),
- OUString(dataItem[7]),
- OUString(dataItem[8]),
- OUString(dataItem[9]),
- OUString(dataItem[10]),
- OUString(dataItem[11]),
- OUString(dataItem[12]),
- OUString(dataItem[13]),
- OUString(dataItem[14]),
- OUString(dataItem[15]),
- OUString(dataItem[16]),
- OUString(dataItem[17]),
- dataItemCount >= 19 ? OUString(dataItem[18]) : OUString()
+ dataItem[0],
+ dataItem[1],
+ dataItem[2],
+ dataItem[3],
+ dataItem[4],
+ dataItem[5],
+ dataItem[6],
+ dataItem[7],
+ dataItem[8],
+ dataItem[9],
+ dataItem[10],
+ dataItem[11],
+ dataItem[12],
+ dataItem[13],
+ dataItem[14],
+ dataItem[15],
+ dataItem[16],
+ dataItem[17],
+ dataItemCount >= 19 ? dataItem[18] : OUString()
};
return item;
}