Browse Source

Merge pull request #2402 from oskarnp/fix-ada-case

Fix strings.to_ada_case()
Jeroen van Rijn 2 years ago
parent
commit
b054585066
1 changed files with 11 additions and 30 deletions
  1. 11 30
      core/strings/conversion.odin

+ 11 - 30
core/strings/conversion.odin

@@ -265,45 +265,26 @@ to_upper_kebab_case :: proc(s: string, allocator := context.allocator) -> string
 	return to_delimiter_case(s, '-', true, allocator)
 }
 
-// converts the `s` string to "Ada_case"
+// converts the `s` string to "Ada_Case"
 to_ada_case :: proc(s: string, allocator := context.allocator) -> string {
-	delimiter :: '_'
-
 	s := s
 	s = trim_space(s)
 	b: Builder
 	builder_init(&b, 0, len(s), allocator)
 	w := to_writer(&b)
 
-	prev, curr: rune
-
-	for next in s {
-		if is_delimiter(curr) {
-			if !is_delimiter(prev) {
-				io.write_rune(w, delimiter)
-			}
-		} else if unicode.is_upper(curr) {
-			if unicode.is_lower(prev) || (unicode.is_upper(prev) && unicode.is_lower(next)) {
-				io.write_rune(w, delimiter)
+	string_case_iterator(w, s, proc(w: io.Writer, prev, curr, next: rune) {
+		if !is_delimiter(curr) {
+			if is_delimiter(prev) || prev == 0 || (unicode.is_lower(prev) && unicode.is_upper(curr)) {
+				if prev != 0 {
+					io.write_rune(w, '_')
+				}
+				io.write_rune(w, unicode.to_upper(curr))
+			} else {
+				io.write_rune(w, unicode.to_lower(curr))
 			}
-			io.write_rune(w, unicode.to_upper(curr))
-		} else if curr != 0 {
-			io.write_rune(w, unicode.to_lower(curr))
-		}
-
-		prev = curr
-		curr = next
-	}
-
-	if len(s) > 0 {
-		if unicode.is_upper(curr) && unicode.is_lower(prev) && prev != 0 {
-			io.write_rune(w, delimiter)
-			io.write_rune(w, unicode.to_upper(curr))
-		} else {
-			io.write_rune(w, unicode.to_lower(curr))
 		}
-	}
+	})
 
 	return to_string(b)
 }
-