Skip to content

Commit

Permalink
LibC: Add strtok_r() and make strtok() a wrapper around it
Browse files Browse the repository at this point in the history
  • Loading branch information
awesomekling committed Nov 10, 2019
1 parent 72fae05 commit 5951c7c
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 14 deletions.
32 changes: 18 additions & 14 deletions Libraries/LibC/string.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -455,56 +455,60 @@ char* strpbrk(const char* s, const char* accept)
return nullptr;
}

char* strtok(char* str, const char* delim)
char* strtok_r(char* str, const char* delim, char** saved_str)
{
static char* saved_str;

if (!str) {
if (!saved_str)
return nullptr;
str = saved_str;
str = *saved_str;
}

size_t token_start = 0;
size_t token_end = 0;
size_t str_len = strlen(str);
size_t delim_len = strlen(delim);

for (size_t i = 0; i < str_len; ++i) {
bool is_proper_delim = false;

for (size_t j = 0; j < delim_len; ++j) {
if (str[i] == delim[j]) {
// Skip beginning delimiters
if (token_end - token_start == 0) {
++token_start;
break;
}

is_proper_delim = true;
}
}

++token_end;
if (is_proper_delim && token_end > 0) {
--token_end;
break;
}
}

if (str[token_start] == '\0')
return nullptr;

if (token_end == 0) {
saved_str = nullptr;
*saved_str = nullptr;
return &str[token_start];
}
saved_str = &str[token_end + 1];

*saved_str = &str[token_end + 1];
str[token_end] = '\0';
return &str[token_start];
}

char* strtok(char* str, const char* delim)
{
static char* saved_str;
return strtok_r(str, delim, &saved_str);
}

int strcoll(const char* s1, const char* s2)
{
return strcmp(s1, s2);
Expand Down
1 change: 1 addition & 0 deletions Libraries/LibC/string.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ size_t strcspn(const char*, const char* reject);
char* strerror(int errnum);
char* strsignal(int signum);
char* strpbrk(const char*, const char* accept);
char* strtok_r(char* str, const char* delim, char** saved_str);
char* strtok(char* str, const char* delim);
int strcoll(const char* s1, const char* s2);
size_t strxfrm(char* dest, const char* src, size_t n);
Expand Down

0 comments on commit 5951c7c

Please sign in to comment.