libluna/CString: Implement strspn and strcspn, and using those implement strtok
This commit is contained in:
parent
6512e9549e
commit
5a9da55e05
@ -13,6 +13,11 @@ extern "C"
|
|||||||
|
|
||||||
int strcmp(const char* a, const char* b);
|
int strcmp(const char* a, const char* b);
|
||||||
|
|
||||||
|
usize strspn(const char* str, const char* accept);
|
||||||
|
usize strcspn(const char* str, const char* reject);
|
||||||
|
|
||||||
|
char* strtok(char* str, const char* delim);
|
||||||
|
|
||||||
usize wcslen(const wchar_t* str);
|
usize wcslen(const wchar_t* str);
|
||||||
|
|
||||||
char* strdup(const char* str);
|
char* strdup(const char* str);
|
||||||
|
@ -136,4 +136,71 @@ extern "C"
|
|||||||
dest[copy_len] = 0;
|
dest[copy_len] = 0;
|
||||||
return src_len;
|
return src_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
usize strcspn(const char* str, const char* reject)
|
||||||
|
{
|
||||||
|
const char* s = str;
|
||||||
|
while (*s)
|
||||||
|
{
|
||||||
|
const char* rp = reject;
|
||||||
|
while (*rp)
|
||||||
|
{
|
||||||
|
if (*s == *rp) return (usize)(s - str);
|
||||||
|
rp++;
|
||||||
|
}
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
return (usize)(s - str);
|
||||||
|
}
|
||||||
|
|
||||||
|
usize strspn(const char* str, const char* accept)
|
||||||
|
{
|
||||||
|
const char* s = str;
|
||||||
|
while (*s)
|
||||||
|
{
|
||||||
|
const char* ap = accept;
|
||||||
|
bool match = false;
|
||||||
|
while (*ap)
|
||||||
|
{
|
||||||
|
if (*s == *ap)
|
||||||
|
{
|
||||||
|
match = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ap++;
|
||||||
|
}
|
||||||
|
if (!match) return (usize)(s - str);
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
return (usize)(s - str);
|
||||||
|
}
|
||||||
|
|
||||||
|
char* strtok(char* str, const char* delim)
|
||||||
|
{
|
||||||
|
static char* s = nullptr;
|
||||||
|
if (str) s = str;
|
||||||
|
if (!s) return nullptr;
|
||||||
|
|
||||||
|
if (*s)
|
||||||
|
{
|
||||||
|
usize skip = strspn(s, delim);
|
||||||
|
s += skip;
|
||||||
|
|
||||||
|
if (*s == 0) return nullptr;
|
||||||
|
|
||||||
|
usize use = strcspn(s, delim);
|
||||||
|
char* result = s;
|
||||||
|
|
||||||
|
if (s[use] != 0)
|
||||||
|
{
|
||||||
|
s[use] = 0;
|
||||||
|
s += (use + 1);
|
||||||
|
}
|
||||||
|
else { s = nullptr; }
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user