1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 17:47:44 +00:00

LibC: Add strtok_r() and make strtok() a wrapper around it

This commit is contained in:
Andreas Kling 2019-11-10 16:24:52 +01:00
parent 72fae05c07
commit 5951c7ca05
2 changed files with 19 additions and 14 deletions

View file

@ -455,24 +455,22 @@ char* strpbrk(const char* s, const char* accept)
return nullptr; 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 (!str) {
if (!saved_str) if (!saved_str)
return nullptr; return nullptr;
str = saved_str; str = *saved_str;
} }
size_t token_start = 0; size_t token_start = 0;
size_t token_end = 0; size_t token_end = 0;
size_t str_len = strlen(str); size_t str_len = strlen(str);
size_t delim_len = strlen(delim); size_t delim_len = strlen(delim);
for (size_t i = 0; i < str_len; ++i) { for (size_t i = 0; i < str_len; ++i) {
bool is_proper_delim = false; bool is_proper_delim = false;
for (size_t j = 0; j < delim_len; ++j) { for (size_t j = 0; j < delim_len; ++j) {
if (str[i] == delim[j]) { if (str[i] == delim[j]) {
// Skip beginning delimiters // Skip beginning delimiters
@ -480,31 +478,37 @@ char* strtok(char* str, const char* delim)
++token_start; ++token_start;
break; break;
} }
is_proper_delim = true; is_proper_delim = true;
} }
} }
++token_end; ++token_end;
if (is_proper_delim && token_end > 0) { if (is_proper_delim && token_end > 0) {
--token_end; --token_end;
break; break;
} }
} }
if (str[token_start] == '\0') if (str[token_start] == '\0')
return nullptr; return nullptr;
if (token_end == 0) { if (token_end == 0) {
saved_str = nullptr; *saved_str = nullptr;
return &str[token_start]; return &str[token_start];
} }
saved_str = &str[token_end + 1]; *saved_str = &str[token_end + 1];
str[token_end] = '\0'; str[token_end] = '\0';
return &str[token_start]; 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) int strcoll(const char* s1, const char* s2)
{ {
return strcmp(s1, s2); return strcmp(s1, s2);

View file

@ -31,6 +31,7 @@ size_t strcspn(const char*, const char* reject);
char* strerror(int errnum); char* strerror(int errnum);
char* strsignal(int signum); char* strsignal(int signum);
char* strpbrk(const char*, const char* accept); 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); char* strtok(char* str, const char* delim);
int strcoll(const char* s1, const char* s2); int strcoll(const char* s1, const char* s2);
size_t strxfrm(char* dest, const char* src, size_t n); size_t strxfrm(char* dest, const char* src, size_t n);