Skip to content

Commit f483c3a

Browse files
committed
Fix split_floats behavior when spaces are used as separators
1 parent a759867 commit f483c3a

File tree

2 files changed

+82
-50
lines changed

2 files changed

+82
-50
lines changed

core/string/ustring.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1537,13 +1537,16 @@ Vector<double> String::split_floats(const String &p_splitter, bool p_allow_empty
15371537
int from = 0;
15381538
int len = length();
15391539

1540+
String buffer = *this;
15401541
while (true) {
15411542
int end = find(p_splitter, from);
15421543
if (end < 0) {
15431544
end = len;
15441545
}
15451546
if (p_allow_empty || (end > from)) {
1546-
ret.push_back(String::to_float(&get_data()[from]));
1547+
buffer[end] = 0;
1548+
ret.push_back(String::to_float(&buffer.get_data()[from]));
1549+
buffer[end] = _cowdata.get(end);
15471550
}
15481551

15491552
if (end == len) {
@@ -1561,6 +1564,7 @@ Vector<float> String::split_floats_mk(const Vector<String> &p_splitters, bool p_
15611564
int from = 0;
15621565
int len = length();
15631566

1567+
String buffer = *this;
15641568
while (true) {
15651569
int idx;
15661570
int end = findmk(p_splitters, from, &idx);
@@ -1572,7 +1576,9 @@ Vector<float> String::split_floats_mk(const Vector<String> &p_splitters, bool p_
15721576
}
15731577

15741578
if (p_allow_empty || (end > from)) {
1575-
ret.push_back(String::to_float(&get_data()[from]));
1579+
buffer[end] = 0;
1580+
ret.push_back(String::to_float(&buffer.get_data()[from]));
1581+
buffer[end] = _cowdata.get(end);
15761582
}
15771583

15781584
if (end == len) {

tests/core/string/test_string.h

Lines changed: 74 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -638,64 +638,90 @@ TEST_CASE("[String] Ends with") {
638638
}
639639

640640
TEST_CASE("[String] Splitting") {
641-
String s = "Mars,Jupiter,Saturn,Uranus";
642-
const char *slices_l[3] = { "Mars", "Jupiter", "Saturn,Uranus" };
643-
MULTICHECK_SPLIT(s, split, ",", true, 2, slices_l, 3);
644-
645-
const char *slices_r[3] = { "Mars,Jupiter", "Saturn", "Uranus" };
646-
MULTICHECK_SPLIT(s, rsplit, ",", true, 2, slices_r, 3);
647-
648-
s = "test";
649-
const char *slices_3[4] = { "t", "e", "s", "t" };
650-
MULTICHECK_SPLIT(s, split, "", true, 0, slices_3, 4);
651-
652-
s = "";
653-
const char *slices_4[1] = { "" };
654-
MULTICHECK_SPLIT(s, split, "", true, 0, slices_4, 1);
655-
MULTICHECK_SPLIT(s, split, "", false, 0, slices_4, 0);
656-
657-
s = "Mars Jupiter Saturn Uranus";
658-
const char *slices_s[4] = { "Mars", "Jupiter", "Saturn", "Uranus" };
659-
Vector<String> l = s.split_spaces();
660-
for (int i = 0; i < l.size(); i++) {
661-
CHECK(l[i] == slices_s[i]);
641+
{
642+
const String s = "Mars,Jupiter,Saturn,Uranus";
643+
644+
const char *slices_l[3] = { "Mars", "Jupiter", "Saturn,Uranus" };
645+
MULTICHECK_SPLIT(s, split, ",", true, 2, slices_l, 3);
646+
647+
const char *slices_r[3] = { "Mars,Jupiter", "Saturn", "Uranus" };
648+
MULTICHECK_SPLIT(s, rsplit, ",", true, 2, slices_r, 3);
662649
}
663650

664-
s = "1.2;2.3 4.5";
665-
const double slices_d[3] = { 1.2, 2.3, 4.5 };
651+
{
652+
const String s = "test";
653+
const char *slices[4] = { "t", "e", "s", "t" };
654+
MULTICHECK_SPLIT(s, split, "", true, 0, slices, 4);
655+
}
666656

667-
Vector<double> d_arr;
668-
d_arr = s.split_floats(";");
669-
CHECK(d_arr.size() == 2);
670-
for (int i = 0; i < d_arr.size(); i++) {
671-
CHECK(ABS(d_arr[i] - slices_d[i]) <= 0.00001);
657+
{
658+
const String s = "";
659+
const char *slices[1] = { "" };
660+
MULTICHECK_SPLIT(s, split, "", true, 0, slices, 1);
661+
MULTICHECK_SPLIT(s, split, "", false, 0, slices, 0);
672662
}
673663

674-
Vector<String> keys;
675-
keys.push_back(";");
676-
keys.push_back(" ");
677-
678-
Vector<float> f_arr;
679-
f_arr = s.split_floats_mk(keys);
680-
CHECK(f_arr.size() == 3);
681-
for (int i = 0; i < f_arr.size(); i++) {
682-
CHECK(ABS(f_arr[i] - slices_d[i]) <= 0.00001);
664+
{
665+
const String s = "Mars Jupiter Saturn Uranus";
666+
const char *slices[4] = { "Mars", "Jupiter", "Saturn", "Uranus" };
667+
Vector<String> l = s.split_spaces();
668+
for (int i = 0; i < l.size(); i++) {
669+
CHECK(l[i] == slices[i]);
670+
}
683671
}
684672

685-
s = "1;2 4";
686-
const int slices_i[3] = { 1, 2, 4 };
673+
{
674+
const String s = "1.2;2.3 4.5";
675+
const double slices[3] = { 1.2, 2.3, 4.5 };
676+
677+
const Vector<double> d_arr = s.split_floats(";");
678+
CHECK(d_arr.size() == 2);
679+
for (int i = 0; i < d_arr.size(); i++) {
680+
CHECK(ABS(d_arr[i] - slices[i]) <= 0.00001);
681+
}
687682

688-
Vector<int> ii;
689-
ii = s.split_ints(";");
690-
CHECK(ii.size() == 2);
691-
for (int i = 0; i < ii.size(); i++) {
692-
CHECK(ii[i] == slices_i[i]);
683+
const Vector<String> keys = { ";", " " };
684+
const Vector<float> f_arr = s.split_floats_mk(keys);
685+
CHECK(f_arr.size() == 3);
686+
for (int i = 0; i < f_arr.size(); i++) {
687+
CHECK(ABS(f_arr[i] - slices[i]) <= 0.00001);
688+
}
693689
}
694690

695-
ii = s.split_ints_mk(keys);
696-
CHECK(ii.size() == 3);
697-
for (int i = 0; i < ii.size(); i++) {
698-
CHECK(ii[i] == slices_i[i]);
691+
{
692+
const String s = " -2.0 5";
693+
const double slices[10] = { 0, -2, 0, 0, 0, 0, 0, 0, 0, 5 };
694+
695+
const Vector<double> arr = s.split_floats(" ");
696+
CHECK(arr.size() == 10);
697+
for (int i = 0; i < arr.size(); i++) {
698+
CHECK(ABS(arr[i] - slices[i]) <= 0.00001);
699+
}
700+
701+
const Vector<String> keys = { ";", " " };
702+
const Vector<float> mk = s.split_floats_mk(keys);
703+
CHECK(mk.size() == 10);
704+
for (int i = 0; i < mk.size(); i++) {
705+
CHECK(mk[i] == slices[i]);
706+
}
707+
}
708+
709+
{
710+
const String s = "1;2 4";
711+
const int slices[3] = { 1, 2, 4 };
712+
713+
const Vector<int> arr = s.split_ints(";");
714+
CHECK(arr.size() == 2);
715+
for (int i = 0; i < arr.size(); i++) {
716+
CHECK(arr[i] == slices[i]);
717+
}
718+
719+
const Vector<String> keys = { ";", " " };
720+
const Vector<int> mk = s.split_ints_mk(keys);
721+
CHECK(mk.size() == 3);
722+
for (int i = 0; i < mk.size(); i++) {
723+
CHECK(mk[i] == slices[i]);
724+
}
699725
}
700726
}
701727

0 commit comments

Comments
 (0)