Skip to content

Commit 0f5df98

Browse files
authored
[k2] add test for setlocale + minor changes to setlocale (#1585)
1 parent 995f51d commit 0f5df98

2 files changed

Lines changed: 96 additions & 2 deletions

File tree

runtime-light/stdlib/string/string-functions.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ inline string f$prepare_search_query(const string& query) noexcept {
1717

1818
inline Optional<string> f$setlocale(int64_t category, const string& locale) noexcept {
1919
const int32_t i32category{static_cast<int32_t>(category)};
20-
if (k2::uselocale(i32category, {locale.c_str(), locale.size()}) != k2::errno_ok) {
20+
if (const std::string_view sv_locale{locale.c_str(), locale.size()}; sv_locale != "0" && k2::uselocale(i32category, sv_locale) != k2::errno_ok) {
2121
return false;
2222
}
2323
const auto opt_locale_name{k2::current_locale_name(i32category)};
2424
if (!opt_locale_name.has_value()) [[unlikely]] {
2525
return false;
2626
}
27-
return opt_locale_name->data();
27+
return string{opt_locale_name->data(), static_cast<string::size_type>(opt_locale_name->size())};
2828
}

tests/phpt/dl/1048_setlocale.php

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
@ok
2+
<?php
3+
4+
function setlocale_zero() {
5+
var_dump("setlocale_zero");
6+
7+
var_dump("LC_CTYPE 0 -> " . setlocale(LC_CTYPE, "0"));
8+
var_dump("LC_NUMERIC 0 -> " . setlocale(LC_NUMERIC, "0"));
9+
var_dump("LC_TIME 0 -> " . setlocale(LC_TIME, "0"));
10+
var_dump("LC_COLLATE 0 -> " . setlocale(LC_COLLATE, "0"));
11+
var_dump("LC_MONETARY 0 -> " . setlocale(LC_MONETARY, "0"));
12+
var_dump("LC_ALL 0 -> " . setlocale(LC_ALL, "0"));
13+
}
14+
15+
function setlocale_return_empty() {
16+
var_dump("setlocale_empty");
17+
18+
var_dump("LC_CTYPE \"\" -> " . setlocale(LC_CTYPE, ""));
19+
var_dump("LC_NUMERIC \"\" -> " . setlocale(LC_NUMERIC, ""));
20+
var_dump("LC_TIME \"\" -> " . setlocale(LC_TIME, ""));
21+
var_dump("LC_COLLATE \"\" -> " . setlocale(LC_COLLATE, ""));
22+
var_dump("LC_MONETARY \"\" -> " . setlocale(LC_MONETARY, ""));
23+
var_dump("LC_ALL \"\" -> " . setlocale(LC_ALL, ""));
24+
25+
var_dump("check other (1)");
26+
setlocale_zero();
27+
}
28+
29+
function setlocale_return_set_ru_RU_CP1251() {
30+
var_dump("setlocale_set_ru_RU_CP1251");
31+
32+
var_dump("LC_ALL \"\" -> " . setlocale(LC_ALL, "")); // unset all
33+
34+
var_dump("LC_CTYPE ru_RU.CP1251 -> " . setlocale(LC_CTYPE, "ru_RU.CP1251"));
35+
var_dump("LC_CTYPE 0 -> " . setlocale(LC_CTYPE, "0"));
36+
37+
var_dump("LC_NUMERIC ru_RU.CP1251 -> " . setlocale(LC_NUMERIC, "ru_RU.CP1251"));
38+
var_dump("LC_NUMERIC 0 -> " . setlocale(LC_NUMERIC, "0"));
39+
40+
var_dump("LC_TIME ru_RU.CP1251 -> " . setlocale(LC_TIME, "ru_RU.CP1251"));
41+
var_dump("LC_TIME 0 -> " . setlocale(LC_TIME, "0"));
42+
43+
var_dump("LC_COLLATE ru_RU.CP1251 -> " . setlocale(LC_COLLATE, "ru_RU.CP1251"));
44+
var_dump("LC_COLLATE 0 -> " . setlocale(LC_COLLATE, "0"));
45+
46+
var_dump("LC_MONETARY ru_RU.CP1251 -> " . setlocale(LC_MONETARY, "ru_RU.CP1251"));
47+
var_dump("LC_MONETARY 0 -> " . setlocale(LC_MONETARY, "0"));
48+
49+
var_dump("LC_ALL 0 -> " . setlocale(LC_ALL, "0"));
50+
51+
var_dump("LC_ALL \"\" -> " . setlocale(LC_ALL, "")); // unset all
52+
53+
var_dump("check other (2)");
54+
setlocale_zero();
55+
56+
var_dump("LC_ALL ru_RU.CP1251 -> " . setlocale(LC_ALL, "ru_RU.CP1251"));
57+
58+
var_dump("check other (3)");
59+
setlocale_zero();
60+
61+
var_dump("LC_ALL \"\" -> " . setlocale(LC_ALL, "")); // unset all
62+
}
63+
64+
function setlocale_return_correct_LC_ALL_changes() {
65+
var_dump("setlocale_correct_LC_ALL_changes");
66+
67+
var_dump("LC_ALL en_US.UTF-8 -> " . setlocale(LC_ALL, "en_US.UTF-8"));
68+
var_dump("LC_ALL 0 -> " . setlocale(LC_ALL, "0"));
69+
70+
var_dump("LC_COLLATE ru_RU.CP1251 -> " . setlocale(LC_COLLATE, "ru_RU.CP1251"));
71+
var_dump("LC_ALL 0 -> " . setlocale(LC_ALL, "0"));
72+
73+
var_dump("LC_COLLATE en_US.UTF-8 -> " . setlocale(LC_COLLATE, "en_US.UTF-8"));
74+
var_dump("LC_ALL 0 -> " . setlocale(LC_ALL, "0"));
75+
}
76+
77+
78+
function setlocale_numeric_cp1251() {
79+
function printf_numeric() {
80+
printf("%.2f\n", 1234.56);
81+
}
82+
83+
var_dump("setlocale_numeric_cp1251");
84+
setlocale(LC_NUMERIC, 'ru_RU.CP1251');
85+
printf_numeric();
86+
setlocale(LC_NUMERIC, 'C');
87+
printf_numeric();
88+
}
89+
90+
91+
setlocale_return_empty();
92+
setlocale_return_set_ru_RU_CP1251();
93+
setlocale_return_correct_LC_ALL_changes();
94+
setlocale_numeric_cp1251();

0 commit comments

Comments
 (0)