mirror of
https://gitlab.com/sortix/sortix.git
synced 2023-02-13 20:55:38 -05:00
Added strtok(3), strtok_r(3), strspn(3), strcspn(3).
This commit is contained in:
parent
9064185bd8
commit
4806f25e50
3 changed files with 67 additions and 5 deletions
|
@ -38,10 +38,14 @@ void* memcpy(void* restrict, const void* restrict, size_t);
|
|||
void* memset(void*, int, size_t);
|
||||
char* strcat(char* restrict, const char* restrict);
|
||||
int strcmp(const char*, const char*);
|
||||
size_t strcspn(const char*, const char*);
|
||||
char* strcpy(char* restrict, const char* restrict);
|
||||
char* strerror(int);
|
||||
size_t strlen(const char*);
|
||||
int strncmp(const char*, const char*, size_t);
|
||||
size_t strspn(const char*, const char*);
|
||||
char* strtok(char* restrict, const char* restrict);
|
||||
char* strtok_r(char* restrict, const char* restrict, char** restrict);
|
||||
|
||||
/* TODO: These are not implemented in libmaxsi/sortix yet. */
|
||||
#ifndef SORTIX_UNIMPLEMENTED
|
||||
|
@ -53,7 +57,6 @@ char* stpncpy(char* restrict, const char* restrict, size_t);
|
|||
char* strchr(const char*, int);
|
||||
int strcoll(const char*, const char*);
|
||||
int strcoll_l(const char*, const char*, locale_t);
|
||||
size_t strcspn(const char*, const char*);
|
||||
char* strdup(const char*);
|
||||
char* strerror_l(int, locale_t);
|
||||
int strerror_r(int, char*, size_t);
|
||||
|
@ -64,10 +67,7 @@ size_t strnlen(const char*, size_t);
|
|||
char* strpbrk(const char*, const char*);
|
||||
char* strrchr(const char*, int);
|
||||
char* strsignal(int);
|
||||
size_t strspn(const char*, const char*);
|
||||
char* strstr(const char*, const char*);
|
||||
char* strtok(char* restrict, const char* restrict);
|
||||
char* strtok_r(char* restrict, const char* restrict, char** restrict);
|
||||
size_t strxfrm(char* restrict, const char* restrict, size_t);
|
||||
size_t strxfrm_l(char* restrict, const char* restrict, size_t, locale_t);
|
||||
#endif
|
||||
|
|
|
@ -29,13 +29,18 @@ namespace Maxsi
|
|||
{
|
||||
namespace String
|
||||
{
|
||||
const char ASCII_ESCAPE = 27;
|
||||
// TODO: Remove this once. Use \e instead.
|
||||
const char ASCII_ESCAPE = 27;
|
||||
|
||||
size_t Length(const char* String);
|
||||
size_t Accept(const char* str, const char* accept);
|
||||
size_t Reject(const char* str, const char* reject);
|
||||
char* Clone(const char* Source);
|
||||
char* Combine(size_t NumParameters, ...);
|
||||
char* Copy(char* Dest, const char* Src);
|
||||
char* Cat(char* Dest, const char* Src);
|
||||
char* Tokenize(char* str, const char* delim);
|
||||
char* TokenizeR(char* str, const char* delim, char** saveptr);
|
||||
int Compare(const char* A, const char* B);
|
||||
int CompareN(const char* A, const char* B, size_t MaxLength);
|
||||
bool StartsWith(const char* Haystack, const char* Needle);
|
||||
|
|
|
@ -98,6 +98,63 @@ namespace Maxsi
|
|||
return 0;
|
||||
}
|
||||
|
||||
DUAL_FUNCTION(size_t, strspn, Accept, (const char* str, const char* accept))
|
||||
{
|
||||
size_t acceptlen = 0;
|
||||
while ( accept[acceptlen] ) { acceptlen++; }
|
||||
for ( size_t result = 0; true; result++ )
|
||||
{
|
||||
char c = str[result];
|
||||
if ( !c ) { return result; }
|
||||
bool matches = false;
|
||||
for ( size_t i = 0; i < acceptlen; i++ )
|
||||
{
|
||||
if ( str[result] != accept[i] ) { continue; }
|
||||
matches = true;
|
||||
break;
|
||||
}
|
||||
if ( !matches ) { return result; }
|
||||
}
|
||||
}
|
||||
|
||||
DUAL_FUNCTION(size_t, strcspn, Reject, (const char* str, const char* reject))
|
||||
{
|
||||
size_t rejectlen = 0;
|
||||
while ( reject[rejectlen] ) { rejectlen++; }
|
||||
for ( size_t result = 0; true; result++ )
|
||||
{
|
||||
char c = str[result];
|
||||
if ( !c ) { return result; }
|
||||
bool matches = false;
|
||||
for ( size_t i = 0; i < rejectlen; i++ )
|
||||
{
|
||||
if ( str[result] != reject[i] ) { continue; }
|
||||
matches = true;
|
||||
break;
|
||||
}
|
||||
if ( matches ) { return result; }
|
||||
}
|
||||
}
|
||||
|
||||
DUAL_FUNCTION(char*, strtok_r, TokenizeR, (char* str, const char* delim, char** saveptr))
|
||||
{
|
||||
if ( !str && !*saveptr ) { return NULL; }
|
||||
if ( !str ) { str = *saveptr; }
|
||||
str += Accept(str, delim); // Skip leading
|
||||
if ( !*str ) { return NULL; }
|
||||
size_t amount = Reject(str, delim);
|
||||
if ( str[amount] ) { *saveptr = str + amount + 1; }
|
||||
else { *saveptr = NULL; }
|
||||
str[amount] = '\0';
|
||||
return str;
|
||||
}
|
||||
|
||||
DUAL_FUNCTION(char*, strtok, TokenizeR, (char* str, const char* delim))
|
||||
{
|
||||
static char* lasttokensaveptr = NULL;
|
||||
return TokenizeR(str, delim, &lasttokensaveptr);
|
||||
}
|
||||
|
||||
bool StartsWith(const char* haystack, const char* needle)
|
||||
{
|
||||
return CompareN(haystack, needle, Length(needle)) == 0;
|
||||
|
|
Loading…
Add table
Reference in a new issue