From f5784306fbe27aab668b373d79ce36641a48bb55 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Thu, 14 Apr 2022 01:45:56 +0100 Subject: [PATCH] Fix conversion of C-string literal to `char*` --- Source/utils/language.cpp | 54 ++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/Source/utils/language.cpp b/Source/utils/language.cpp index 691dd04d3..c243289bc 100644 --- a/Source/utils/language.cpp +++ b/Source/utils/language.cpp @@ -82,6 +82,18 @@ char *StrTrimRight(char *s) return s; } +string_view TrimLeft(string_view str) +{ + str.remove_prefix(std::min(str.find_first_not_of(" \t"), str.size())); + return str; +} + +string_view TrimRight(string_view str) +{ + str.remove_suffix(str.size() - (str.find_last_not_of(" \t") + 1)); + return str; +} + // English, Danish, Spanish, Italian, Swedish int PluralForms = 2; std::function GetLocalPluralId = [](int n) -> int { return n != 1 ? 1 : 0; }; @@ -89,47 +101,41 @@ std::function GetLocalPluralId = [](int n) -> int { return n != 1 ? /** * Match plural=(n != 1);" */ -void SetPluralForm(char *string) +void SetPluralForm(string_view expression) { - char *expression = strstr(string, "plural"); - if (expression == nullptr) - return; - - expression = strstr(expression, "="); - if (expression == nullptr) + const string_view key = "plural="; + const string_view::size_type keyPos = expression.find(key); + if (keyPos == string_view::npos) return; - expression += 1; + expression.remove_prefix(keyPos + key.size()); - for (unsigned i = 0; i < strlen(expression); i++) { - if (expression[i] == ';') { - expression[i] = '\0'; - break; - } + const string_view::size_type semicolonPos = expression.find(';'); + if (semicolonPos != string_view::npos) { + expression.remove_suffix(expression.size() - semicolonPos); } - expression = StrTrimRight(expression); - expression = StrTrimLeft(expression); + expression = TrimLeft(TrimRight(expression)); // ko, zh_CN, zh_TW - if (strcmp(expression, "0") == 0) { + if (expression == "0") { GetLocalPluralId = [](int /*n*/) -> int { return 0; }; return; } // en, bg, da, de, es, it, sv - if (strcmp(expression, "(n != 1)") == 0) { + if (expression == "(n != 1)") { GetLocalPluralId = [](int n) -> int { return n != 1 ? 1 : 0; }; return; } // fr, pt_BR - if (strcmp(expression, "(n > 1)") == 0) { + if (expression == "(n > 1)") { GetLocalPluralId = [](int n) -> int { return n > 1 ? 1 : 0; }; return; } // hr, ru - if (strcmp(expression, "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2)") == 0) { + if (expression == "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2)") { GetLocalPluralId = [](int n) -> int { if (n % 10 == 1 && n % 100 != 11) return 0; @@ -141,7 +147,7 @@ void SetPluralForm(char *string) } // pl - if (strcmp(expression, "(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2)") == 0) { + if (expression == "(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2)") { GetLocalPluralId = [](int n) -> int { if (n == 1) return 0; @@ -153,7 +159,7 @@ void SetPluralForm(char *string) } // ro - if (strcmp(expression, "(n==1 ? 0 : n==0 || (n!=1 && n%100>=1 && n%100<=19) ? 1 : 2)") == 0) { + if (expression == "(n==1 ? 0 : n==0 || (n!=1 && n%100>=1 && n%100<=19) ? 1 : 2)") { GetLocalPluralId = [](int n) -> int { if (n == 1) return 0; @@ -165,7 +171,7 @@ void SetPluralForm(char *string) } // cs - if (strcmp(expression, "(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2") == 0) { + if (expression == "(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2") { GetLocalPluralId = [](int n) -> int { if (n == 1) return 0; @@ -182,9 +188,9 @@ void SetPluralForm(char *string) /** * Parse "nplurals=2;" */ -void ParsePluralForms(char *string) +void ParsePluralForms(const char *string) { - char *value = strstr(string, "nplurals"); + const char *value = strstr(string, "nplurals"); if (value == nullptr) return;