Merge "Fix script-related parts of locale resource matching" into nyc-dev

This commit is contained in:
Roozbeh Pournader
2016-03-03 23:45:22 +00:00
committed by Android (Google) Code Review
5 changed files with 38 additions and 34 deletions

View File

@@ -1151,9 +1151,13 @@ struct ResTable_config
uint32_t screenConfig2;
};
// If true, it means that the script of the locale was explicitly provided.
// If false, it means that the script was automatically computed.
bool localeScriptWasProvided;
// If false and localeScript is set, it means that the script of the locale
// was explicitly provided.
//
// If true, it means that localeScript was automatically computed.
// localeScript may still not be set in this case, which means that we
// tried but could not compute a script.
bool localeScriptWasComputed;
void copyFromDeviceNoSwap(const ResTable_config& o);
@@ -1233,7 +1237,7 @@ struct ResTable_config
inline void clearLocale() {
locale = 0;
localeScriptWasProvided = false;
localeScriptWasComputed = false;
memset(localeScript, 0, sizeof(localeScript));
memset(localeVariant, 0, sizeof(localeVariant));
}

View File

@@ -1870,8 +1870,8 @@ void ResTable_config::swapHtoD() {
// The language & region are equal, so compare the scripts and variants.
const char emptyScript[sizeof(l.localeScript)] = {'\0', '\0', '\0', '\0'};
const char *lScript = l.localeScriptWasProvided ? l.localeScript : emptyScript;
const char *rScript = r.localeScriptWasProvided ? r.localeScript : emptyScript;
const char *lScript = l.localeScriptWasComputed ? emptyScript : l.localeScript;
const char *rScript = r.localeScriptWasComputed ? emptyScript : r.localeScript;
int script = memcmp(lScript, rScript, sizeof(l.localeScript));
if (script) {
return script;
@@ -2016,11 +2016,11 @@ int ResTable_config::isLocaleMoreSpecificThan(const ResTable_config& o) const {
// scripts since it seems more useful to do so. We will consider
// "en-US-POSIX" to be more specific than "en-Latn-US".
const int score = (localeScriptWasProvided ? 1 : 0) +
((localeVariant[0] != 0) ? 2 : 0);
const int score = ((localeScript[0] != '\0' && !localeScriptWasComputed) ? 1 : 0) +
((localeVariant[0] != '\0') ? 2 : 0);
const int oScore = (o.localeScriptWasProvided ? 1 : 0) +
((o.localeVariant[0] != 0) ? 2 : 0);
const int oScore = (o.localeScript[0] != '\0' && !o.localeScriptWasComputed ? 1 : 0) +
((o.localeVariant[0] != '\0') ? 2 : 0);
return score - oScore;
@@ -2535,7 +2535,8 @@ bool ResTable_config::match(const ResTable_config& settings) const {
if (settings.localeScript[0] == '\0') { // could not determine the request's script
countriesMustMatch = true;
} else {
if (localeScript[0] == '\0') { // script was not provided, so we try to compute it
if (localeScript[0] == '\0' && !localeScriptWasComputed) {
// script was not provided or computed, so we try to compute it
localeDataComputeScript(computed_script, language, country);
if (computed_script[0] == '\0') { // we could not compute the script
countriesMustMatch = true;
@@ -2684,8 +2685,8 @@ void ResTable_config::appendDirLocale(String8& out) const {
if (!language[0]) {
return;
}
if (!localeScriptWasProvided && !localeVariant[0]) {
const bool scriptWasProvided = localeScript[0] != '\0' && !localeScriptWasComputed;
if (!scriptWasProvided && !localeVariant[0]) {
// Legacy format.
if (out.size() > 0) {
out.append("-");
@@ -2715,7 +2716,7 @@ void ResTable_config::appendDirLocale(String8& out) const {
size_t len = unpackLanguage(buf);
out.append(buf, len);
if (localeScriptWasProvided) {
if (scriptWasProvided) {
out.append("+");
out.append(localeScript, sizeof(localeScript));
}
@@ -2746,7 +2747,7 @@ void ResTable_config::getBcp47Locale(char str[RESTABLE_MAX_LOCALE_LEN]) const {
charsWritten += unpackLanguage(str);
}
if (localeScriptWasProvided) {
if (localeScript[0] && !localeScriptWasComputed) {
if (charsWritten) {
str[charsWritten++] = '-';
}
@@ -2787,7 +2788,6 @@ void ResTable_config::getBcp47Locale(char str[RESTABLE_MAX_LOCALE_LEN]) const {
for (size_t i = 1; i < 4; ++i) {
config->localeScript[i] = tolower(start[i]);
}
config->localeScriptWasProvided = true;
break;
}
case 5:
@@ -2807,7 +2807,6 @@ void ResTable_config::getBcp47Locale(char str[RESTABLE_MAX_LOCALE_LEN]) const {
void ResTable_config::setBcp47Locale(const char* in) {
locale = 0;
localeScriptWasProvided = false;
memset(localeScript, 0, sizeof(localeScript));
memset(localeVariant, 0, sizeof(localeVariant));
@@ -2824,9 +2823,10 @@ void ResTable_config::setBcp47Locale(const char* in) {
const size_t size = in + strlen(in) - start;
assignLocaleComponent(this, start, size);
if (localeScript[0] == '\0') {
localeScriptWasComputed = (localeScript[0] == '\0');
if (localeScriptWasComputed) {
computeScript();
};
}
}
String8 ResTable_config::toString() const {

View File

@@ -125,10 +125,10 @@ TEST(ConfigLocaleTest, packAndUnpack3LetterRegion) {
if (script != NULL) {
memcpy(out->localeScript, script, 4);
out->localeScriptWasProvided = true;
out->localeScriptWasComputed = false;
} else {
out->computeScript();
out->localeScriptWasProvided = false;
out->localeScriptWasComputed = true;
}
if (variant != NULL) {
@@ -182,7 +182,7 @@ TEST(ConfigLocaleTest, setLocale) {
EXPECT_EQ('n', test.language[1]);
EXPECT_EQ('U', test.country[0]);
EXPECT_EQ('S', test.country[1]);
EXPECT_FALSE(test.localeScriptWasProvided);
EXPECT_TRUE(test.localeScriptWasComputed);
EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4));
EXPECT_EQ(0, test.localeVariant[0]);
@@ -203,7 +203,7 @@ TEST(ConfigLocaleTest, setLocale) {
EXPECT_EQ('e', test.language[0]);
EXPECT_EQ('n', test.language[1]);
EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4));
EXPECT_TRUE(test.localeScriptWasProvided);
EXPECT_FALSE(test.localeScriptWasComputed);
memset(out, 1, 4);
test.unpackRegion(out);
EXPECT_EQ('4', out[0]);
@@ -216,7 +216,7 @@ TEST(ConfigLocaleTest, setLocale) {
EXPECT_EQ('d', out[0]);
EXPECT_EQ('e', out[1]);
EXPECT_EQ('\0', out[2]);
EXPECT_FALSE(test.localeScriptWasProvided);
EXPECT_TRUE(test.localeScriptWasComputed);
EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4));
memset(out, 1, 4);
test.unpackRegion(out);
@@ -229,7 +229,7 @@ TEST(ConfigLocaleTest, setLocale) {
EXPECT_EQ('d', out[0]);
EXPECT_EQ('e', out[1]);
EXPECT_EQ('\0', out[2]);
EXPECT_TRUE(test.localeScriptWasProvided);
EXPECT_FALSE(test.localeScriptWasComputed);
EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4));
memset(out, 1, 4);
test.unpackRegion(out);
@@ -270,11 +270,11 @@ TEST(ConfigLocaleTest, getBcp47Locale_script) {
fillIn("en", NULL, "Latn", NULL, &config);
char out[RESTABLE_MAX_LOCALE_LEN];
config.localeScriptWasProvided = true;
config.localeScriptWasComputed = false;
config.getBcp47Locale(out);
EXPECT_EQ(0, strcmp("en-Latn", out));
config.localeScriptWasProvided = false;
config.localeScriptWasComputed = true;
config.getBcp47Locale(out);
EXPECT_EQ(0, strcmp("en", out));
}
@@ -379,7 +379,7 @@ TEST(ConfigLocaleTest, match_emptyScript) {
// emulate packages built with older AAPT
memset(supported.localeScript, '\0', 4);
supported.localeScriptWasProvided = false;
supported.localeScriptWasComputed = false;
EXPECT_TRUE(supported.match(requested));
}

View File

@@ -373,7 +373,7 @@ int AaptLocaleValue::initFromDirName(const Vector<String8>& parts, const int sta
void AaptLocaleValue::initFromResTable(const ResTable_config& config) {
config.unpackLanguage(language);
config.unpackRegion(region);
if (config.localeScriptWasProvided) {
if (config.localeScript[0] && !config.localeScriptWasComputed) {
memcpy(script, config.localeScript, sizeof(config.localeScript));
}
@@ -388,10 +388,10 @@ void AaptLocaleValue::writeTo(ResTable_config* out) const {
if (script[0]) {
memcpy(out->localeScript, script, sizeof(out->localeScript));
out->localeScriptWasProvided = true;
out->localeScriptWasComputed = false;
} else {
out->computeScript();
out->localeScriptWasProvided = false;
out->localeScriptWasComputed = true;
}
if (variant[0]) {

View File

@@ -253,7 +253,7 @@ std::string LocaleValue::toDirName() const {
void LocaleValue::initFromResTable(const ResTable_config& config) {
config.unpackLanguage(language);
config.unpackRegion(region);
if (config.localeScriptWasProvided) {
if (config.localeScript[0] && !config.localeScriptWasComputed) {
memcpy(script, config.localeScript, sizeof(config.localeScript));
}
@@ -268,10 +268,10 @@ void LocaleValue::writeTo(ResTable_config* out) const {
if (script[0]) {
memcpy(out->localeScript, script, sizeof(out->localeScript));
out->localeScriptWasProvided = true;
out->localeScriptWasComputed = false;
} else {
out->computeScript();
out->localeScriptWasProvided = false;
out->localeScriptWasComputed = true;
}
if (variant[0]) {