diff --git a/frameworks/i18n/src/locale_info.cpp b/frameworks/i18n/src/locale_info.cpp index 03c34aeb63d2d5773d6c7f27441ec5db80365e41..69e1776870c1f132e479382bb459a94327ce6d88 100644 --- a/frameworks/i18n/src/locale_info.cpp +++ b/frameworks/i18n/src/locale_info.cpp @@ -21,6 +21,10 @@ using namespace OHOS::I18N; +const std::set LocaleInfo::SCRIPTS = { + "Hans", "Latn", "Hant", "Qaag", "Cyrl", "Deva", "Guru" +}; + void LocaleInfo::Init(const char *newLang, const char *newScript, const char *newRegion, int &status) { id = nullptr; @@ -408,19 +412,7 @@ bool LocaleInfo::IsScript(const char *start, uint8_t length) if (length != SCRIPT_LENGTH || start == nullptr) { return false; } - if (memcmp(start, "Hans", length) == 0) { - return true; - } else if (memcmp(start, "Latn", length) == 0) { - return true; - } else if (memcmp(start, "Hant", length) == 0) { - return true; - } else if (memcmp(start, "Qaag", length) == 0) { - return true; - } else if (memcmp(start, "Cyrl", length) == 0) { - return true; - } else if (memcmp(start, "Deva", length) == 0) { - return true; - } else if (memcmp(start, "Guru", length) == 0) { + if (SCRIPTS.find(std::string(start, length)) != SCRIPTS.end()) { return true; } else { return false; diff --git a/frameworks/i18n/src/measure_format_impl.cpp b/frameworks/i18n/src/measure_format_impl.cpp index 51910cfd146e28ab3dcbc80574b240f33411d24d..23328b240fbde314b196018595c7691a8aeadb06 100644 --- a/frameworks/i18n/src/measure_format_impl.cpp +++ b/frameworks/i18n/src/measure_format_impl.cpp @@ -26,13 +26,13 @@ MeasureFormatImpl::MeasureFormatImpl(LocaleInfo &localeinfo, I18nStatus &status) return; } locale = localeinfo; - pluralFormat = new PluralFormat(localeinfo, status); + pluralFormat = new (std::nothrow) PluralFormat(localeinfo, status); if (status != I18nStatus::ISUCCESS || pluralFormat == nullptr) { status = I18nStatus::IERROR; return; } int numberFormatStatus = 0; - numberFormat = new NumberFormat(localeinfo, numberFormatStatus); + numberFormat = new (std::nothrow) NumberFormat(localeinfo, numberFormatStatus); if (numberFormatStatus || numberFormat == nullptr) { status = I18nStatus::IERROR; return; @@ -201,6 +201,7 @@ bool MeasureFormatImpl::InitMeasureFormat(std::string &unprocessedMeasureData) Split(unprocessedMeasureData, items, itemCount, PLURAL_SEP); // items[1] is unit list, such as h|min|kcal|time... if (!ParseUnits(items[1])) { + delete[] items; return false; } // items[2] is pattern @@ -213,6 +214,7 @@ bool MeasureFormatImpl::InitMeasureFormat(std::string &unprocessedMeasureData) } formattedUnitCount = unitCount * MEASURE_FORMAT_TYPE_NUM; if (!AllocaFormattedUnits()) { + delete[] items; return false; } int itemStartIndex = MEASURE_BASE_ITEM_COUNT; diff --git a/frameworks/i18n/src/number_data.cpp b/frameworks/i18n/src/number_data.cpp index 743672ad57387f1ba16938c6c8b69203875a170c..2a26e26bd3f7b61ebc771763b2569db423fff9af 100644 --- a/frameworks/i18n/src/number_data.cpp +++ b/frameworks/i18n/src/number_data.cpp @@ -65,7 +65,7 @@ void NumberData::SetNumSystem(std::string *numSym, const int numSize) return; } ArrayCopy(nativeNums, NUM_SIZE, numSym, numSize); - if (!(numSym[0]).empty() && ((numSym[0]).at(0) != '0')) { + if (!(numSym[0]).empty() && (numSym[0][0] != '0')) { isNative = true; } } diff --git a/frameworks/i18n/src/number_format_impl.cpp b/frameworks/i18n/src/number_format_impl.cpp index 0c13a0cca8c8879b28b08a47a7d2ff935a56e21c..4e8a13751dbe37bc3766b575a96bfc06c6c79955 100644 --- a/frameworks/i18n/src/number_format_impl.cpp +++ b/frameworks/i18n/src/number_format_impl.cpp @@ -96,7 +96,7 @@ bool NumberFormatImpl::Init(const DataResource &resource) adjust = std::string(origin, 0, size - 3); // strip the last 3 chars } const char *percentPat = adjust.c_str(); - defaultData = new(std::nothrow) NumberData(pat, percentPat, decSign, groupSign, perSign); + defaultData = new (std::nothrow) NumberData(pat, percentPat, decSign, groupSign, perSign); if (defaultData == nullptr) { return false; } @@ -397,7 +397,7 @@ bool NumberFormatImpl::SetMaxDecimalLength(int length) defaultData->SetMinDecimalLength(adjustValue); } maxDecimalLength = adjustValue; - defaultData->SetMaxDecimalLength(length); + defaultData->SetMaxDecimalLength(adjustValue); defaultData->UpdateNumberFormat(); return true; } diff --git a/interfaces/kits/i18n/include/locale_info.h b/interfaces/kits/i18n/include/locale_info.h index 109baa043904dd0fc425b601fbdf42759ded75a5..ec8d8a0fea210dd99b61763fb60edb5cf1f2e0ba 100644 --- a/interfaces/kits/i18n/include/locale_info.h +++ b/interfaces/kits/i18n/include/locale_info.h @@ -44,6 +44,8 @@ */ #include +#include +#include #include "types.h" namespace OHOS { @@ -211,6 +213,7 @@ private: void SetFail(); void Init(const char *lang, const char *script, const char *region, int &status); const int CHAR_OFF = 48; + static const std::set SCRIPTS; static constexpr uint16_t OPT_LANG = 0x0001; static constexpr uint16_t OPT_SCRIPT = 0x0002; static constexpr uint16_t OPT_REGION = 0x0004;