Skip to content

Commit c59325b

Browse files
committed
added test
1 parent ef8c2fd commit c59325b

3 files changed

Lines changed: 98 additions & 1 deletion

File tree

runtime-light/k2-platform/k2-api.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,9 @@ inline struct tm* localtime_r(const time_t* timer, struct tm* result) noexcept {
332332
}
333333

334334
inline int32_t uselocale(int32_t category, std::string_view locale) noexcept {
335+
if (locale == "0") {
336+
return k2::errno_ok;
337+
}
335338
return k2_uselocale(category, locale.data());
336339
}
337340

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,5 @@ inline Optional<string> f$setlocale(int64_t category, const string& locale) noex
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)