From d25f0e3396034a4cef75b3a1ab284e90da138ece Mon Sep 17 00:00:00 2001 From: Turiiya Date: Mon, 24 Jun 2024 16:42:32 +0200 Subject: [PATCH 1/4] fix --- vlib/builtin/string.v | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/vlib/builtin/string.v b/vlib/builtin/string.v index 2c2c13e7d90836..8d9ec717c59abd 100644 --- a/vlib/builtin/string.v +++ b/vlib/builtin/string.v @@ -2647,26 +2647,38 @@ pub fn (s string) camel_to_snake() string { if s.len == 0 { return '' } - lower_first_char := if s[0] >= `A` && s[0] <= `Z` { s[0] + 32 } else { s[0] } if s.len == 1 { - return lower_first_char.ascii_str() + return s.to_lower() } mut b := unsafe { malloc_noscan(2 * s.len + 1) } - second_char := if s[1] >= `A` && s[1] <= `Z` { `_` } else { s[1] } + mut prev_is_upper := false + first_char, second_char := if s[0] >= `A` && s[0] <= `Z` { + lower_first_c := if s[0] >= `A` && s[0] <= `Z` { s[0] + 32 } else { s[0] } + lower_second_c := if s[1] >= `A` && s[1] <= `Z` { + prev_is_upper = true + s[1] + 32 + } else { + s[1] + } + lower_first_c, lower_second_c + } else { + first_c := s[0] + second_c:= u8(if s[1] >= `A` && s[1] <= `Z` { `_` } else { s[1] }) + first_c, second_c + } unsafe { - b[0] = lower_first_char + b[0] = first_char b[1] = second_char } + mut pos := 2 mut prev_char := second_char - mut prev_is_upper := false mut lower_c := `_` mut c_is_upper := false - mut pos := 1 for i in pos .. s.len { c := s[i] c_is_upper = c >= `A` && c <= `Z` lower_c = if c_is_upper { c + 32 } else { c } - if prev_is_upper == false && c_is_upper { + if !prev_is_upper && c_is_upper { // aB => a_b, if prev has `_`, then do not add `_` unsafe { if b[pos - 1] != `_` { @@ -2674,7 +2686,7 @@ pub fn (s string) camel_to_snake() string { pos++ } } - } else if prev_is_upper && c_is_upper == false && c != `_` { + } else if prev_is_upper && !c_is_upper && c != `_` { // Ba => _ba, if prev has `_`, then do not add `_` unsafe { if b[pos - 2] != `_` { From 7d0d3ac40030ff84cee03d362cdbaabd1e44a7fa Mon Sep 17 00:00:00 2001 From: Turiiya Date: Mon, 24 Jun 2024 16:42:36 +0200 Subject: [PATCH 2/4] test --- vlib/builtin/string_test.v | 1 + 1 file changed, 1 insertion(+) diff --git a/vlib/builtin/string_test.v b/vlib/builtin/string_test.v index 2ab4a6cf73edb0..0ecb67c853bb0f 100644 --- a/vlib/builtin/string_test.v +++ b/vlib/builtin/string_test.v @@ -1528,6 +1528,7 @@ fn test_camel_to_snake() { assert 'aaBbCcDD'.camel_to_snake() == 'aa_bb_cc_dd' assert 'BBaa'.camel_to_snake() == 'b_baa' assert 'aa_BB'.camel_to_snake() == 'aa_bb' + assert 'JVM_PUBLIC_ACC'.camel_to_snake() == 'jvm_public_acc' } fn test_snake_to_camel() { From 9b3a59f0f72b86a86f7a5db77e77e6435720cc54 Mon Sep 17 00:00:00 2001 From: Turiiya Date: Mon, 24 Jun 2024 16:48:43 +0200 Subject: [PATCH 3/4] fmt --- vlib/builtin/string.v | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vlib/builtin/string.v b/vlib/builtin/string.v index 8d9ec717c59abd..272021e0231d1e 100644 --- a/vlib/builtin/string.v +++ b/vlib/builtin/string.v @@ -2662,9 +2662,9 @@ pub fn (s string) camel_to_snake() string { } lower_first_c, lower_second_c } else { - first_c := s[0] - second_c:= u8(if s[1] >= `A` && s[1] <= `Z` { `_` } else { s[1] }) - first_c, second_c + lower_first_c := s[0] + second_c := u8(if s[1] >= `A` && s[1] <= `Z` { `_` } else { s[1] }) + lower_first_c, second_c } unsafe { b[0] = first_char From 69dae0ebabd5b69264f4c92ff8309ee83aec4929 Mon Sep 17 00:00:00 2001 From: Turiiya Date: Mon, 24 Jun 2024 16:56:31 +0200 Subject: [PATCH 4/4] limit rune cast --- vlib/builtin/string.v | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vlib/builtin/string.v b/vlib/builtin/string.v index 272021e0231d1e..4dcb9f6ac93f82 100644 --- a/vlib/builtin/string.v +++ b/vlib/builtin/string.v @@ -2663,7 +2663,7 @@ pub fn (s string) camel_to_snake() string { lower_first_c, lower_second_c } else { lower_first_c := s[0] - second_c := u8(if s[1] >= `A` && s[1] <= `Z` { `_` } else { s[1] }) + second_c := if s[1] >= `A` && s[1] <= `Z` { u8(`_`) } else { s[1] } lower_first_c, second_c } unsafe {