summaryrefslogtreecommitdiff
path: root/lib/libc/string/strtok.c
blob: a2cbb417204f13acd4315f87afeeb9e4447cb668 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "stddef.h" // for NULL

#include <string.h> // for strchr, strtok

char *strtok(char *restrict s, const char *restrict sep)
{
	static _Thread_local char *state = NULL;

	if (s != NULL) {
		state = s;
	}

	if (state == NULL) {
		return NULL;
	}

	char *token = state;
	while (*token && strchr(sep, *token)) {
		token++;
	}

	if (*token == '\0') {
		state = NULL;
		return NULL;
	}

	char *start = token;

	while (*token && strchr(sep, *token) == NULL) {
		token++;
	}

	if (*token) {
		*token = '\0';
		state = token + 1;
	} else {
		state = NULL;
	}

	return start;
}