diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2022-03-25 21:55:43 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-03-25 21:55:43 +0100 |
| commit | 3b6d72bb946fb239c3284b5147df0fdee3ef669b (patch) | |
| tree | 024df514232ed5f0340b44719caf22be0feb036d | |
| parent | a2ad16b609ddb86c410569a6786618173f58257e (diff) | |
| parent | 9080fa4a9d432b172abbad83b870876631c8eb44 (diff) | |
Merge pull request #1659 from WalterPlinge/field-iterator
Add fields_iterator procedure
| -rw-r--r-- | core/strings/strings.odin | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/core/strings/strings.odin b/core/strings/strings.odin index fe25ad3bf..53d7ea647 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -1365,3 +1365,35 @@ fields_proc :: proc(s: string, f: proc(rune) -> bool, allocator := context.alloc return substrings[:] } + + +// `fields_iterator` returns the first run of characters in `s` that does not contain white space, defined by `unicode.is_space` +// `s` will then start from any space after the substring, or be an empty string if the substring was the remaining characters +fields_iterator :: proc(s: ^string) -> (field: string, ok: bool) { + start, end := -1, -1 + for r, offset in s { + end = offset + if unicode.is_space(r) { + if start >= 0 { + field = s[start : end] + ok = true + s^ = s[end:] + return + } + } else { + if start < 0 { + start = end + } + } + } + + // if either of these are true, the string did not contain any characters + if end < 0 || start < 0 { + return "", false + } + + field = s[:len(s)] + ok = true + s^ = s[len(s):] + return +} |