summaryrefslogtreecommitdiff
path: root/lib/libc/string/strtok_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/string/strtok_r.c')
-rw-r--r--lib/libc/string/strtok_r.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/lib/libc/string/strtok_r.c b/lib/libc/string/strtok_r.c
new file mode 100644
index 00000000..57555b14
--- /dev/null
+++ b/lib/libc/string/strtok_r.c
@@ -0,0 +1,37 @@
+#include <string.h>
+
+char *strtok_r(char *restrict s, const char *restrict sep,
+ char **restrict state)
+{
+ if (s == NULL) {
+ s = *state;
+ }
+
+ if (s == NULL) {
+ return NULL;
+ }
+
+ while (*s && strchr(sep, *s)) {
+ s++;
+ }
+
+ if (*s == '\0') {
+ *state = NULL;
+ return NULL;
+ }
+
+ char *start = s;
+
+ while (*s && strchr(sep, *s) == NULL) {
+ s++;
+ }
+
+ if (*s) {
+ *s = '\0';
+ *state = s + 1;
+ } else {
+ *state = NULL;
+ }
+
+ return start;
+}