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:
parent
72fae05c07
commit
5951c7ca05
2 changed files with 19 additions and 14 deletions
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue