diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2023-06-14 11:26:44 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2023-06-14 19:16:29 +0200 |
commit | 7b61cfc01fdac9f7162c674e888ccf129c2433b4 (patch) | |
tree | 9dafb07b5df004573154327a5d0373a7d643fcfc /i18npool | |
parent | 7c2cfc26381dd31ab43e357eea7a3f5e63d3d6f4 (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.cxx | 99 | ||||
-rw-r--r-- | i18npool/source/localedata/LocaleNode.hxx | 3 | ||||
-rw-r--r-- | i18npool/source/localedata/filewriter.cxx | 9 | ||||
-rw-r--r-- | i18npool/source/localedata/localedata.cxx | 82 |
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; } |