mirror of
https://github.com/RGBCube/serenity
synced 2025-07-23 04:17:34 +00:00
LibC: Better strtok implementation (string.h)
This commit is contained in:
parent
a544fded88
commit
437c919dda
1 changed files with 21 additions and 19 deletions
|
@ -467,32 +467,34 @@ char* strtok(char* str, const char* delim)
|
||||||
|
|
||||||
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 delim_len = strlen(delim);
|
||||||
|
|
||||||
for (size_t i = 0; i < strlen(str); ++i) {
|
for (size_t i = 0; i < str_len; ++i) {
|
||||||
bool is_delim = false;
|
bool is_proper_delim = false;
|
||||||
for (size_t j = 0; j < strlen(delim); ++j) {
|
|
||||||
|
for (size_t j = 0; j < delim_len; ++j) {
|
||||||
if (str[i] == delim[j]) {
|
if (str[i] == delim[j]) {
|
||||||
is_delim = true;
|
// Skip beginning delimiters
|
||||||
++token_start;
|
if (token_end - token_start == 0) {
|
||||||
break;
|
++token_start;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
is_proper_delim = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!is_delim) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strlen(&str[token_start]) == 0)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < strlen(delim); ++i) {
|
|
||||||
char* delim_ptr = strchr(&str[token_start], delim[i]);
|
|
||||||
if (!delim_ptr)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
size_t delim_offset = static_cast<size_t>(delim_ptr - str);
|
++token_end;
|
||||||
if (!token_end || token_end > delim_offset)
|
if (is_proper_delim && token_end > 0) {
|
||||||
token_end = delim_offset;
|
--token_end;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (str[token_start] == '\0')
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
if (token_end == 0) {
|
if (token_end == 0) {
|
||||||
saved_str = nullptr;
|
saved_str = nullptr;
|
||||||
return &str[token_start];
|
return &str[token_start];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue