diff --git a/compiler/builtins/bitcode/src/lib.rs b/compiler/builtins/bitcode/src/lib.rs index c9d7ad8d77..5ccca80368 100644 --- a/compiler/builtins/bitcode/src/lib.rs +++ b/compiler/builtins/bitcode/src/lib.rs @@ -74,6 +74,35 @@ pub fn count_delimiters_(str: &[u8], delimiter: &[u8]) -> i64 { } } +pub fn measure_next_split_segment_length_(from_index: i64, str: &[u8], delimiter: &[u8]) -> i64 { + let str_len = str.len() as i64; + let delimiter_len = delimiter.len() as i64; + + let mut str_index = from_index; + + while str_index <= (str_len - delimiter_len) { + let mut delimiter_index = 0; + let mut matches_delimiter = true; + + while matches_delimiter && delimiter_index < delimiter_len { + let delimiter_char = delimiter[delimiter_index as usize]; + let str_char = str[(str_index + delimiter_index) as usize]; + + matches_delimiter = delimiter_char == str_char; + + delimiter_index += 1; + } + + if matches_delimiter { + return str_index - from_index; + } else { + str_index += 1; + } + } + + str_len - from_index +} + /// Adapted from Rust's core::num module, by the Rust core team, /// licensed under the Apache License, version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 /// diff --git a/compiler/builtins/bitcode/tests/bitcode_test.rs b/compiler/builtins/bitcode/tests/bitcode_test.rs index 452da09ea5..3491af32fe 100644 --- a/compiler/builtins/bitcode/tests/bitcode_test.rs +++ b/compiler/builtins/bitcode/tests/bitcode_test.rs @@ -3,7 +3,7 @@ extern crate pretty_assertions; #[cfg(test)] mod bitcode { - use roc_builtins_bitcode::count_delimiters_; + use roc_builtins_bitcode::{count_delimiters_, measure_next_split_segment_length_}; #[test] fn count_delimiters() { @@ -20,4 +20,49 @@ mod bitcode { 0 ); } + + #[test] + fn measure_next_split_segment() { + assert_eq!( + measure_next_split_segment_length_( + 0, + (&"de!!!de!!!de").as_bytes(), + (&"!!!").as_bytes() + ), + 2 + ); + + assert_eq!( + measure_next_split_segment_length_( + 5, + (&"de!!!abcde!!!de").as_bytes(), + (&"!!!").as_bytes() + ), + 5 + ); + + assert_eq!( + measure_next_split_segment_length_( + 13, + (&"de!!!abcde!!!de").as_bytes(), + (&"!!!").as_bytes() + ), + 2 + ); + + assert_eq!( + measure_next_split_segment_length_(0, (&"!!!").as_bytes(), (&"!!!").as_bytes()), + 0 + ); + + assert_eq!( + measure_next_split_segment_length_(0, (&"a!!b!!!").as_bytes(), (&"!!!").as_bytes()), + 4 + ); + + assert_eq!( + measure_next_split_segment_length_(0, (&"abcde!!!").as_bytes(), (&"!!!").as_bytes()), + 5 + ); + } }