aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2022-03-25 21:55:43 +0100
committerGitHub <noreply@github.com>2022-03-25 21:55:43 +0100
commit3b6d72bb946fb239c3284b5147df0fdee3ef669b (patch)
tree024df514232ed5f0340b44719caf22be0feb036d
parenta2ad16b609ddb86c410569a6786618173f58257e (diff)
parent9080fa4a9d432b172abbad83b870876631c8eb44 (diff)
Merge pull request #1659 from WalterPlinge/field-iterator
Add fields_iterator procedure
-rw-r--r--core/strings/strings.odin32
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
+}