builtin.string: optimize split_into_lines (#10081)
parent
d11cd50773
commit
274c817028
|
@ -648,30 +648,26 @@ pub fn (s string) split_nth(delim string, nth int) []string {
|
|||
}
|
||||
|
||||
// split_into_lines splits the string by newline characters.
|
||||
// Both `\n` and `\r\n` newline endings is supported.
|
||||
// newlines are stripped.
|
||||
// Both `\n` and `\r\n` newline endings are supported.
|
||||
[direct_array_access]
|
||||
pub fn (s string) split_into_lines() []string {
|
||||
mut res := []string{}
|
||||
if s.len == 0 {
|
||||
return res
|
||||
}
|
||||
mut start := 0
|
||||
mut end := 0
|
||||
for i := 0; i < s.len; i++ {
|
||||
is_lf := unsafe { s.str[i] } == 10
|
||||
is_crlf := i != s.len - 1 && unsafe { s.str[i] == 13 && s.str[i + 1] == 10 }
|
||||
is_eol := is_lf || is_crlf
|
||||
is_last := if is_crlf { i == s.len - 2 } else { i == s.len - 1 }
|
||||
if is_eol || is_last {
|
||||
if is_last && !is_eol {
|
||||
i++
|
||||
}
|
||||
line := s.substr(start, i)
|
||||
res << line
|
||||
if is_crlf {
|
||||
i++
|
||||
}
|
||||
if s[i] == 10 {
|
||||
end = if i > 0 && s[i - 1] == 13 { i - 1 } else { i }
|
||||
res << if start == end { '' } else { s[start..end] }
|
||||
start = i + 1
|
||||
}
|
||||
}
|
||||
if start < s.len {
|
||||
res << s[start..]
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue