aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikkel Hjortshøj <fyoucon@gmail.com>2020-05-24 12:52:38 +0200
committerGitHub <noreply@github.com>2020-05-24 12:52:38 +0200
commit732c745bb3a5e4528b5042628cd130d77e1cf5aa (patch)
tree3d45ce084f61458ee4fac0e74a09a46db0beb37a
parentcbfbff7240d7ce649137cede82ccf07b78888179 (diff)
parentc035fc337fdaaa4abacbacb3c2ac1c6466f0d731 (diff)
Merge pull request #655 from ThisDrunkDane/master
Add case conversions by @dotbmp
-rw-r--r--core/strings/strings.odin186
1 files changed, 186 insertions, 0 deletions
diff --git a/core/strings/strings.odin b/core/strings/strings.odin
index fd3808684..83bdbcca4 100644
--- a/core/strings/strings.odin
+++ b/core/strings/strings.odin
@@ -707,6 +707,192 @@ scrub :: proc(s: string, replacement: string, allocator := context.allocator) ->
return to_string(b);
}
+to_snake_case :: proc(str: string, allocator := context.allocator) -> string {
+ buf := make_builder(allocator);
+
+ last_chars: [2]rune;
+ for char, _ in str {
+ switch char {
+ case 'A'..'Z':
+ switch last_chars[1] {
+ case 'a'..'z', '0'..'9':
+ write_rune(&buf, '_');
+ case 'A'..'Z':
+ write_rune(&buf, last_chars[1] + ('a'-'A'));
+ }
+ case 'a'..'z':
+ switch last_chars[1] {
+ case 'A'..'Z':
+ switch last_chars[0] {
+ case 'A'..'Z':
+ write_rune(&buf, '_');
+ }
+ write_rune(&buf, last_chars[1] + ('a'-'A'));
+ case '0'..'9':
+ write_rune(&buf, '_');
+ }
+ write_rune(&buf, char);
+ case '0'..'9':
+ switch last_chars[1] {
+ case 'A'..'Z':
+ write_rune(&buf, last_chars[1] + ('a'-'A'));
+ write_rune(&buf, '_');
+ case 'a'..'z':
+ write_rune(&buf, '_');
+ }
+ write_rune(&buf, char);
+ case '_':
+ switch last_chars[1] {
+ case 'A'..'Z':
+ write_rune(&buf, last_chars[1] + ('a'-'A'));
+ }
+ write_rune(&buf, char);
+ case:
+ unimplemented();
+ }
+
+ last_chars[0] = last_chars[1];
+ last_chars[1] = char;
+ }
+
+ switch last_chars[1] {
+ case 'A'..'Z':
+ write_rune(&buf, last_chars[1] + ('a'-'A'));
+ }
+
+ return to_string(buf);
+}
+
+to_ada_case :: proc(str: string, allocator := context.allocator) -> string {
+ buf := make_builder(allocator);
+
+ last_chars: [2]rune;
+ for char, _ in str {
+ switch char {
+ case 'A'..'Z':
+ switch last_chars[1] {
+ case 'a'..'z', '0'..'9':
+ write_rune(&buf, '_');
+ case 'A'..'Z':
+ switch last_chars[0] {
+ case '_', '\x00':
+ write_rune(&buf, last_chars[1]);
+ case:
+ write_rune(&buf, last_chars[1] + ('a'-'A'));
+ }
+ }
+ case 'a'..'z':
+ switch last_chars[1] {
+ case 'A'..'Z':
+ switch last_chars[0] {
+ case 'A'..'Z':
+ write_rune(&buf, '_');
+ write_rune(&buf, last_chars[1]);
+ case:
+ write_rune(&buf, last_chars[1]);
+ }
+ write_rune(&buf, char);
+ case '0'..'9':
+ write_rune(&buf, '_');
+ write_rune(&buf, char);
+ case 'a'..'z':
+ write_rune(&buf, char);
+ case '_', '\x00':
+ write_rune(&buf, char - ('a'-'A'));
+ }
+ case '0'..'9':
+ switch last_chars[1] {
+ case 'A'..'Z':
+ write_rune(&buf, last_chars[1] + ('a'-'A'));
+ write_rune(&buf, '_');
+ case 'a'..'z':
+ write_rune(&buf, '_');
+ }
+ write_rune(&buf, char);
+ case '_':
+ switch last_chars[1] {
+ case 'A'..'Z':
+ write_rune(&buf, last_chars[1] + ('a'-'A'));
+ }
+ write_rune(&buf, char);
+ case:
+ write_rune(&buf, char);
+ }
+
+ last_chars[0] = last_chars[1];
+ last_chars[1] = char;
+ }
+
+ switch last_chars[1] {
+ case 'A'..'Z':
+ write_rune(&buf, last_chars[1] + ('a'-'A'));
+ }
+
+ return to_string(buf);
+}
+
+to_screaming_snake_case :: proc(str: string, allocator := context.allocator) -> string {
+ buf := make_builder(allocator);
+
+ last_chars: [2]rune;
+ for char, _ in str {
+ switch char {
+ case 'A'..'Z':
+ switch last_chars[1] {
+ case 'a'..'z', '0'..'9':
+ write_rune(&buf, '_');
+ case 'A'..'Z':
+ write_rune(&buf, last_chars[1]);
+ }
+ case 'a'..'z':
+ switch last_chars[1] {
+ case 'A'..'Z':
+ switch last_chars[0] {
+ case 'A'..'Z':
+ write_rune(&buf, '_');
+ write_rune(&buf, last_chars[1]);
+ case:
+ write_rune(&buf, last_chars[1]);
+ }
+ write_rune(&buf, char - ('a'-'A'));
+ case '0'..'9':
+ write_rune(&buf, '_');
+ write_rune(&buf, char - ('a'-'A'));
+ case 'a'..'z':
+ write_rune(&buf, char - ('a'-'A'));
+ case '_', '\x00':
+ write_rune(&buf, char - ('a'-'A'));
+ }
+ case '0'..'9':
+ switch last_chars[1] {
+ case 'A'..'Z':
+ write_rune(&buf, last_chars[1]);
+ write_rune(&buf, '_');
+ case 'a'..'z':
+ write_rune(&buf, '_');
+ }
+ write_rune(&buf, char);
+ case '_':
+ switch last_chars[1] {
+ case 'A'..'Z':
+ write_rune(&buf, last_chars[1]);
+ }
+ write_rune(&buf, char);
+ case:
+ unimplemented();
+ }
+
+ last_chars[0] = last_chars[1];
+ last_chars[1] = char;
+ }
+
+ switch last_chars[1] {
+ case 'A'..'Z':
+ write_rune(&buf, last_chars[1]);
+ }
+
+ return to_string(buf);
+}
reverse :: proc(s: string, allocator := context.allocator) -> string {
str := s;