mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-27 23:14:38 +00:00
Implement strcasecmp, wcslen and wcsrtombs
This commit is contained in:
parent
09e549fdb7
commit
43af65b21e
@ -424,6 +424,97 @@ EXTERNC char *strtok(char *src, const char *delim)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int strcasecmp(const char *s1, const char *s2)
|
||||
{
|
||||
const unsigned char *p1 = (const unsigned char *)s1;
|
||||
const unsigned char *p2 = (const unsigned char *)s2;
|
||||
int result;
|
||||
if (p1 == p2)
|
||||
return 0;
|
||||
while ((result = std::tolower(*p1) - std::tolower(*p2++)) == 0)
|
||||
if (*p1++ == '\0')
|
||||
break;
|
||||
return result;
|
||||
}
|
||||
|
||||
size_t wcslen(const wchar_t *s)
|
||||
{
|
||||
size_t len = 0;
|
||||
|
||||
while (s[len] != L'\0')
|
||||
{
|
||||
if (s[++len] == L'\0')
|
||||
return len;
|
||||
if (s[++len] == L'\0')
|
||||
return len;
|
||||
if (s[++len] == L'\0')
|
||||
return len;
|
||||
++len;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
size_t wcsrtombs(char *dst, const wchar_t **src, size_t len, mbstate_t *ps)
|
||||
{
|
||||
size_t count = 0;
|
||||
|
||||
while (len > 0)
|
||||
{
|
||||
wchar_t wc = **src;
|
||||
if (wc == L'\0')
|
||||
break;
|
||||
|
||||
if (wc < 0x80)
|
||||
{
|
||||
if (dst)
|
||||
*dst++ = (char)wc;
|
||||
count++;
|
||||
len--;
|
||||
}
|
||||
else if (wc < 0x800)
|
||||
{
|
||||
if (dst)
|
||||
{
|
||||
*dst++ = (char)(0xC0 | (wc >> 6));
|
||||
*dst++ = (char)(0x80 | (wc & 0x3F));
|
||||
}
|
||||
count += 2;
|
||||
len -= 2;
|
||||
}
|
||||
else if (wc < 0x10000)
|
||||
{
|
||||
if (dst)
|
||||
{
|
||||
*dst++ = (char)(0xE0 | (wc >> 12));
|
||||
*dst++ = (char)(0x80 | ((wc >> 6) & 0x3F));
|
||||
*dst++ = (char)(0x80 | (wc & 0x3F));
|
||||
}
|
||||
count += 3;
|
||||
len -= 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dst)
|
||||
{
|
||||
*dst++ = (char)(0xF0 | (wc >> 18));
|
||||
*dst++ = (char)(0x80 | ((wc >> 12) & 0x3F));
|
||||
*dst++ = (char)(0x80 | ((wc >> 6) & 0x3F));
|
||||
*dst++ = (char)(0x80 | (wc & 0x3F));
|
||||
}
|
||||
count += 4;
|
||||
len -= 4;
|
||||
}
|
||||
|
||||
(*src)++;
|
||||
}
|
||||
|
||||
if (dst)
|
||||
*dst = '\0';
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
EXTERNC int atoi(const char *String)
|
||||
{
|
||||
uint64_t Length = strlen((char *)String);
|
||||
|
@ -5,6 +5,13 @@
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
typedef struct mbstate_t
|
||||
{
|
||||
int count;
|
||||
unsigned int value;
|
||||
} mbstate_t;
|
||||
|
||||
#define NAN (__builtin_nanf(""))
|
||||
|
||||
int isdigit(int c);
|
||||
@ -71,9 +78,11 @@ extern "C"
|
||||
char *strchr(const char *String, int Char);
|
||||
char *strrchr(const char *String, int Char);
|
||||
int strncasecmp(const char *lhs, const char *rhs, long unsigned int Count);
|
||||
int strcasecmp(const char *lhs, const char *rhs);
|
||||
int strcasecmp(const char *s1, const char *s2);
|
||||
char *strtok(char *src, const char *delim);
|
||||
long int strtol(const char *str, char **endptr, int base);
|
||||
size_t wcslen(const wchar_t *s);
|
||||
size_t wcsrtombs(char *dst, const wchar_t **src, size_t len, mbstate_t *ps);
|
||||
int log2(unsigned int n);
|
||||
|
||||
void *__memcpy_chk(void *dest, const void *src, size_t len, size_t slen);
|
||||
|
@ -152,7 +152,9 @@ typedef __UINTMAX_TYPE__ uintmax_t;
|
||||
|
||||
typedef __PTRDIFF_TYPE__ ptrdiff_t;
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
// typedef __WCHAR_TYPE__ wchar_t;
|
||||
#ifndef __cplusplus
|
||||
typedef __WCHAR_TYPE__ wchar_t;
|
||||
#endif
|
||||
typedef __WINT_TYPE__ wint_t;
|
||||
typedef __SIG_ATOMIC_TYPE__ sig_atomic_t;
|
||||
// TODO: ssize_t
|
||||
|
Loading…
x
Reference in New Issue
Block a user